Anagrams/Deranged anagrams: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(13 intermediate revisions by 12 users not shown)
Line 5:
By analogy with [[Permutations/Derangements|derangements]] we define a ''deranged anagram'' as two words with the same characters, but in which the same character does ''not'' appear in the same position in both words.
 
;Task
{{task heading}}
 
Use the word list at [http://wiki.puzzlers.org/pub/wordlists/unixdict.txt unixdict] to find and display the longest deranged anagram.
 
 
{{task heading|;Related tasks}}
* [[Permutations/Derangements]]
* [[Best_shuffle|Best shuffle]]
Line 22:
=={{header|11l}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="11l">F is_not_deranged(s1, s2)
L(i) 0 .< s1.len
I s1[i] == s2[i]
Line 31:
V count = 0
L(word) File(‘unixdict.txt’).read().split("\n")
V a = sorted(word).join(‘’)
I a !C anagram
anagram[a] = [word]
Line 44:
L(ana) anagram.values()
I ana.len > 1 & ana[0].len == count
print(ana)</langsyntaxhighlight>
{{out}}
<pre>[excitation, intoxicate]</pre>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits <br> or android 64 bits with application Termux }}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program anaderan64.s */
Line 518 ⟶ 519:
.include "../includeARM64.inc"
 
</syntaxhighlight>
</lang>
<pre>
Program 64 bits start.
Line 525 ⟶ 526:
=={{header|Ada}}==
{{Works with|Ada 2005}}
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Generic_Array_Sort;
with Ada.Containers.Indefinite_Vectors;
Line 569 ⟶ 570:
Close (File);
Put_Line (Vect.Element (p1) & " " & Vect.Element (p2));
end Danagrams;</langsyntaxhighlight>
{{out}}
<pre>intoxicate excitation</pre>
Line 575 ⟶ 576:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}} Uses the "read" PRAGMA of Algol 68 G to include the associative array code from the [[Associative_array/Iteration]] task.
<langsyntaxhighlight lang="algol68"># find the largest deranged anagrams in a list of words #
# use the associative array in the Associate array/iteration task #
PR read "aArray.a68" PR
Line 698 ⟶ 699:
)
)
FI</langsyntaxhighlight>
{{out}}
<pre>
Line 705 ⟶ 706:
 
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">use AppleScript version "2.3.1" -- OS X 10.9 (Mavericks) or later.
use sorter : script ¬
"Custom Iterative Ternary Merge Sort" -- <www.macscripter.net/t/timsort-and-nigsort/71383/3>
use scripting additions
 
on join(lst, delim)
This can now return all the co-longest deranged anagrams when there are more than one. However it turns out that unixdict.txt only contains one. :)
set astid to AppleScript's text item delimiters
 
set AppleScript's text item delimiters to delim
<lang applescript>use AppleScript version "2.3.1" -- OS X 10.9 (Mavericks) or later — for these 'use' commands!
set txt to lst as text
-- Uses the customisable AppleScript-coded sort shown at <https://macscripter.net/viewtopic.php?pid=194430#p194430>.
set AppleScript's text item delimiters to astid
-- It's assumed scripters will know how and where to install it as a library.
return txt
use sorter : script "Custom Iterative Ternary Merge Sort"
end join
use scripting additions
 
on longestDerangedAnagrams(listOfWords)
script o
property wordList : listOfWords
property doctoredWordsgroupingTexts : {}wordList's items
property hitLengthderangementLength : 0
property output : {}
-- Test for any deranged pairs amongst the words of an anagram group.
on testPairs(a, b)
set anagramGroup to my wordList's items a thru b of my wordList
set groupCountgroupSize to b - a + 1
set wordLength to (count beginning of anagramGroup)
repeat with i from 1 to (groupCountgroupSize - 1)
set w1 to anagramGroup's item i of anagramGroup
repeat with j from (i + 1) to groupCountgroupSize
set w2 to anagramGroup's item j of anagramGroup
set areDeranged to true
repeat with c from 1 to wordLength
if (w1's character c of= w1 =w2's character c of w2) then
set areDeranged to false
exit repeat
end if
end repeat
-- Append any deranged pairs found to the output list and note theirthe wordwords' length.
if (areDeranged) then
set end of my output to {w1, w2}
set hitLengthderangementLength to wordLength
end if
end repeat
end repeat
end testPairs
-- Custom comparison handler for the sort. Text a should go after text b if
-- it's the same length and has a greater lexical value or it's shorter than b.
-- (The lexical sort direction isn't really relevant. It's just to group equal texts.)
on isGreater(a, b)
set aLen to a's length
set bLen to b's length
if (aLen = bLen) then return (a > b) -- or (b < a)!
return (aLen < bLen)
end isGreater
end script
set wordCount to (count o's wordList)
ignoring case
-- BuildReplace anotherthe listwords containing doctored versions ofin the inputgroupingTexts wordslist with theirsorted-character characters lexically sortedversions.
setrepeat astidwith toi AppleScript'sfrom text1 itemto delimiterswordCount
set AppleScriptchrs to o's textgroupingTexts's item delimiters toi's ""characters
tell sorter to sort(chrs, 1, -1, {})
repeat with thisWord in o's wordList
set theseCharso's to thisWordgroupingTexts's charactersitem i to join(chrs, "")
-- A straight ascending in-place sort here.
tell sorter to sort(theseChars, 1, -1, {}) -- Params: (list, start index, end index, customisation spec.).
set end of o's doctoredWords to theseChars as text
end repeat
set-- AppleScript'sSort the list descending by text itemlength and ascending delimiters(say) toby astidvalue
-- within lengths. Echo the moves in the original word list.
tell sorter to sort(o's groupingTexts, 1, wordCount, {comparer:o, slave:{o's wordList}})
-- Sort the list of doctored words into descending order by length and ascending order by value within
-- each length, rearranging the original-word list in parallel to maintain the index correspondence.
script descendingByLengthAscendingByValue
on isGreater(a, b)
set lenA to (count a)
set lenB to (count b)
if (lenA = lenB) then return (a > b)
return (lenB > lenA)
end isGreater
end script
tell sorter to sort(o's doctoredWords, 1, -1, {comparer:descendingByLengthAscendingByValue, slave:{o's wordList}})
-- LocateWork eachthrough runthe runs of equalgrouping doctoredtexts, wordsstarting and testwith the corresponding originals for derangedlongest pairstexts.
set i to 1
set currentText to beginning of o's doctoredWordsgroupingTexts
repeat with j from 2 to (count o's doctoredWordswordCount)
set thisText to item j of o's doctoredWordsgroupingTexts's item j
if (thisText is not currentText) then
if (j - i > 1) then tell o to testPairs(i, j - 1)
Line 781 ⟶ 784:
set i to j
end if
-- Stop on reaching a wordtext that's shorter than the longestany derangement(s) found.
if ((count thisText) < o's hitLengthderangementLength) then exit repeat
end repeat
if (j > i) then tell o to testPairs(i, j)
Line 790 ⟶ 793:
end longestDerangedAnagrams
 
-- The closing values of AppleScript 'run handler' variables not explicity declared local are
-- saved back to the script file afterwards — and "unixdict.txt" contains 25,104 words!
local wordFile, wordList
set wordFile to ((path to desktop as text) & "www.rosettacode.org:unixdict.txt") as «class furl»
-- The words in "unixdict.txt" are arranged one per line in alphabetical order.
-- Some contain punctuation characters, so they're best extracted as 'paragraphs' rather than as 'words'.
set wordFile to ((path to desktop as text) & "unixdict.txt") as «class furl»
set wordList to paragraphs of (read wordFile as «class utf8»)
return longestDerangedAnagrams(wordList)</langsyntaxhighlight>
 
{{output}}
<langsyntaxhighlight lang="applescript">{{"excitation", "intoxicate"}}</langsyntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program anaderan.s */
Line 1,229:
/***************************************************/
.include "../affichage.inc"
</syntaxhighlight>
</lang>
<pre>
Program 32 bits start.
Line 1,236:
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">isDeranged?: function [p][
[a,b]: p
loop 0..dec size a 'i [
Line 1,269:
]
 
print maxDeranged</langsyntaxhighlight>
 
{{out}}
Line 1,276:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight Autohotkeylang="autohotkey">Time := A_TickCount
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetBatchLines -1
Line 1,331:
}
old1 := no_let1, old2 := A_Loopfield
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,339:
{{works with|GNU awk (gawk) 3.1.5}}
 
