Anagram generator: Difference between revisions

Added Wren
m (→‎{{header|J}}: bugfix (would have not rejected a non-anagram which only differed by case))
(Added Wren)
Line 145:
I contest waldo
nose to wildcat</pre>
 
=={{header|Wren}}==
{{libheader|Wren-str}}
{{libheader|Wren-perm}}
{{libheader|Wren-sort}}
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.
<lang ecmascript>import "io" for File
import "./str" for Str, Char
import "./perm" for Perm
import "./sort" for Find
 
var wordList = "unixdict.txt" // local copy
var words = File.read(wordList).trimEnd().split("\n").toList
 
var anagramGenerator = Fn.new { |text, limit|
var letters = Str.lower(text).toList
// remove any non-letters
for (i in letters.count-1..0) {
if (!Char.isLetter(letters[i])) letters.removeAt(i)
}
if (letters.count < 4) return
var h = (letters.count/2).floor
var count = 0
var tried = {}
for (n in h..2) {
for (perm in Perm.list(letters)) {
var letters1 = perm[0...n]
for (perm2 in Perm.list(letters1)) {
var word1 = perm2.join()
if (tried[word1]) continue
tried[word1] = true
if (Find.first(words, word1) >= 0) {
var letters2 = perm[n..-1]
for (perm3 in Perm.list(letters2)) {
var word2 = perm3.join()
if (tried[word2]) continue
tried[word2] = true
if (Find.first(words, word2) >= 0) {
System.print(" " + word1 + " " + word2)
count = count + 1
if (count == limit) return
}
}
}
}
}
}
}
 
var tests = ["Rosetta", "PureFox", "Petelomax", "Wherrera", "Thundergnat"]
var limits = [10, 10, 10, 10, 1]
for (i in 0...tests.count) {
System.print("\n%(tests[i])(<=%(limits[i])):")
anagramGenerator.call(tests[i], limits[i])
}</lang>
 
{{out}}
<pre>
Rosetta(<=10):
rot east
rot seat
oar test
ret taos
toe star
toe tsar
ott sera
ott sear
ott ares
oat rest
 
PureFox(<=10):
fox peru
fox pure
 
Petelomax(<=10):
poem latex
poem exalt
apex motel
alex tempo
moat expel
pax omelet
lao exempt
to example
 
Wherrera(<=10):
wehr rear
wehr rare
wear herr
 
Thundergnat(<=1):
ghent tundra
</pre>
9,485

edits