Anagram generator: Difference between revisions
Content added Content deleted
m (→{{header|J}}: bugfix (would have not rejected a non-anagram which only differed by case)) |
(Added Wren) |
||
Line 145: | Line 145: | ||
I contest waldo |
I contest waldo |
||
nose to wildcat</pre> |
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> |