<langsyntaxhighlight lang="awk">#!/bin/gawk -f
BEGIN{
FS=""
Line 1,397:
if (length(found) > 0) exit
}
}</langsyntaxhighlight>
On my system, this awk-file is located at /usr/local/bin/deranged,
so it can be invoked with:
Line 1,405:
 
Regular invocation would be:
<langsyntaxhighlight lang="sh">gawk -f deranged.awk /tmp/unixdict.txt</langsyntaxhighlight>
{{out}}
<pre>
Line 1,411:
</pre>
 
=={{header|BaConBASIC}}==
==={{header|BaCon}}===
<lang freebasic>DECLARE idx$ ASSOC STRING
<syntaxhighlight lang="freebasic">DECLARE idx$ ASSOC STRING
 
FUNCTION Deranged(a$, b$)
Line 1,440 ⟶ 1,441:
PRINT "Maximum deranged anagrams: ", an1$, " and ", an2$
 
PRINT NL$, "Total time: ", TIMER, " msecs.", NL$</langsyntaxhighlight>
{{out}}
<pre>
Line 1,448 ⟶ 1,449:
</pre>
 
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> INSTALL @lib$+"SORTLIB"
Sort% = FN_sortinit(0,0)
Line 1,502 ⟶ 1,503:
$$^a&(0) = A$
CALL Sort%, a&(0)
= $$^a&(0)</langsyntaxhighlight>
{{out}}
<pre>
Line 1,528 ⟶ 1,529:
Bracmat shuffles each new factor into place to keep the growing product normalized before continuing with the next word from the list.
The result is exactly the same, but the running time becomes much longer.
<langsyntaxhighlight lang="bracmat"> get$("unixdict.txt",STR):?wordList
& 1:?product
& :?unsorted
Line 1,590 ⟶ 1,591:
* ?
| out$!derangedAnagrams
);</langsyntaxhighlight>
{{out}}
<pre>excitation.intoxicate</pre>
 
=={{header|C}}==
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 1,704 ⟶ 1,705:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,716 ⟶ 1,717:
{{libheader|System.IO}}
{{works with|C sharp|6}}
<langsyntaxhighlight lang="csharp">public static void Main()
{
var lookupTable = File.ReadLines("unixdict.txt").ToLookup(line => AnagramKey(line));
Line 1,735 ⟶ 1,736:
&& Enumerable.Range(0, first.Length).All(i => first[i] != second[i])
select new [] { first, second })
.FirstOrDefault();</langsyntaxhighlight>
{{out}}
<pre>
Line 1,742 ⟶ 1,743:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <fstream>
#include <functional>
Line 1,791 ⟶ 1,792:
std::cout << result.first << ' ' << result.second << '\n';
return EXIT_SUCCESS;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,798 ⟶ 1,799:
 
