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 Perm
import "./perm" for Comb
import "./sort" for Find
import "./seq" for Lst
import "./sort" for Sort


var wordList = "unixdict.txt" // local copy
var wordList = "unixdict.txt" // local copy
var words = File.read(wordList).trimEnd().split("\n").toList
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, limit|
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)
}
}
if (letters.count < 4) return
var lc = letters.count
var h = (letters.count/2).floor
if (lc < 2) return
var count = 0
var h = (lc/2).floor
var tried = {}
var tried = {}
for (n in h..2) {
for (n in h..1) {
for (perm in Perm.list(letters)) {
var sameLength = (lc == 2 * n)
var letters1 = perm[0...n]
for (letters1 in Comb.list(letters, n)) {
for (perm2 in Perm.list(letters1)) {
Sort.insertion(letters1)
var word1 = perm2.join()
letters1 = letters1.join()
if (tried[word1]) continue
if (tried[letters1]) continue
tried[word1] = true
tried[letters1] = true
if (Find.first(words, word1) >= 0) {
var anagrams = wordMap[letters1]
var letters2 = perm[n..-1]
if (anagrams) {
for (perm3 in Perm.list(letters2)) {
var letters2 = Lst.except(letters, letters1.toList)
var word2 = perm3.join()
Sort.insertion(letters2)
if (tried[word2]) continue
letters2 = letters2.join()
tried[word2] = true
if (sameLength) {
if (Find.first(words, word2) >= 0) {
if (tried[letters2]) continue
tried[letters2] = true
}
var anagrams2 = wordMap[letters2]
if (anagrams2) {
for (word1 in anagrams) {
for (word2 in anagrams2) {
System.print(" " + word1 + " " + word2)
System.print(" " + word1 + " " + word2)
count = count + 1
if (count == limit) return
}
}
}
}
Line 301: Line 320:
}
}


var tests = ["Rosetta", "PureFox", "Petelomax", "Wherrera", "Thundergnat"]
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])(<=%(limits[i])):")
System.print("\n%(tests[i]):")
anagramGenerator.call(tests[i], limits[i])
anagramGenerator.call(tests[i])
}</lang>
}</lang>


{{out}}
{{out}}
<pre>
<pre>
Rosettacode:
Rosetta(<=10):
rot east
scoot derate
rot seat
stood cetera
oar test
stood create
ret taos
tease doctor
toe star
code rosetta
toe tsar
coed rosetta
ott sera
coat oersted
ott sear
coda rosette
ott ares
sao detector
oat rest
tee ostracod
tad creosote
se doctorate


PureFox(<=10):
PureFox:
fox peru
fox peru
fox pure
fox pure


Petelomax(<=10):
Petelomax:
poem latex
poem exalt
poem exalt
poem latex
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(<=10):
Wherrera:
wehr rear
wehr rare
wehr rare
wehr rear
ware herr
wear herr
wear herr


Thundergnat(<=1):
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>