Anagrams/Deranged anagrams: Difference between revisions
m
→{{header|Wren}}: Minor tidy
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
m (→{{header|Wren}}: Minor tidy) |
||
(9 intermediate revisions by 9 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
Use the word list at [http://wiki.puzzlers.org/pub/wordlists/unixdict.txt unixdict] to find and display the longest deranged anagram.
* [[Permutations/Derangements]]
* [[Best_shuffle|Best shuffle]]
Line 22:
=={{header|11l}}==
{{trans|Kotlin}}
<syntaxhighlight 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
I a !C anagram
anagram[a] = [word]
Line 47:
{{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=
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program anaderan64.s */
Line 525 ⟶ 526:
=={{header|Ada}}==
{{Works with|Ada 2005}}
<syntaxhighlight lang=
with Ada.Containers.Generic_Array_Sort;
with Ada.Containers.Indefinite_Vectors;
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.
<syntaxhighlight 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 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)
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to delim
set txt to lst as text
set AppleScript's text item delimiters to astid
return txt
end join
on longestDerangedAnagrams(listOfWords)
script o
property wordList : listOfWords
property
property
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
set
set wordLength to (count beginning of anagramGroup)
repeat with i from 1 to (
set w1 to anagramGroup's item i
repeat with j from (i + 1) to
set w2 to anagramGroup's item j
set areDeranged to true
repeat with c from 1 to wordLength
if (w1's character c
set areDeranged to false
exit repeat
end if
end repeat
-- Append any deranged pairs found to the output
if (areDeranged) then
set end of
set
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
--
set
tell sorter to sort(chrs, 1, -1, {})
set
end repeat
-- 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}})
--
set i to 1
set currentText to beginning of o's
repeat with j from 2 to (
set thisText to
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
if ((count thisText) < o's
end repeat
if (j > i) then tell o to testPairs(i, j)
Line 790 ⟶ 793:
end longestDerangedAnagrams
local wordFile, wordList
set wordFile to ((path to desktop as text) & "www.rosettacode.org:unixdict.txt") as «class furl»
set wordList to paragraphs of (read wordFile as «class utf8»)
return longestDerangedAnagrams(wordList)</syntaxhighlight>
{{output}}
<syntaxhighlight lang="applescript">{{"excitation", "intoxicate"}}</syntaxhighlight>
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
<syntaxhighlight lang=
/* ARM assembly Raspberry PI */
/* program anaderan.s */
Line 1,236:
=={{header|Arturo}}==
<syntaxhighlight lang="rebol">isDeranged?: function [p][
[a,b]: p
loop 0..dec size a 'i [
Line 1,276:
=={{header|AutoHotkey}}==
<syntaxhighlight lang=
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetBatchLines -1
Line 1,339:
{{works with|GNU awk (gawk) 3.1.5}}
<syntaxhighlight lang="awk">#!/bin/gawk -f
BEGIN{
FS=""
Line 1,405:
Regular invocation would be:
<syntaxhighlight lang="sh">gawk -f deranged.awk /tmp/unixdict.txt</syntaxhighlight>
{{out}}
<pre>
Line 1,411:
</pre>
=={{header|
==={{header|BaCon}}===
<syntaxhighlight lang="freebasic">DECLARE idx$ ASSOC STRING
FUNCTION Deranged(a$, b$)
Line 1,448 ⟶ 1,449:
</pre>
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<syntaxhighlight lang="bbcbasic"> INSTALL @lib$+"SORTLIB"
Sort% = FN_sortinit(0,0)
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.
<syntaxhighlight lang="bracmat"> get$("unixdict.txt",STR):?wordList
& 1:?product
& :?unsorted
Line 1,595 ⟶ 1,596:
=={{header|C}}==
<syntaxhighlight lang=
#include <stdlib.h>
#include <string.h>
Line 1,716 ⟶ 1,717:
{{libheader|System.IO}}
{{works with|C sharp|6}}
<syntaxhighlight lang="csharp">public static void Main()
{
var lookupTable = File.ReadLines("unixdict.txt").ToLookup(line => AnagramKey(line));
Line 1,742 ⟶ 1,743:
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <algorithm>
#include <fstream>
#include <functional>
Line 1,798 ⟶ 1,799:
=={{header|Clojure}}==
<syntaxhighlight lang=
(re-seq #"\w+") ; |
(group-by sort) ; anagrams
Line 1,812 ⟶ 1,813:
=={{header|COBOL}}==
{{Works with|X/Open COBOL}}
<syntaxhighlight
01
01
01
01
01
01
05 WS-LETTER1
01
01
SORT WT-RECORD ON DESCENDING KEY WT-WORD-LEN.
PERFORM 500-FIND-DERANGED.
STOP RUN.
PERFORM 150-READ-RECORD.
* bubble sort:
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.
SET WT-IDX TO
SEARCH WT-RECORD
AT END
WHEN WT-WORD-KEY(WT-IDX) = WS-WORD-KEY
PERFORM 440-UPDATE-RECORD
END-SEARCH.
420-ADD-RECORD.
ADD 1 To WT-REC-NBR.
MOVE WS-WORD-KEY TO WT-WORD-KEY(WT-REC-NBR).
COMPUTE WT-WORD-LEN(WT-REC-NBR) = WS-MAX - 1 END-COMPUTE.
MOVE 1 TO WT-ANAGRAM-CNT(WT-REC-NBR).
WT-ANAGRAM(WT-REC-NBR, WT-ANAGRAM-CNT(WT-REC-NBR)).
440-UPDATE-RECORD.
ADD 1
MOVE WS-WORD-IN TO
WT-ANAGRAM(WT-IDX, WT-ANAGRAM-CNT(WT-IDX)).
500-FIND-DERANGED.
PERFORM VARYING WS-I FROM 1
PERFORM VARYING
UNTIL
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.
650-CHECK-DERANGED.
MOVE
PERFORM VARYING WS-L FROM 1 BY 1
UNTIL WS-L
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.
DISPLAY 'RECORDS READ: ' WS-TOT-RECS.
DISPLAY 'RECORDS SELECTED ' WS-SEL-RECS.
DISPLAY 'RECORD KEYS: ' WT-REC-NBR.
CLOSE IN-FILE.
END PROGRAM
*> OUTPUT:
*>
*> RECORDS READ: 25104
*> RECORDS SELECTED 24978
*> RECORD KEYS: 23441
*> BUBBLE SORT REFERENCE:
*> https://mainframegeek.wordpress.com/tag/bubble-sort-in-cobol
</syntaxhighlight>
=={{header|CoffeeScript}}==
This example was tested with node.js.
<syntaxhighlight lang="coffeescript">http = require 'http'
is_derangement = (word1, word2) ->
Line 2,044 ⟶ 2,045:
=={{header|Common Lisp}}==
<syntaxhighlight 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,070 ⟶ 2,071:
=={{header|D}}==
===Short Version===
<syntaxhighlight lang="d">void main() {
import std.stdio, std.file, std.algorithm, std.string, std.array;
Line 2,090 ⟶ 2,091:
Using const(ubytes)[] instead of dstrings gives a runtime of about 0.07 seconds:
<syntaxhighlight lang="d"> string[][ubyte[]] anags;
foreach (const w; "unixdict.txt".readText.split)
anags[w.dup.representation.sort().release.assumeUnique] ~= w;</syntaxhighlight>
===Faster Version===
<syntaxhighlight lang="d">import std.stdio, std.file, std.algorithm, std.string, std.array,
std.functional, std.exception;
Line 2,132 ⟶ 2,133:
{{libheader| System.Classes}}
{{libheader| System.Diagnostics}}
<syntaxhighlight lang=
{$APPTYPE CONSOLE}
Line 2,249 ⟶ 2,250:
=={{header|EchoLisp}}==
For a change, we use the french dictionary included in EchoLisp package.
<syntaxhighlight lang="scheme">(lib 'hash)
(lib 'struct)
(lib 'sql)
Line 2,282 ⟶ 2,283:
</syntaxhighlight>
{{out}}
<syntaxhighlight lang="scheme">
(lib 'dico.fr.no-accent) ;; 209315 words into *words* table
(task)
Line 2,307 ⟶ 2,308:
=={{header|Eiffel}}==
<syntaxhighlight lang=
ANAGRAMS_DERANGED
Line 2,439 ⟶ 2,440:
=={{header|Elixir}}==
{{trans|Ruby}}
<syntaxhighlight lang="elixir">defmodule Anagrams do
def deranged(fname) do
File.read!(fname)
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]].
<syntaxhighlight lang=
-export( [task/0, words_from_url/1] ).
Line 2,524 ⟶ 2,525:
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">open System;
let keyIsSortedWord = Seq.sort >> Seq.toArray >> String
Line 2,554 ⟶ 2,555:
=={{header|Factor}}==
<syntaxhighlight lang="factor">USING: assocs fry io.encodings.utf8 io.files kernel math
math.combinatorics sequences sorting strings ;
IN: rosettacode.deranged-anagrams
Line 2,583 ⟶ 2,584:
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
Type IndexedWord
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]].
<syntaxhighlight lang="gap">IsDeranged := function(a, b)
local i, n;
for i in [1 .. Size(a)] do
Line 2,763 ⟶ 2,887:
=={{header|Go}}==
<syntaxhighlight lang="go">package main
import (
"fmt"
Line 2,822 ⟶ 2,946:
=={{header|Groovy}}==
Solution:
<syntaxhighlight 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,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.
<syntaxhighlight lang="haskell">{-# LANGUAGE TupleSections #-}
import Data.List (maximumBy, sort, unfoldr)
Line 2,903 ⟶ 3,027:
{{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).
<syntaxhighlight lang="unicon">link strings # for csort() procedure
procedure main()
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.
<syntaxhighlight lang="j"> #words=: 'b' freads 'unixdict.txt'
25104
#anagrams=: (#~ 1 < #@>) (</.~ /:~&>) words
Line 2,959 ⟶ 3,120:
=={{header|Java}}==
{{works with|Java|8}}
<syntaxhighlight lang="java">import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
Line 3,017 ⟶ 3,178:
brevity.
<syntaxhighlight lang=
function main() {
Line 3,098 ⟶ 3,259:
=== Gecko ===
Word file is saved locally because browser won't fetch it cross-site. Tested on Gecko.
<syntaxhighlight lang="javascript"><html><head><title>Intoxication</title></head>
<body><pre id='x'></pre>
<script type="application/javascript">
Line 3,152 ⟶ 3,313:
This solution allows for the possibility of more than one answer.
<syntaxhighlight lang="jq"># Input: an array of strings
# Output: a stream of arrays
def anagrams:
Line 3,191 ⟶ 3,352:
=={{header|Julia}}==
<syntaxhighlight 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,239 ⟶ 3,400:
=={{header|K}}==
<syntaxhighlight lang=
a:{x g@&1<#:'g:={x@<x}'x}@0:"unixdict.txt";
Line 3,248 ⟶ 3,409:
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.0.6
import java.io.BufferedReader
Line 3,294 ⟶ 3,455:
=={{header|Lasso}}==
<syntaxhighlight lang=
anagrams = map,
words = include_url('http://www.puzzlers.org/pub/wordlists/unixdict.txt') -> split('\n'),
Line 3,351 ⟶ 3,512:
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">print "Loading dictionary file."
open "unixdict.txt" for input as #1
a$=input$(#1,lof(#1))
Line 3,407 ⟶ 3,568:
=={{header|Lua}}==
<syntaxhighlight 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,447 ⟶ 3,608:
=={{header|Maple}}==
<syntaxhighlight lang=
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)]:
Line 3,458 ⟶ 3,619:
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang=
anagramDegrangement=Function[{w1,w2},
Module[{c1=ToCharacterCode@w1,c2=ToCharacterCode@w2},
Line 3,470 ⟶ 3,631:
A similar approach using Mathematica 10:
<syntaxhighlight lang=
MaximalBy[
Select[GatherBy[list, Sort@*Characters],
Line 3,482 ⟶ 3,643:
=={{header|Nim}}==
<syntaxhighlight lang=
import tables
import times
Line 3,529 ⟶ 3,690:
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">let sort_chars s =
let r = String.copy s in
for i = 0 to (String.length r) - 2 do
Line 3,599 ⟶ 3,760:
=={{header|ooRexx}}==
<syntaxhighlight lang=
-- in the current directory: http://www.puzzlers.org/pub/wordlists/unixdict.txt
Line 3,669 ⟶ 3,830:
=={{header|PARI/GP}}==
<syntaxhighlight 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,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)
<syntaxhighlight lang="pascal">program Anagrams_Deranged;
{$IFDEF FPC}
{$MODE Delphi}
Line 3,810 ⟶ 3,971:
=={{header|Perl}}==
===String operations===
<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
last if find_deranged(@{ $letter_list{$_} });
}</syntaxhighlight>
{{out}}
<pre>length 10: excitation => intoxicate</pre>
===Bitwise operations===
<syntaxhighlight lang="perl">use strict;
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;
}</syntaxhighlight>
{{out}}
<pre>excitation intoxicate</pre>
=={{header|Phix}}==
<!--<syntaxhighlight lang=
<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,926 ⟶ 4,086:
=={{header|Phixmonti}}==
<syntaxhighlight lang=
by Galileo, 06/2022 #/
Line 3,979 ⟶ 4,139:
=={{header|PHP}}==
<syntaxhighlight lang=
$words = file(
'http://www.puzzlers.org/pub/wordlists/unixdict.txt',
Line 4,036 ⟶ 4,196:
=={{header|Picat}}==
<syntaxhighlight lang=
M = [W:W in read_file_lines("unixdict.txt")].group(sort),
Deranged = [Value : _Key=Value in M, Value.length > 1, allderanged(Value)],
Line 4,072 ⟶ 4,232:
=={{header|PicoLisp}}==
<syntaxhighlight lang=
(in "unixdict.txt"
(while (line)
Line 4,095 ⟶ 4,255:
=={{header|PowerShell}}==
<syntaxhighlight lang=
{
$array1 = $Strings[0].ToCharArray()
Line 4,137 ⟶ 4,297:
=={{header|Prolog}}==
{{Works with|SWI Prolog}}
<syntaxhighlight lang=
http_open('http://www.puzzlers.org/pub/wordlists/unixdict.txt',In,[]),
read_file(In, [], Out),
Line 4,202 ⟶ 4,362:
=={{header|PureBasic}}==
<syntaxhighlight lang=
word.s
letters.s
Line 4,344 ⟶ 4,504:
=={{header|Python}}==
<syntaxhighlight lang="python">import urllib.request
from collections import defaultdict
from itertools import combinations
Line 4,394 ⟶ 4,554:
Append the following to the previous code:
<syntaxhighlight lang="python">def most_deranged_ana(anagrams):
ordered_anagrams = sorted(anagrams.items(),
key=lambda x:(-len(x[0]), x[0]))
Line 4,443 ⟶ 4,603:
===Python: Faster Version===
<syntaxhighlight lang="python">from collections import defaultdict
from itertools import combinations
from pathlib import Path
Line 4,535 ⟶ 4,695:
=={{header|Quackery}}==
<syntaxhighlight lang=
[ 2drop false ] done
over sort over sort != iff
Line 4,564 ⟶ 4,724:
=={{header|R}}==
<syntaxhighlight lang=
longest.deranged.anagram <- function(dict=puzzlers.dict) {
Line 4,592 ⟶ 4,752:
{{out}}
<syntaxhighlight lang=
a b
3 excitation intoxicate</syntaxhighlight>
=={{header|Racket}}==
<syntaxhighlight lang="racket">#lang racket
(define word-list-file "data/unixdict.txt")
Line 4,647 ⟶ 4,807:
{{works with|Rakudo|2016.08}}
<syntaxhighlight lang=
.map(*.comb.cache) # explode words into lists of characters
.classify(*.sort.join).values # group words with the same characters
Line 4,667 ⟶ 4,827:
=={{header|REXX}}==
<syntaxhighlight 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,716 ⟶ 4,876:
=={{header|Ring}}==
<syntaxhighlight lang="ring"># Project : Anagrams/Deranged anagrams
load "stdlib.ring"
Line 4,801 ⟶ 4,961:
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">def deranged?(a, b)
a.chars.zip(b.chars).all? {|char_a, char_b| char_a != char_b}
end
Line 4,829 ⟶ 4,989:
=={{header|Run BASIC}}==
<syntaxhighlight lang="runbasic">a$ = httpGet$("http://www.puzzlers.org/pub/wordlists/unixdict.txt")
dim theWord$(30000)
dim ssWord$(30000)
Line 4,880 ⟶ 5,040:
=={{header|Rust}}==
<syntaxhighlight lang="rust">//! Deranged anagrams
use std::cmp::Ordering;
use std::collections::HashMap;
Line 4,959 ⟶ 5,119:
=={{header|Scala}}==
<syntaxhighlight lang="scala">object DerangedAnagrams {
/** Returns a map of anagrams keyed by the sorted characters */
Line 4,998 ⟶ 5,158:
=={{header|Scheme}}==
<syntaxhighlight lang="scheme">(import (scheme base)
(scheme char)
(scheme cxr)
Line 5,054 ⟶ 5,214:
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">func find_deranged(Array a) {
for i in (^a) {
for j in (i+1 .. a.end) {
Line 5,093 ⟶ 5,253:
=={{header|Simula}}==
<syntaxhighlight lang="simula">! cim --memory-pool-size=512 deranged-anagrams.sim;
BEGIN
Line 5,232 ⟶ 5,392:
=={{header|Tcl}}==
<syntaxhighlight lang="tcl">package require Tcl 8.5
package require http
Line 5,303 ⟶ 5,463:
=={{header|TUSCRIPT}}==
<syntaxhighlight lang="tuscript">$$ MODE TUSCRIPT,{}
requestdata = REQUEST ("http://www.puzzlers.org/pub/wordlists/unixdict.txt")
Line 5,356 ⟶ 5,516:
=={{header|UNIX Shell}}==
{{works with|ksh93}}
<syntaxhighlight lang="bash">function get_words {
typeset host=www.puzzlers.org
typeset page=/pub/wordlists/unixdict.txt
Line 5,408 ⟶ 5,568:
=={{header|Ursala}}==
This solution assumes the file <code>unixdict.txt</code> is passed to the compiler as a command line parameter.
<syntaxhighlight lang=
anagrams = |=tK33lrDSL2SL ~=&& ==+ ~~ -<&
Line 5,418 ⟶ 5,578:
main = leql$^&l deranged anagrams unixdict_dot_txt</syntaxhighlight>
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.
<syntaxhighlight lang=
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.
<syntaxhighlight lang=
longest_deranged_anagram =
Line 5,437 ⟶ 5,597:
=={{header|VBA}}==
<syntaxhighlight 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,494 ⟶ 5,654:
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 {
Line 5,547 ⟶ 5,707:
=={{header|Wren}}==
{{libheader|Wren-sort}}
<syntaxhighlight lang=
import "./sort" for Sort
// assumes w1 and w2 are anagrams of each other
Line 5,595 ⟶ 5,755:
=={{header|zkl}}==
<syntaxhighlight 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,622 ⟶ 5,782:
</pre>
Replace the center section with the following for smaller code (3 lines shorter!) that is twice as slow:
<syntaxhighlight 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
|