=={{header|Clojure}}==
<langsyntaxhighlight Clojurelang="clojure">(->> (slurp "unixdict.txt") ; words
(re-seq #"\w+") ; |
(group-by sort) ; anagrams
Line 1,806 ⟶ 1,807:
(sort-by #(count (first %)))
last
prn)</langsyntaxhighlight>
{{out}}
<pre>$ lein exec deranged.clj
Line 1,812 ⟶ 1,813:
 
=={{header|COBOL}}==
{{Works with|X/Open COBOL}}
<lang cobol>
<syntaxhighlight lang="cobolfree">******************************************************************
* COBOL solution to Anagrams Deranged challange
* The program was run on OpenCobolIDE
* Input data is stored in file 'Anagrams.txt' on my PC
******************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. DERANGED.
 
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO 'C:\Both\Rosetta\Anagrams.txt'
ORGANIZATION IS LINE SEQUENTIAL.
 
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-RECORD PIC X(22).
 
WORKING-STORAGE SECTION.
01 SWITCHES.
05 WS-EOF PIC X VALUE 'N'.
05 WS-FND PIC X VALUE 'N'.
05 WS-EXIT PIC X VALUE 'N'.
 
01 01 COUNTERS.
05 WS-TOT-RECS PIC 9(5) USAGE COMPPACKED-3 DECIMAL VALUE 0.
05 WS-SEL-RECS PIC 9(5) USAGE COMPPACKED-3 DECIMAL VALUE 0.
05 WT-REC-NBR PIC 9(5) USAGE COMPPACKED-3 DECIMAL VALUE 0.
 
* Extra byte to guarentee a space at end - needed in sort logic.
01 01 WS-WORD-TEMP PIC X(23).
01 01 FILLER REDEFINES WS-WORD-TEMP.
05 WS-LETTER OCCURS 23 TIMES PIC X.
77 WS-LETTER-HLD PIC X.
 
77 WS-WORD-IN PIC X(22).
77 WS-WORD-KEY PIC X(22).
 
01 01 WS-WORD-TABLE.
05 WT-RECORD OCCURS 0 to 24000 TIMES
DEPENDING ON WT-REC-NBR
DESCENDING KEY IS WT-WORD-LEN
INDEXED BY WT-IDX.
10 WT-WORD-KEY PIC X(22).
10 WT-WORD-LEN PIC 9(2).
10 WT-ANAGRAM-CNT PIC 9(5) COMPUSAGE PACKED-3DECIMAL.
10 WT-ANAGRAMS OCCURS 6 TIMES.
15 WT-ANAGRAM PIC X(22).
 
01 01 WS-WORD-TEMP1 PIC X(22).
01 01 FILLER REDEFINES WS-WORD-TEMP1.
05 WS-LETTER1 05 WS-LETTER1 PIC X OCCURS 22 TIMES PIC X.
 
01 01 WS-WORD-TEMP2 PIC X(22).
01 01 FILLER REDEFINES WS-WORD-TEMP2.
05 WS-LETTER2 OCCURS 22 TIMES PIC X.
 
77 WS-I PIC 999999(5) USAGE COMPPACKED-3DECIMAL.
77 WS-J PIC 999999(5) USAGE COMPPACKED-3DECIMAL.
77 WS-K PIC 999999(5) USAGE COMPPACKED-3DECIMAL.
77 WS-L PIC 999999(5) USAGE COMPPACKED-3DECIMAL.
77 WS-BEG PIC 999999(5) USAGE COMPPACKED-3DECIMAL.
77 WS-MAX PIC 999999(5) USAGE COMPPACKED-3DECIMAL.
 
PROCEDURE DIVISION.
000-MAIN.
PERFORM 100-INITIALIZE.
PERFORM 200-PROCESS-RECORD UNTIL WS-EOF = 'Y'.
SORT WT-RECORD ON DESCENDING KEY WT-WORD-LEN.
UNTIL WS-EOF = 'Y'.
PERFORM 500-FIND-DERANGED.
SORT WT-RECORD ON DESCENDING KEY WT-WORD-LEN.
PERFORM 500-FIND900-DERANGEDTERMINATE.
STOP RUN.
PERFORM 900-TERMINATE.
STOP RUN.
 
100-INITIALIZE.
OPEN INPUT IN-FILE.
PERFORM 150-READ-RECORD.
 
150-READ-RECORD.
READ IN-FILE INTO WS-WORD-IN
AT END
MOVE 'Y' TO WS-EOF
NOT AT END
COMPUTE WS-TOT-RECS = WS-TOT-RECS + 1
END-READ.
 
200-PROCESS-RECORD.
IF WS-WORD-IN IS ALPHABETIC
COMPUTE WS-SEL-RECS = WS-SEL-RECS + 1 END-COMPUTE
MOVE WS-WORD-IN TO WS-WORD-TEMP
PERFORM 300-SORT-WORD
MOVE WS-WORD-TEMP TO WS-WORD-KEY
PERFORM 400-ADD-TO-TABLE
END-IF.
PERFORM 150-READ-RECORD.
 
* bubble sort:
PERFORM 150-READ-RECORD.
300-SORT-WORD.
PERFORM VARYING WS-MAX FROM 1 BY 1
UNTIL WS-LETTER(WS-MAX) = SPACE
END-PERFORM.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I = WS-MAX
PERFORM VARYING WS-J FROM WS-I BY 1
UNTIL WS-J > WS-MAX - 1
IF WS-LETTER(WS-J) < WS-LETTER(WS-I) THEN
MOVE WS-LETTER(WS-I) TO WS-LETTER-HLD
MOVE WS-LETTER(WS-J) TO WS-LETTER(WS-I)
MOVE WS-LETTER-HLD TO WS-LETTER(WS-J)
END-IF
END-PERFORM
END-PERFORM.
 
400-ADD-TO-TABLE.
* bubble sort:
SET WT-IDX TO 300-SORT-WORD1.
SEARCH WT-RECORD
PERFORM VARYING WS-MAX FROM 1 BY 1
AT END
UNTIL WS-LETTER(WS-MAX) = SPACE
END- PERFORM. 420-ADD-RECORD
WHEN WT-WORD-KEY(WT-IDX) = WS-WORD-KEY
PERFORM 440-UPDATE-RECORD
END-SEARCH.
 
420-ADD-RECORD.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I = WS-MAX
ADD 1 To WT-REC-NBR.
PERFORM VARYING WS-J FROM WS-I BY 1
MOVE WS-WORD-KEY TO WT-WORD-KEY(WT-REC-NBR).
UNTIL WS-J > WS-MAX - 1
COMPUTE WT-WORD-LEN(WT-REC-NBR) = WS-MAX - 1 END-COMPUTE.
IF WS-LETTER(WS-J) < WS-LETTER(WS-I) THEN
MOVE 1 TO WT-ANAGRAM-CNT(WT-REC-NBR).
MOVE WS-LETTER(WS-I) TO WS-LETTER-HLD
MOVE WS-LETTER(WSWORD-J) IN TO WS-LETTER(WS-I)
WT-ANAGRAM(WT-REC-NBR, WT-ANAGRAM-CNT(WT-REC-NBR)).
MOVE WS-LETTER-HLD TO WS-LETTER(WS-J)
END-IF
END-PERFORM
END-PERFORM.
 
440-UPDATE-RECORD.
400-ADD-TO-TABLE.
ADD 1 SETTO WT-ANAGRAM-CNT(WT-IDX TO 1).
MOVE WS-WORD-IN TO
SEARCH WT-RECORD
WT-ANAGRAM(WT-IDX, WT-ANAGRAM-CNT(WT-IDX)).
AT END
PERFORM 420-ADD-RECORD
WHEN WT-WORD-KEY(WT-IDX) = WS-WORD-KEY
PERFORM 440-UPDATE-RECORD
END-SEARCH.
 
500-FIND-DERANGED.
420-ADD-RECORD.
PERFORM VARYING WS-I FROM 1 ADDBY 1 To WT-REC-NBR.
MOVEUNTIL WS-WORD-KEYI TO> WT-WORD-KEY(WT-REC-NBR). OR WS-FND = 'Y'
PERFORM VARYING COMPUTE WTWS-WORD-LEN(WT-REC-NBR)J =FROM WS-MAX1 -BY 1.
UNTIL MOVEWS-J 1 TO> WT-ANAGRAM-CNT(WTWS-REC-NBRI). - 1 OR WS-FND = 'Y'
MOVE COMPUTE WS-WORDBEG = WS-INJ TO+ 1 END-COMPUTE
PERFORM VARYING WS-K FROM WS-BEG BY 1
WT-ANAGRAM(WT-REC-NBR, WT-ANAGRAM-CNT(WT-REC-NBR)).
UNTIL WS-K > WT-ANAGRAM-CNT(WS-I) OR WS-FND = 'Y'
MOVE WT-ANAGRAM(WS-I, WS-J) TO WS-WORD-TEMP1
MOVE WT-ANAGRAM(WS-I, WS-K) To WS-WORD-TEMP2
PERFORM 650-CHECK-DERANGED
END-PERFORM
END-PERFORM
END-PERFORM.
 
650-CHECK-DERANGED.
440-UPDATE-RECORD.
MOVE ADD 1'N' TO WT-ANAGRAM-CNT(WTWS-IDX)EXIT.
PERFORM VARYING WS-L FROM 1 BY 1
MOVE WS-WORD-IN TO
UNTIL WS-L > WT-ANAGRAMWORD-LEN(WTWS-IDX,I) WTOR WS-ANAGRAM-CNT(WT-IDX)).EXIT = 'Y'
IF WS-LETTER1(WS-L) = WS-LETTER2(WS-L)
MOVE 'Y' TO WS-EXIT
END-IF
END-PERFORM.
IF WS-EXIT = 'N'
DISPLAY
WS-WORD-TEMP1(1:WT-WORD-LEN(WS-I)) ' ' WS-WORD-TEMP2
END-DISPLAY
MOVE 'Y' TO WS-FND
END-IF.
 
900-TERMINATE.
500-FIND-DERANGED.
DISPLAY 'RECORDS READ: ' WS-TOT-RECS.
PERFORM VARYING WS-I FROM 1 BY 1
DISPLAY 'RECORDS SELECTED ' WS-SEL-RECS.
UNTIL WS-I > WT-REC-NBR OR WS-FND = 'Y'
DISPLAY 'RECORD KEYS: ' WT-REC-NBR.
PERFORM VARYING WS-J FROM 1 BY 1
CLOSE IN-FILE.
UNTIL WS-J > WT-ANAGRAM-CNT(WS-I) - 1 OR WS-FND = 'Y'
COMPUTE WS-BEG = WS-J + 1
PERFORM VARYING WS-K FROM WS-BEG BY 1
UNTIL WS-K > WT-ANAGRAM-CNT(WS-I) OR WS-FND = 'Y'
MOVE WT-ANAGRAM(WS-I, WS-J) TO WS-WORD-TEMP1
MOVE WT-ANAGRAM(WS-I, WS-K) To WS-WORD-TEMP2
PERFORM 650-CHECK-DERANGED
END-PERFORM
END-PERFORM
END-PERFORM.
 
END PROGRAM 650-CHECK-DERANGED.
MOVE 'N' TO WS-EXIT.
PERFORM VARYING WS-L FROM 1 BY 1
UNTIL WS-L > WT-WORD-LEN(WS-I) OR WS-EXIT = 'Y'
IF WS-LETTER1(WS-L) = WS-LETTER2(WS-L)
MOVE 'Y' TO WS-EXIT
END-PERFORM.
IF WS-EXIT = 'N'
DISPLAY WS-WORD-TEMP1(1:WT-WORD-LEN(WS-I))
' '
WS-WORD-TEMP2
MOVE 'Y' TO WS-FND
END-IF.
 
*> OUTPUT:
900-TERMINATE.
DISPLAY 'RECORDS READ: ' WS-TOT-RECS.
DISPLAY 'RECORDS SELECTED ' WS-SEL-RECS.
DISPLAY 'RECORD KEYS: ' WT-REC-NBR.
CLOSE IN-FILE.
 
*> *> excitation OUTPUT:intoxicate
*> RECORDS READ: 25104
*> RECORDS SELECTED 24978
*> RECORD KEYS: 23441
 
*> BUBBLE SORT REFERENCE:
*> excitation intoxicate
*> https://mainframegeek.wordpress.com/tag/bubble-sort-in-cobol
*> RECORDS READ: 25104
</syntaxhighlight>
*> RECORDS SELECTED 24978
*> RECORD KEYS: 23441
 
*> BUBBLE SORT REFERENCE:
*> https://mainframegeek.wordpress.com/tag/bubble-sort-in-cobol
</lang>
 
=={{header|CoffeeScript}}==
This example was tested with node.js.
<langsyntaxhighlight lang="coffeescript">http = require 'http'
 
is_derangement = (word1, word2) ->
Line 2,036 ⟶ 2,037:
req.end()
get_word_list show_longest_derangement</langsyntaxhighlight>
{{out}}
<pre>
Line 2,044 ⟶ 2,045:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun read-words (file)
(with-open-file (stream file)
(loop with w = "" while w collect (setf w (read-line stream nil)))))
Line 2,063 ⟶ 2,064:
(setf (gethash ws h) (cons w l))))))
 
