Anagram generator: Difference between revisions
Content added Content deleted
(→{{header|Wren}}: Replaced with much more efficient version, more than 100x quicker than before.) |
|||
Line 256: | Line 256: | ||
{{libheader|Wren-str}} |
{{libheader|Wren-str}} |
||
{{libheader|Wren-perm}} |
{{libheader|Wren-perm}} |
||
{{libheader|Wren-seq}} |
|||
{{libheader|Wren-sort}} |
{{libheader|Wren-sort}} |
||
To avoid any subjectivity, this just produces all two word anagrams of a word or phrase. |
|||
Although reasonably thorough (at least for producing two word anagrams), this is none too quick when there's more than 9 letters to juggle with. Hence, the need for a limit to be imposed on the number of anagrams produced. |
|||
Alternatives formed by simply changing the order of the two words have been suppressed. |
|||
<lang ecmascript>import "io" for File |
<lang ecmascript>import "io" for File |
||
import "./str" for Str, Char |
import "./str" for Str, Char |
||
import "./perm" for |
import "./perm" for Comb |
||
import "./ |
import "./seq" for Lst |
||
import "./sort" for Sort |
|||
var wordList = "unixdict.txt" // local copy |
var wordList = "unixdict.txt" // local copy |
||
var words = File.read( |
var words = File.read("unixdict.txt").split("\n").map { |w| w.trim() } |
||
var wordMap = {} |
|||
for (word in words) { |
|||
var letters = word.toList |
|||
Sort.insertion(letters) |
|||
var sortedWord = letters.join() |
|||
if (wordMap.containsKey(sortedWord)) { |
|||
wordMap[sortedWord].add(word) |
|||
} else { |
|||
wordMap[sortedWord] = [word] |
|||
} |
|||
} |
|||
var anagramGenerator = Fn.new { |text |
var anagramGenerator = Fn.new { |text| |
||
var letters = Str.lower(text).toList |
var letters = Str.lower(text).toList |
||
// remove any non-letters |
// remove any non-letters |
||
Line 272: | Line 287: | ||
if (!Char.isLetter(letters[i])) letters.removeAt(i) |
if (!Char.isLetter(letters[i])) letters.removeAt(i) |
||
} |
} |
||
var lc = letters.count |
|||
if (lc < 2) return |
|||
var |
var h = (lc/2).floor |
||
var tried = {} |
var tried = {} |
||
for (n in h.. |
for (n in h..1) { |
||
var sameLength = (lc == 2 * n) |
|||
for (letters1 in Comb.list(letters, n)) { |
|||
Sort.insertion(letters1) |
|||
letters1 = letters1.join() |
|||
if (tried[letters1]) continue |
|||
tried[letters1] = true |
|||
var anagrams = wordMap[letters1] |
|||
if (anagrams) { |
|||
var letters2 = Lst.except(letters, letters1.toList) |
|||
Sort.insertion(letters2) |
|||
letters2 = letters2.join() |
|||
if (sameLength) { |
|||
if (tried[letters2]) continue |
|||
⚫ | |||
} |
|||
var anagrams2 = wordMap[letters2] |
|||
⚫ | |||
for (word1 in anagrams) { |
|||
for (word2 in anagrams2) { |
|||
System.print(" " + word1 + " " + word2) |
System.print(" " + word1 + " " + word2) |
||
⚫ | |||
⚫ | |||
} |
} |
||
} |
} |
||
Line 301: | Line 320: | ||
} |
} |
||
var tests = [" |
var tests = ["Rosettacode", "PureFox", "Petelomax", "Wherrera", "Thundergnat", "ClintEastwood"] |
||
var limits = [10, 10, 10, 10, 1] |
|||
for (i in 0...tests.count) { |
for (i in 0...tests.count) { |
||
System.print("\n%(tests[i] |
System.print("\n%(tests[i]):") |
||
anagramGenerator.call(tests |
anagramGenerator.call(tests[i]) |
||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Rosettacode: |
|||
Rosetta(<=10): |
|||
scoot derate |
|||
stood cetera |
|||
stood create |
|||
tease doctor |
|||
code rosetta |
|||
coed rosetta |
|||
coat oersted |
|||
coda rosette |
|||
sao detector |
|||
tee ostracod |
|||
tad creosote |
|||
se doctorate |
|||
PureFox |
PureFox: |
||
fox peru |
fox peru |
||
fox pure |
fox pure |
||
Petelomax |
Petelomax: |
||
⚫ | |||
poem exalt |
poem exalt |
||
⚫ | |||
apex motel |
apex motel |
||
alex tempo |
alex tempo |
||
axle tempo |
|||
atom expel |
|||
moat expel |
moat expel |
||
pax omelet |
pax omelet |
||
Line 336: | Line 358: | ||
to example |
to example |
||
Wherrera |
Wherrera: |
||
⚫ | |||
wehr rare |
wehr rare |
||
⚫ | |||
ware herr |
|||
wear herr |
wear herr |
||
Thundergnat |
Thundergnat: |
||
ghent tundra |
ghent tundra |
||
hunt dragnet |
|||
gnat thunder |
|||
tang thunder |
|||
hurd gannett |
|||
hurd tangent |
|||
ClintEastwood: |
|||
edison walcott |
|||
atwood stencil |
|||
clint eastwood |
|||
eliot downcast |
|||
clio downstate |
|||
coil downstate |
|||
loci downstate |
|||
</pre> |
</pre> |