(format t "~{~A~%~^~}" (longest-deranged "unixdict.txt"))</langsyntaxhighlight>
{{out}}
<pre>intoxicate
Line 2,070 ⟶ 2,071:
=={{header|D}}==
===Short Version===
<langsyntaxhighlight lang="d">void main() {
import std.stdio, std.file, std.algorithm, std.string, std.array;
 
Line 2,084 ⟶ 2,085:
.minPos!q{ a[0].length > b[0].length }[0]
.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>Tuple!(string, string)("intoxicate", "excitation")</pre>
Line 2,090 ⟶ 2,091:
 
Using const(ubytes)[] instead of dstrings gives a runtime of about 0.07 seconds:
<langsyntaxhighlight lang="d"> string[][ubyte[]] anags;
foreach (const w; "unixdict.txt".readText.split)
anags[w.dup.representation.sort().release.assumeUnique] ~= w;</langsyntaxhighlight>
 
===Faster Version===
<langsyntaxhighlight lang="d">import std.stdio, std.file, std.algorithm, std.string, std.array,
std.functional, std.exception;
 
Line 2,124 ⟶ 2,125:
return writefln("Longest deranged: %-(%s %)", pairs.front);
}
}</langsyntaxhighlight>
{{out}}
<pre>Longest deranged: excitation intoxicate</pre>
Line 2,132 ⟶ 2,133:
{{libheader| System.Classes}}
{{libheader| System.Diagnostics}}
<langsyntaxhighlight Delphilang="delphi">program Anagrams_Deranged;
 
{$APPTYPE CONSOLE}
Line 2,236 ⟶ 2,237:
Dict.Free;
Readln;
end.</langsyntaxhighlight>
 
{{out}}
Line 2,249 ⟶ 2,250:
=={{header|EchoLisp}}==
For a change, we use the french dictionary included in EchoLisp package.
<langsyntaxhighlight lang="scheme">(lib 'hash)
(lib 'struct)
(lib 'sql)
Line 2,280 ⟶ 2,281:
(write lmin) (for-each write lw)
(writeln)))
</syntaxhighlight>
</lang>
{{out}}
<langsyntaxhighlight lang="scheme">
(lib 'dico.fr.no-accent) ;; 209315 words into *words* table
(task)
Line 2,304 ⟶ 2,305:
14 charlatanistic antarchistical
15 megachiropteran cinematographer
17 misconstitutional constitutionalism</langsyntaxhighlight>
 
=={{header|Eiffel}}==
<langsyntaxhighlight Eiffellang="eiffel">class
ANAGRAMS_DERANGED
 
Line 2,430 ⟶ 2,431:
words: HASH_TABLE [LINKED_LIST [STRING], STRING]
 
end</langsyntaxhighlight>
{{out}}
<pre>
Line 2,439 ⟶ 2,440:
=={{header|Elixir}}==
{{trans|Ruby}}
<langsyntaxhighlight lang="elixir">defmodule Anagrams do
def deranged(fname) do
File.read!(fname)
Line 2,468 ⟶ 2,469:
{_, words} -> IO.puts "Longest derangement anagram: #{inspect words}"
_ -> IO.puts "derangement anagram: nothing"
end</langsyntaxhighlight>
 
{{out}}
Line 2,477 ⟶ 2,478:
=={{header|Erlang}}==
Using anagrams:fetch/2 from [[Anagrams]] and init_http/0 from [[Rosetta_Code/Find_unimplemented_tasks]]. Exporting words_from_url/1 to [[Ordered_words]].
<langsyntaxhighlight Erlanglang="erlang">-module( anagrams_deranged ).
-export( [task/0, words_from_url/1] ).
 
Line 2,516 ⟶ 2,517:
lists:all( fun is_deranged_char/1, lists:zip(Word1, Word2) ).
 
is_deranged_char( {One, Two} ) -> One =/= Two.</langsyntaxhighlight>
{{out}}
<pre>
Line 2,524 ⟶ 2,525:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">open System;
 
let keyIsSortedWord = Seq.sort >> Seq.toArray >> String
Line 2,549 ⟶ 2,550:
|> snd
|> printfn "%A"
0</langsyntaxhighlight>
{{out}}
<pre>[("excitation", "intoxicate")]</pre>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: assocs fry io.encodings.utf8 io.files kernel math
math.combinatorics sequences sorting strings ;
IN: rosettacode.deranged-anagrams
Line 2,577 ⟶ 2,578:
 
: longest-deranged-anagrams ( path -- anagrams )
deranged-anagrams [ first length ] sort-with last ;</langsyntaxhighlight>
 
"unixdict.txt" longest-deranged-anagrams .
Line 2,583 ⟶ 2,584:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Type IndexedWord
Line 2,717 ⟶ 2,718:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 2,728 ⟶ 2,729:
Took 0.089 seconds on i3 @ 2.13 GHz
</pre>
 
=={{header|FutureBasic}}==
While there is nothing time sensitive about this task, fast code is often efficient code. Several of the entries in this category show their computation times. This FutureBasic entry is designed to outrace them all.
 
The other entries examined have started by sorting the letters in each word. Here we take a different approach by creating an "avatar" for each word. All anagrams of a word have the same avatar—-without any sorting. Here's how it works:<br>
An 8-byte variable can hold a lot of information. We create a 64-bit avatar that starts at the high end with 8 bits for the length of the word, so that longer words will be sorted first. The remaining 56 bits contain 2-bit fields for each letter of the alphabet. A 2-bit field can record from 0 to 3 occurrences of the letter, but even if there were 4 or more occurrences (think "Mississippi"), bleeding into the next field, the only matching avatar would still be an exact anagram. Here's how the bits would be set for the word "Anagrams":
<syntaxhighlight lang="future basic">
Anagrams
length ZzYyXx WwVvUuTt SsRrQqPp OoNnMmLl KkJjIiHh GgFfEeDd CcBbAa
00001000 00000000 00000000 01010000 00010100 00000000 01000000 00001100
</syntaxhighlight>
 
Bit shifts and 8-byte comparisons are fast operations, which contribute to the speed. As each avatar is generated, it is saved, along with the offset to its word, and an index to it inserted in a sorted list, guaranteeing that longest words occur first, and all matching anagrams are adjacent.
 
When words have the same avatars, they are anagrams, but for this task we still need to check for letters occurring in the same location in both words. That is a quick check that only has to be done for otherwise qualified candidates.
 
On a 1.2 GHz Quad-Core Intel Core i7 MacBook Pro, this code runs in ~6 ms, which is several times faster than times claimed by other entries. In that time, it finds not just the longest, but all 486 deranged anagrams in unixdict.txt. (Yes, there is an option to view all of them.)
 
FWIW, this code can easily be amended to show all 1800+ anagram pairs.
<syntaxhighlight lang="future basic">
#plist NSAppTransportSecurity @{NSAllowsArbitraryLoads:YES}
defstr long
begin globals
xref xwords( 210000 ) as char
long gAvatars( 26000 )
uint32 gwordNum, gfilen, gcount = 0, gOffset( 26000 )
uint16 gndx( 26000 ), deranged( 600, 1 )
long sh : sh = system( _scrnHeight ) -100
long sw : sw = (system( _scrnWidth ) -360 ) / 2
CFTimeInterval t
_len = 56
end globals
 
local fn loadDictionary
CFURLRef url = fn URLWithString( @"http://wiki.puzzlers.org/pub/wordlists/unixdict.txt" )
CFStringRef dictStr = fn StringWithContentsOfURL( url, NSUTF8StringEncoding, NULL )
dictStr = fn StringByAppendingString( @" ", dictStr )
xwords = fn StringUTF8String( dictstr )
gfilen = len(dictstr)
end fn
 
local fn deranagrams
uint64 ch, p, wordStart = 0
long avatar = 0
uint32 med, bot, top
byte chk, L
for p = 1 to gfilen
ch = xwords(p) //build avatar
if ch > _" " then avatar += (long) 1 << ( ch and 31 ) * 2: continue
avatar += (long)(p - wordStart - 1) << _len //complete avatar by adding word length
gAvatars(gWordNum) = avatar //store the avatar in list
gOffset( gWordNum) = wordStart //store offset to the word
//Insert into ordered list of avatars
bot = 0 : top = gwordNum //quick search for place to insert
while (top - bot) > 1
med = ( top + bot ) >> 1
if avatar > gAvatars(gndx(med)) then bot = med else top = med
wend
blockmove( @gndx( top ), @gndx( top + 1 ), ( gwordNum - top ) * 2 )
gndx(top) = gWordNum
gwordNum++ : wordStart = p : avatar = 0 //ready for new word
next p
//Check for matching avatars
for p = gWordNum to 1 step -1
chk = 1 //to make sure each word is compared with all matching avatars
while gAvatars( gndx( p ) ) == gAvatars( gndx( p - chk ) )
// found anagram; now check for chars in same position
L = ( gAvatars( gndx( p ) ) >> _len ) //get word length
while L
if xwords(gOffset(gndx(p)) +L) == xwords(gOffset(gndx(p-chk)) +L) then break
L--
wend
if L == 0
//no matching chars: found Deranged Anagram!
deranged( gcount, 0 ) = gndx( p )
deranged( gcount, 1 ) = gndx( p - chk )
gcount++
end if
chk++
wend
next
end fn
 
local fn printPair( ndx as uint32, chrsToCntr as byte )
ptr p : str255 pair : pair = ""
short n = ( gAvatars( deranged( ndx, 0 ) ) >> _len )
if n < chrsToCntr then print string$( chrsToCntr - n, " " );
p = xwords + gOffset( deranged( ndx, 0 ) )
p.0`` = n : print p.0$; " ";
p = xwords + gOffset( deranged( ndx, 1 ) )
p.0`` = n : print p.0$
end fn
 
local fn doDialog(evt as long)
if evt == _btnclick
long r
button -1 : window 1,,(sw,50,335,sh-50)
for r = 1 to gcount-1
fn printPair( r, 21 )
next
end if
end fn
 
fn loadDictionary : t = fn CACurrentMediaTime
fn deranagrams : t = fn CACurrentMediaTime - t
 
window 1, @"Deranged Anagrams in FutureBasic",(sw,sh-130,335,130)
printf @"\n %u deranged anagrams found among \n %u words ¬
in %.2f ms.\n", gcount, gWordNum, t * 1000
print " Longest:";: fn printPair( 0, 11 )
button 1,,,fn StringWithFormat(@"Show remaining %u deranged anagrams.",gcount-1),(24,20,285,34)
on dialog fn doDialog
handleevents
</syntaxhighlight>
{{out}}
[[File:FB output for Deranged Anagrams.png]]
 
=={{header|GAP}}==
Using function [[Anagrams#GAP|Anagrams]].
<langsyntaxhighlight lang="gap">IsDeranged := function(a, b)
local i, n;
for i in [1 .. Size(a)] do
Line 2,760 ⟶ 2,884:
n := Maximum(List(a, x -> Size(x[1])));
Filtered(a, x -> Size(x[1]) = n);
# [ [ "excitation", "intoxicate" ] ]</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
import (
"fmt"
Line 2,814 ⟶ 2,938:
 
fmt.Println(w1, w2, ": Length", best_len)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,822 ⟶ 2,946:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def map = new TreeMap<Integer,Map<String,List<String>>>()
 
new URL('http://www.puzzlers.org/pub/wordlists/unixdict.txt').eachLine { word ->
Line 2,850 ⟶ 2,974:
} else {
println 'Deranged anagrams are a MYTH!'
}</langsyntaxhighlight>
 
{{out}}
Line 2,857 ⟶ 2,981:
=={{header|Haskell}}==
If the longest deranged anagram includes three or more words we'll only print two of them. We also correctly handle duplicate words in the input.
<langsyntaxhighlight lang="haskell">{-# LANGUAGE TupleSections #-}
 
import Data.List (maximumBy, sort, unfoldr)
Line 2,900 ⟶ 3,024:
case maxDerangedAnagram $ words input of
Nothing -> putStrLn "No deranged anagrams were found."
Just (a, b) -> putStrLn $ "Longest deranged anagrams: " <> a <> " and " <> b</langsyntaxhighlight>
{{out}}
<pre>Longest deranged anagrams: excitation and intoxicate</pre>
 
and a variant:
<syntaxhighlight lang="haskell">import Control.Monad ((<=<))
import Data.Function (on)
import Data.List (find, groupBy, sort, sortOn)
import Data.Ord (Down (Down))
 
-------------------- DERANGED ANAGRAMS -------------------
 
longestDeranged :: [String] -> String
longestDeranged xs =
case find deranged (longestAnagramPairs xs) of
Nothing -> "No deranged anagrams found."
Just (a, b) -> a <> " -> " <> b
 
deranged :: (String, String) -> Bool
deranged (a, b) = and (zipWith (/=) a b)
 
longestAnagramPairs :: [String] -> [(String, String)]
longestAnagramPairs = ((<*>) =<< fmap (,)) <=<
(sortOn (Down . length . head) . anagramGroups)
 
anagramGroups :: [String] -> [[String]]
anagramGroups xs =
groupBy
(on (==) fst)
(sortOn fst (((,) =<< sort) <$> xs))
>>= (\g -> [snd <$> g | 1 < length g])
 
 
--------------------------- TEST -------------------------
main :: IO ()
main =
readFile "unixdict.txt"
>>= (putStrLn . longestDeranged . lines)</syntaxhighlight>
{{Out}}
<pre>excitation -> intoxicate</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
This solution (which works in both languages) does a strict interpretation of the problem and ignores the fact that there may be multiple derangements that are the same length (including ignoring multiple derangements arising from the same set of words that are all anagrams).
<langsyntaxhighlight lang="unicon">link strings # for csort() procedure
 
procedure main()
Line 2,931 ⟶ 3,092:
every i := 1 to *s1 do if s1[i] == s2[i] then fail
return [s1,s2]
end</langsyntaxhighlight>
{{out|Sample run}}
<pre>->dra <unixdict.txt
Line 2,939 ⟶ 3,100:
=={{header|J}}==
This assumes that [http://www.puzzlers.org/pub/wordlists/unixdict.txt unixdict.txt] has been saved in the current directory.
<langsyntaxhighlight lang="j"> #words=: 'b' freads 'unixdict.txt'
25104
#anagrams=: (#~ 1 < #@>) (</.~ /:~&>) words
Line 2,952 ⟶ 3,113:
││excitation│intoxicate││
│└──────────┴──────────┘│
└───────────────────────┘</langsyntaxhighlight>
Note that anagram sets with more than two members might, hypothetically, have made things more complicated. By lucky coincidence, this was not an issue. We could have taken advantage of that coincidence to achieve slight further simplifications. Perhaps <code>maybederanged=: (#~ (-: ~."1)@|:@:>&>) anagrams</code>
 
Line 2,959 ⟶ 3,120:
=={{header|Java}}==
{{works with|Java|8}}
<langsyntaxhighlight lang="java">import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
Line 3,005 ⟶ 3,166:
return true;
}
}</langsyntaxhighlight>
{{out}}
<pre>excitation intoxicate</pre>
Line 3,017 ⟶ 3,178:
brevity.
 
<langsyntaxhighlight JavaScriptlang="javascript">#!/usr/bin/env js
 
function main() {
Line 3,091 ⟶ 3,252:
}
 
main();</langsyntaxhighlight>
 
{{out}}
Line 3,098 ⟶ 3,259:
=== Gecko ===
Word file is saved locally because browser won't fetch it cross-site. Tested on Gecko.
<langsyntaxhighlight lang="javascript"><html><head><title>Intoxication</title></head>
<body><pre id='x'></pre>
<script type="application/javascript">
Line 3,142 ⟶ 3,303:
 
show(best_pair);
</script></body></html></langsyntaxhighlight>
 
{{Out|Output (in a browser window)}}
Line 3,152 ⟶ 3,313:
This solution allows for the possibility of more than one answer.
 
<langsyntaxhighlight lang="jq"># Input: an array of strings
# Output: a stream of arrays
def anagrams:
Line 3,183 ⟶ 3,344:
else .
end) ) )
| unique</langsyntaxhighlight>
 
'''Invocation and output'''
Line 3,191 ⟶ 3,352:
=={{header|Julia}}==
 
<langsyntaxhighlight lang="julia">using Base.isless
# Let's define the less than operator for any two vectors that have the same type:
# This does lexicographic comparison, we use it on vectors of chars in this task.
Line 3,233 ⟶ 3,394:
break
end
end</langsyntaxhighlight>
 
{{out}}
Line 3,239 ⟶ 3,400:
 
=={{header|K}}==
<langsyntaxhighlight Klang="k"> / anagram clusters
a:{x g@&1<#:'g:={x@<x}'x}@0:"unixdict.txt";
Line 3,245 ⟶ 3,406:
b@&c=|/c:{#x[0]}'b:a@&{0=+//{x=y}':x}'a
("excitation"
"intoxicate")</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
import java.io.BufferedReader
Line 3,286 ⟶ 3,447:
.filter { it.size > 1 && it[0].length == count }
.forEach { println(it) }
}</langsyntaxhighlight>
 
{{out}}
Line 3,294 ⟶ 3,455:
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(
anagrams = map,
words = include_url('http://www.puzzlers.org/pub/wordlists/unixdict.txt') -> split('\n'),
Line 3,346 ⟶ 3,507:
}
 
#findings -> join('<br />\n')</langsyntaxhighlight>
 
Result -> excitation, intoxicate
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb">print "Loading dictionary file."
open "unixdict.txt" for input as #1
a$=input$(#1,lof(#1))
Line 3,402 ⟶ 3,563:
 
print theWord$(maxPtrI);" => ";theWord$(maxPtrJ)
end</langsyntaxhighlight>
{{out}}
excitation => intoxicate
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">string.tacnoc = function(str) -- 'inverse' of table.concat
local arr={}
for ch in str:gmatch(".") do arr[#arr+1]=ch end
Line 3,442 ⟶ 3,603:
end
end
print(answer.word, answer.anag, answer.len)</langsyntaxhighlight>
{{out}}
<pre>excitation intoxicate 10</pre>
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">with(StringTools):
dict:=Split([HTTP:-Get("www.puzzlers.org/pub/wordlists/unixdict.txt")][2]):
L:=[seq(select(t->HammingDistance(t,w)=length(w),[Anagrams(w,dict)])[],w=dict)]:
len:=length(ListTools:-FindMaximalElement(L,(a,b)->length(a)<length(b))):
select(w->length(w)=len,L)[];</langsyntaxhighlight>
{{out}}
<pre>
Line 3,458 ⟶ 3,619:
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">words=First/@Import["http://www.puzzlers.org/pub/wordlists/unixdict.txt","Table"];
anagramDegrangement=Function[{w1,w2},
Module[{c1=ToCharacterCode@w1,c2=ToCharacterCode@w2},
Sort@c1==Sort@c2&&Select[c1-c2,#==0&,1]==={}]];
gs=Select[GatherBy[words,{StringLength@#,Union@ToCharacterCode@#}&],Length@#>=2&];
First@Flatten[Function[ws,Select[Join@@Outer[List,ws,ws,1],anagramDegrangement@@#&]]/@SortBy[gs,-StringLength@First@#&],1]</langsyntaxhighlight>
{{out}}
<pre>
Line 3,470 ⟶ 3,631:
 
A similar approach using Mathematica 10:
<langsyntaxhighlight Mathematicalang="mathematica">list = Import["http://www.puzzlers.org/pub/wordlists/unixdict.txt","Lines"];
MaximalBy[
Select[GatherBy[list, Sort@*Characters],
Length@# > 1 && And @@ MapThread[UnsameQ, Characters /@ #] &],
StringLength@*First]</langsyntaxhighlight>
 
{{out}}
Line 3,482 ⟶ 3,643:
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import algorithm
import tables
import times
Line 3,522 ⟶ 3,683:
 
echo "Longest deranged anagram pair: ", best1, " ", best2
echo "Processing time: ", (getTime() - t0).inMilliseconds, " ms."</langsyntaxhighlight>
 
{{out}}
Line 3,529 ⟶ 3,690:
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let sort_chars s =
let r = String.copy s in
for i = 0 to (String.length r) - 2 do
Line 3,593 ⟶ 3,754:
) ([], 0) lst
in
List.iter (fun (w1, w2) -> Printf.printf "%s, %s\n" w1 w2) res</langsyntaxhighlight>
{{out}}
<pre>$ ocaml deranged_anagram.ml
Line 3,599 ⟶ 3,760:
 
=={{header|ooRexx}}==
<langsyntaxhighlight ooRexxlang="oorexx">-- This assumes you've already downloaded the following file and placed it
-- in the current directory: http://www.puzzlers.org/pub/wordlists/unixdict.txt
 
Line 3,661 ⟶ 3,822:
loop pair over pairs
say pair[1] pair[2]
end</langsyntaxhighlight>
{{out}}
<pre>
Line 3,669 ⟶ 3,830:
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">dict=readstr("unixdict.txt");
len=apply(s->#s, dict);
getLen(L)=my(v=List()); for(i=1,#dict, if(len[i]==L, listput(v, dict[i]))); Vec(v);
Line 3,677 ⟶ 3,838:
getDeranged(v)=my(u=List(),w); for(i=1,#v-1, for(j=i+1,#v, if(deranged(v[i], v[j]), listput(u, [v[i], v[j]])))); Vec(u);
f(n)=my(t=getAnagrams(getLen(n))); if(#t, concat(apply(getDeranged, t)), []);
forstep(n=vecmax(len),1,-1, t=f(n); if(#t, return(t)))</langsyntaxhighlight>
{{out}}
<pre>%1 = [["excitation", "intoxicate"]]</pre>
Line 3,684 ⟶ 3,845:
Using extra Stringlist for sorted by character words and insertion sort.<BR>
Runtime 153 ms -> 35 ms (Free Pascal Compiler version 3.3.1-r20:47268 [2020/11/02] for x86_64)
<langsyntaxhighlight lang="pascal">program Anagrams_Deranged;
{$IFDEF FPC}
{$MODE Delphi}
Line 3,800 ⟶ 3,961:
Dict.Free;
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,810 ⟶ 3,971:
 
=={{header|Perl}}==
===String operations===
<lang Perl>sub deranged { # only anagrams ever get here
<syntaxhighlight lang="perl">use strict;
use warnings;
 
sub deranged { # only anagrams ever get here
my @a = split('', shift); # split word into letters
my @b = split('', shift);
Line 3,844 ⟶ 4,009:
keys %letter_list )
{
# if we find a pair, they are the longestedlongest due to the sort before
last if find_deranged(@{ $letter_list{$_} });
}</langsyntaxhighlight>
{{out}}
<pre>length 10: excitation => intoxicate</pre>
<pre>
===Bitwise operations===
length 10: excitation => intoxicate
<syntaxhighlight lang="perl">use strict;
</pre>
===Alternate===
<lang perl>#!/usr/bin/perl
 
use strict; # https://rosettacode.org/wiki/Anagrams/Deranged_anagrams
use warnings;
use feature 'bitwise';
 
local (@ARGV, $/) = 'unixdict.txt';
Line 3,863 ⟶ 4,025:
{
my $key = join '', sort +split //, $word;
($_ ^. $word) =~ /\0/ or exit !print "$_ $word\n" for @{ $anagrams{$key} };
push @{ $anagrams{$key} }, $word;
}</langsyntaxhighlight>
{{out}}
<pre>excitation intoxicate</pre>
<pre>
excitation intoxicate
</pre>
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">-->
<span style="color: #008080;">function</span> <span style="color: #000000;">deranged</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">word1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">word2</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sq_eq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">word2</span><span style="color: #0000FF;">))=</span><span style="color: #000000;">0</span>
Line 3,918 ⟶ 4,078:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 3,924 ⟶ 4,084:
excitation, intoxicate
</pre>
 
=={{header|Phixmonti}}==
<syntaxhighlight lang="phixmonti">/# Rosetta Code problem: http://rosettacode.org/wiki/Anagrams/Deranged_anagrams
by Galileo, 06/2022 #/
 
include ..\Utilitys.pmt
 
"unixdict.txt" "r" fopen var f
 
( )
 
true while
f fgets
dup -1 == if
drop
f fclose
false
else
-1 del
dup sort swap 2 tolist
0 put
true
endif
endwhile
 
sort
 
0 var largest
( ) var candidate
 
( len 2 swap ) for var i
( i 1 ) sget >ps
( i 1 - 1 ) sget ps> == if
( i 2 ) sget >ps
( i 1 - 2 ) sget ps> len >ps
true var test
tps for var j
j get rot j get rot == if false var test exitfor endif
endfor
test tps largest > and if
ps> var largest
2 tolist var candidate
else
ps> drop drop drop
endif
endif
endfor
 
candidate print
</syntaxhighlight>
{{out}}
<pre>["excitation", "intoxicate"]
=== Press any key to exit ===</pre>
 
=={{header|PHP}}==
<langsyntaxhighlight PHPlang="php"><?php
$words = file(
'http://www.puzzlers.org/pub/wordlists/unixdict.txt',
Line 3,976 ⟶ 4,189:
echo implode(" ", $final_word), "\n";
}
?></langsyntaxhighlight>
{{out}}
<pre>
Line 3,983 ⟶ 4,196:
 
=={{header|Picat}}==
<syntaxhighlight lang="picat">go =>
<lang Picat>
go =>
M = [W:W in read_file_lines("unixdict.txt")].group(sort),
Deranged = [Value : _Key=Value in M, Value.length > 1, allderanged(Value)],
Line 4,007 ⟶ 4,219:
end,
IsDeranged == 1.
 
 
% Groups the element in List according to the function F
Line 4,015 ⟶ 4,226:
V = apply(F,E),
P.put(V, P.get(V,[]) ++ [E])
end.</langsyntaxhighlight>
 
{{out}}
Output:
<pre>[[excitation,intoxicate]]</pre>
 
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(let Words NIL
(in "unixdict.txt"
(while (line)
Line 4,040 ⟶ 4,250:
(cons (pack @) (pack Lst)) ) )
(val Key) ) )
(idx 'Words) ) ) )</langsyntaxhighlight>
{{out}}
<pre>-> ("excitation" . "intoxicate")</pre>
 
=={{header|PowerShell}}==
<langsyntaxhighlight PowerShelllang="powershell">function Test-Deranged ([string[]]$Strings)
{
$array1 = $Strings[0].ToCharArray()
Line 4,077 ⟶ 4,287:
Length = $deranged[0].Length
Words = $deranged
}</langsyntaxhighlight>
{{Out}}
<pre>
Line 4,087 ⟶ 4,297:
=={{header|Prolog}}==
{{Works with|SWI Prolog}}
<langsyntaxhighlight Prologlang="prolog">longest_deranged_anagram :-
http_open('http://www.puzzlers.org/pub/wordlists/unixdict.txt',In,[]),
read_file(In, [], Out),
Line 4,144 ⟶ 4,354:
msort(W, W1),
atom_codes(A, W1),
read_file(In, [A-W | L], L1)).</langsyntaxhighlight>
{{out}}
<pre> ?- longest_deranged_anagram.
Line 4,152 ⟶ 4,362:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Structure anagram
word.s
letters.s
Line 4,286 ⟶ 4,496:
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf</langsyntaxhighlight>
{{out}}
<pre>Largest 'Deranged' anagrams found are of length 10:
Line 4,294 ⟶ 4,504:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">import urllib.request
from collections import defaultdict
from itertools import combinations
Line 4,332 ⟶ 4,542:
print("Longest anagrams with no characters in the same position:")
print(' ' + '\n '.join(', '.join(pairs)
for pairs in largest_deranged_ana(anagrams)))</langsyntaxhighlight>
{{out}}
<pre>Word count: 25104
Line 4,344 ⟶ 4,554:
 
Append the following to the previous code:
<langsyntaxhighlight lang="python">def most_deranged_ana(anagrams):
ordered_anagrams = sorted(anagrams.items(),
key=lambda x:(-len(x[0]), x[0]))
Line 4,361 ⟶ 4,571:
for pairs in most:
print()
print(' ' + '\n '.join(', '.join(p) for p in pairs))</langsyntaxhighlight>
 
{{out}}
Line 4,393 ⟶ 4,603:
 
===Python: Faster Version===
<langsyntaxhighlight lang="python">from collections import defaultdict
from itertools import combinations
from pathlib import Path
Line 4,479 ⟶ 4,689:
 
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{out}}
<pre>The longest anagram is: excitation, intoxicate</pre>
Line 4,485 ⟶ 4,695:
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> [ over size over size != iff
[ 2drop false ] done
over sort over sort != iff
Line 4,507 ⟶ 4,717:
temp take
sortwith [ 0 peek size swap 0 peek size > ]
0 peek witheach [ echo$ sp ]</langsyntaxhighlight>
 
{{out}}
Line 4,514 ⟶ 4,724:
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">puzzlers.dict <- readLines("http://www.puzzlers.org/pub/wordlists/unixdict.txt")
 
longest.deranged.anagram <- function(dict=puzzlers.dict) {
Line 4,538 ⟶ 4,748:
}
}
}</langsyntaxhighlight>
 
{{out}}
 
<langsyntaxhighlight Rlang="r">> longest.deranged.anagram()
a b
3 excitation intoxicate</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">#lang racket
(define word-list-file "data/unixdict.txt")
 
Line 4,588 ⟶ 4,798:
(daps (in-value (deranged-anagram-pairs anagrams)))
#:unless (null? daps))
daps)</langsyntaxhighlight>
{{out}}
<pre>'(("intoxicate" "excitation"))</pre>
Line 4,597 ⟶ 4,807:
{{works with|Rakudo|2016.08}}
 
<syntaxhighlight lang="raku" perl6line>my @anagrams = 'unixdict.txt'.IO.words
.map(*.comb.cache) # explode words into lists of characters
.classify(*.sort.join).values # group words with the same characters
Line 4,611 ⟶ 4,821:
}
}
}</langsyntaxhighlight>
 
{{out}}
Line 4,617 ⟶ 4,827:
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program finds the largest deranged word (within an identified dictionary). */
iFID= 'unixdict.txt'; words=0 /*input file ID; number of words so far*/
wL.=0 /*number of words of length L. so far*/
Line 4,658 ⟶ 4,868:
do while h>1; h=h % 2; do i=1 for ho-h; j= i; k= h+i
do while !.k<!.j; t=!.j; !.j=!.k; !.k=t; if h>=j then leave; j=j-h; k=k-h
end /*while !.k···*/; end /*i*/; end /*while h>1*/; return</langsyntaxhighlight>
{{out|output|text= &nbsp; when using the default dictionary:}}
<pre>
Line 4,666 ⟶ 4,876:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring"># Project : Anagrams/Deranged anagrams
 
load "stdlib.ring"
Line 4,744 ⟶ 4,954:
astring = substr(astring,substr(astring,bstring)+len(string(sum)))
end
return cnt</langsyntaxhighlight>
{{out}}
<pre>
Line 4,751 ⟶ 4,961:
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">def deranged?(a, b)
a.chars.zip(b.chars).all? {|char_a, char_b| char_a != char_b}
end
Line 4,772 ⟶ 4,982:
break
end
end</langsyntaxhighlight>
{{out}}
<pre>
Line 4,779 ⟶ 4,989:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">a$ = httpGet$("http://www.puzzlers.org/pub/wordlists/unixdict.txt")
dim theWord$(30000)
dim ssWord$(30000)
Line 4,825 ⟶ 5,035:
 
print maxLen;" ";theWord$(maxPtrI);" => ";theWord$(maxPtrJ)
end</langsyntaxhighlight>
{{out}}
<pre>10 excitation => intoxicate</pre>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">//! Deranged anagrams
use std::cmp::Ordering;
use std::collections::HashMap;
Line 4,904 ⟶ 5,114:
Err(e) => panic!("Could not read words: {}",e)
}
}</langsyntaxhighlight>
{{out}}
<pre>excitation intoxicate</pre>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">object DerangedAnagrams {
 
/** Returns a map of anagrams keyed by the sorted characters */
Line 4,942 ⟶ 5,152:
}
 
}</langsyntaxhighlight>
{{out}}
<pre>Longest deranged pair: excitation and intoxicate</pre>
Line 4,948 ⟶ 5,158:
=={{header|Scheme}}==
 
<langsyntaxhighlight lang="scheme">(import (scheme base)
(scheme char)
(scheme cxr)
Line 4,996 ⟶ 5,206:
(cdr rem))))))))
 
(display (find-deranged-words (read-ordered-words))) (newline)</langsyntaxhighlight>
 
{{out}}
Line 5,004 ⟶ 5,214:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func find_deranged(Array a) {
for i in (^a) {
for j in (i+1 .. a.end) {
Line 5,038 ⟶ 5,248:
}
 
main(%f'/tmp/unixdict.txt')</langsyntaxhighlight>
{{out}}
<pre>length 10: excitation => intoxicate</pre>
 
=={{header|Simula}}==
<langsyntaxhighlight lang="simula">! cim --memory-pool-size=512 deranged-anagrams.sim;
BEGIN
 
Line 5,174 ⟶ 5,384:
OUTTEXT(VECT.ELEMENT(P1) & " " & VECT.ELEMENT(P2));
OUTIMAGE;
END</langsyntaxhighlight>
{{out}}
<pre>intoxicate excitation
Line 5,182 ⟶ 5,392:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
package require http
 
Line 5,234 ⟶ 5,444:
puts "considered candidate pairing: $pair"
}
puts "MAXIMAL DERANGED ANAGRAM: LENGTH $max\n\t[lindex $candidates end]"</langsyntaxhighlight>
{{out}}
<pre>
Line 5,253 ⟶ 5,463:
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">$$ MODE TUSCRIPT,{}
requestdata = REQUEST ("http://www.puzzlers.org/pub/wordlists/unixdict.txt")
 
Line 5,297 ⟶ 5,507:
ENDLOOP
ENDLOOP
ENDCOMPILE</langsyntaxhighlight>
{{out}}
<pre>
Line 5,306 ⟶ 5,516:
=={{header|UNIX Shell}}==
{{works with|ksh93}}
<langsyntaxhighlight lang="bash">function get_words {
typeset host=www.puzzlers.org
typeset page=/pub/wordlists/unixdict.txt
Line 5,352 ⟶ 5,562:
fi
done <word.list
echo $max - ${max_deranged[@]} </langsyntaxhighlight>
{{out}}
<pre>10 - excitation intoxicate</pre>
Line 5,358 ⟶ 5,568:
=={{header|Ursala}}==
This solution assumes the file <code>unixdict.txt</code> is passed to the compiler as a command line parameter.
<langsyntaxhighlight Ursalalang="ursala">#import std
 
anagrams = |=tK33lrDSL2SL ~=&& ==+ ~~ -<&
Line 5,366 ⟶ 5,576:
#cast %sW
 
main = leql$^&l deranged anagrams unixdict_dot_txt</langsyntaxhighlight>
The <code>anagrams</code> function is a little slow as defined above, but can be sped up by at least two orders of magnitude by grouping the words into classes of equal length, and sorting each word once in advance instead of each time a comparison is made as shown below.
<langsyntaxhighlight Ursalalang="ursala">anagrams = @NSiXSlK2rSS *= ^(-<&,~&)*; |=rSStFtK33lrDSL2SL ~=@br&& ==@bl</langsyntaxhighlight>
We can speed it up by about another factor of 5 by starting from the group of longest words and stopping as soon as a deranged anagram is found instead of generating all anagrams.
<langsyntaxhighlight Ursalalang="ursala">#import std
 
longest_deranged_anagram =
Line 5,380 ⟶ 5,590:
#cast %sW
 
main = longest_deranged_anagram unixdict_dot_txt</langsyntaxhighlight>
{{out}}
<pre>
Line 5,387 ⟶ 5,597:
 
=={{header|VBA}}==
<langsyntaxhighlight lang="vb">Sub Main_DerangedAnagrams()
Dim ListeWords() As String, Book As String, i As Long, j As Long, tempLen As Integer, MaxLen As Integer, tempStr As String, IsDeranged As Boolean, count As Integer, bAnag As Boolean
Dim t As Single
Line 5,436 ⟶ 5,646:
DerangedAnagram = True
Lenght = Len(str1)
End Function</langsyntaxhighlight>
 
{{out}}
Line 5,443 ⟶ 5,653:
Lenght : 10
Time to compute : 97,00781 sec.</pre>
 
=={{header|V (Vlang)}}==
{{trans|Go}}
<syntaxhighlight lang="v (vlang)">import os
 
fn deranged(a string, b string) bool {
if a.len != b.len {
return false
}
for i in 0..a.len {
if a[i] == b[i] { return false }
}
return true
}
fn main(){
words := os.read_lines('unixdict.txt')?
mut m := map[string][]string{}
mut best_len, mut w1, mut w2 := 0, '',''
 
for w in words {
// don't bother: too short to beat current record
if w.len <= best_len { continue }
// save strings in map, with sorted string as key
mut letters := w.split('')
letters.sort()
k := letters.join("")
if k !in m {
m[k] = [w]
continue
}
for c in m[k] {
if deranged(w, c) {
best_len, w1, w2 = w.len, c, w
break
}
}
m[k] << w
}
println('$w1 $w2: Length $best_len')
}</syntaxhighlight>
 
{{out}}
<pre>
excitation intoxicate: Length 10
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-sort}}
<langsyntaxhighlight ecmascriptlang="wren">import "io" for File
import "./sort" for Sort
 
// assumes w1 and w2 are anagrams of each other
Line 5,486 ⟶ 5,747:
for (words in deranged) {
if (words[0].count == most) System.print([words[0], words[1]])
}</langsyntaxhighlight>
 
{{out}}
Line 5,494 ⟶ 5,755:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">words:=Dictionary(25000); //-->Dictionary(sorted word:all anagrams, ...)
File("unixdict.txt").read().pump(Void,'wrap(w){
w=w.strip(); key:=w.sort(); words[key]=words.find(key,T).append(w);
Line 5,515 ⟶ 5,776:
nws.filter(fcn(nws,max){ nws[0]==max },
nws.reduce(fcn(p,nws){ p.max(nws[0]) },0) )
.println();</langsyntaxhighlight>
{{out}}
<pre>
Line 5,521 ⟶ 5,782:
</pre>
Replace the center section with the following for smaller code (3 lines shorter!) that is twice as slow:
<langsyntaxhighlight lang="zkl">nws:=words.values.pump(List,fcn(ws){ //-->( (len,words), ...)
if(ws.len()>1){ // two or more anagrams
n:=ws[0].len(); // length of these anagrams
Line 5,530 ⟶ 5,791:
}
Void.Skip
});</langsyntaxhighlight>
9,476

edits