Anagram generator: Difference between revisions
(Added Wren) |
|||
Line 86: | Line 86: | ||
downstate loci |
downstate loci |
||
edison walcott</lang> |
edison walcott</lang> |
||
=={{header|Phix}}== |
|||
Couldn't really think of a better way than just building a dirty great filter list to get rid of the less interesting answers.... |
|||
<!--<lang Phix>(phixonline)--> |
|||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">bo_ring</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"al"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"alex"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"am"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"an"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"and"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"anent"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ann"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ant"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ar"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ares"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"art"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"at"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ax"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"axle"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"dan"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"dar"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"darn"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"dart"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"de"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"den"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"dent"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"dna"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"drag"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"du"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"dun"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"dunn"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"ed"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"edt"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"eh"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"el"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"em"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"en"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"end"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"eng"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"erg"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"eros"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"est"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"et"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"eta"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ex"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"ga"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gad"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gar"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"garth"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ge"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ghent"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gnat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gnu"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"grad"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gu"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ha"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"had"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"han"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"hand"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"hart"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"hat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"he"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"hut"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"la"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"lam"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"lao"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"lax"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"lee"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"leo"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"lo"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"lot"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"ma"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"max"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"mao"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"mo"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"moe"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"mel"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"met"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"mt"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"nat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"nd"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ne"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ned"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"nh"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"nne"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"nu"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"opel"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"opt"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ott"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ox"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pa"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pax"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pee"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pl"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pm"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"po"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"poe"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rag"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ran"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rand"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"rant"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rd"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"re"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"red"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ret"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rna"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ruth"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"sa"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"sat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"se"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"sort"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"st"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"ta"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tad"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tag"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tam"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tamp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tao"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"taos"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tan"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tang"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tangent"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tanh"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"tar"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tater"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tau"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tax"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ted"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tel"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ten"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tenant"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tent"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tern"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"than"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"that"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"the"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"then"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tn"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tnt"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"to"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"top"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tor"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tort"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tot"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"trag"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"tsar"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tun"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tuna"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tung"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tx"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"un"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ut"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"wa"</span><span style="color: #0000FF;">}</span> |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">az</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)>=</span><span style="color: #008000;">'a'</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)<=</span><span style="color: #008000;">'z'</span> <span style="color: #008080;">and</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">,</span><span style="color: #000000;">bo_ring</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">words</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">unix_dict</span><span style="color: #0000FF;">(),</span><span style="color: #000000;">az</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">wdsaz</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sort</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">))}))</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">found</span><span style="color: #0000FF;">={})</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">found</span><span style="color: #0000FF;">={}</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s:\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">w</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #000000;">w</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">lower</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">binary_search</span><span style="color: #0000FF;">({</span><span style="color: #000000;">w</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span><span style="color: #000000;">wdsaz</span><span style="color: #0000FF;">))</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">wdsaz</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #004080;">string</span> <span style="color: #000000;">ax</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">wdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">wdsaz</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">ax</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]!=</span><span style="color: #000000;">w</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">j</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ax</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">j</span><span style="color: #0000FF;"><</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">ax</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]></span><span style="color: #000000;">w</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">do</span> <span style="color: #000000;">j</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">></span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #000000;">ax</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]!=</span><span style="color: #000000;">w</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #000000;">j</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ax</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">aw</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">words</span><span style="color: #0000FF;">[</span><span style="color: #000000;">wdx</span><span style="color: #0000FF;">]</span> |
|||
<span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"!="</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">found</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">found</span><span style="color: #0000FF;">),</span><span style="color: #000000;">aw</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">sf</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sf</span><span style="color: #0000FF;">,</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sf</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #008000;">", "</span><span style="color: #0000FF;">)})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">extract</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">found</span><span style="color: #0000FF;">),</span><span style="color: #000000;">aw</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">({</span><span style="color: #008000;">"Rosetta"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"PureFox"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"PeteLomax"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Wherrera"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Thundergnat"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">test</span><span style="color: #0000FF;">)</span> |
|||
<!--</lang>--> |
|||
{{out}} |
|||
<pre> |
|||
Rosetta: |
|||
treat, so |
|||
sea, trot |
|||
east, rot |
|||
seat, rot |
|||
state, or |
|||
taste, or |
|||
oar, test |
|||
oat, rest |
|||
star, toe |
|||
as, otter |
|||
PureFox: |
|||
peru, fox |
|||
pure, fox |
|||
rex, of, up |
|||
PeteLomax: |
|||
exalt, poem |
|||
latex, poem |
|||
apex, motel |
|||
axe, elm, pot |
|||
axe, let, mop |
|||
axe, me, plot |
|||
atom, expel |
|||
moat, expel |
|||
Wherrera: |
|||
rare, wehr |
|||
rear, wehr |
|||
ware, herr |
|||
wear, herr |
|||
Thundergnat: |
|||
ad, tenth, rung |
|||
dragnet, hunt |
|||
dang, net, hurt |
|||
hard, gent, nut |
|||
gannett, hurd |
|||
agent, dr, hunt |
|||
hang, tend, rut |
|||
nag, tend, hurt |
|||
nag, thud, rent |
|||
rang, thud, net |
|||
ah, tend, grunt |
|||
ah, dr, gent, nut |
|||
haunt, dr, gent |
|||
tart, dung, hen |
|||
</pre> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |
Revision as of 16:14, 8 July 2022
There are already other tasks relating to finding existing anagrams. This one is about creating them.
Write a (set of) routine(s) that, when given a word list to work from, and word or phrase as a seed, generates anagrams of that word or phrase. Feel free to ignore letter case, white-space, punctuation and symbols. Probably best to avoid numerics too, but feel free to include them if that floats your boat.
It is not necessary to (only) generate anagrams that make sense. That is a hard problem, much more difficult than can realistically be done in a small program; though again, if you feel the need, you are invited to amaze your peers.
In general, try to form phrases made up of longer words. Feel free to manually reorder output words or add punctuation and/or case changes to get a better meaning.
- Task
Write an anagram generator program.
Use a publicly and freely available word file as its word list.
- unixdict.txt from http://wiki.puzzlers.org is a popular, though somewhat limited choice.
- A much larger word list: words_alpha.txt file from https://github.com/dwyl/english-words. May be better as far as coverage but may return unreasonably large results.
Use your program to generate anagrams of some words / phrases / names of your choice. No need to show all the output. It is likely to be very large. Just pick out one or two of the best results and show the seed word/phrase and anagram.
For example, show the seed and one or two of the best anagrams:
- Purefox -> Fur expo
- Petelomax -> Metal expo
.oO(hmmm. Seem to be detecting something of a trend here...)
J
Implementation:
<lang J>anagen=: {{
seed=. (tolower y)([-.-.)a.{~97+i.26 letters=. ~.seed list=. <;._2 tolower fread x ok1=. */@e.&letters every list ref=. #/.~seed counts=. <: #/.~@(letters,])every ok1#list ok2=. counts */ .<:ref c=. ok2#counts maybe=. i.1,~#c while. #maybe do. done=. (+/"2 maybe{c)*/ .=ref if. 1 e. done do. r=. ;:inv ((done#maybe) { ok2#I.ok1){L:0 1 <;._2 fread x if. #r=. r #~ -. r -:"1&tolower y do. r return. end. end. maybe=. ; c {{ <(#~ n */ .<:"1~ [: +/"2 {&m) y,"1 0 ({:y)}.i.#m }} ref"1(-.done)#maybe end. EMPTY
}}</lang>
Examples:
<lang J> 'unixdict.txt' anagen 'Rosettacode' cetera stood coat oersted coda rosette code rosetta coed rosetta create stood creosote tad derate scoot detector sao doctor tease doctorate se ostracod tee
'unixdict.txt' anagen 'Thundergnat'
dragnet hunt gannett hurd ghent tundra gnat thunder hurd tangent tang thunder
'unixdict.txt' anagen 'Clint Eastwood'
atwood stencil clio downstate coil downstate downcast eliot downstate loci edison walcott</lang>
Phix
Couldn't really think of a better way than just building a dirty great filter list to get rid of the less interesting answers....
with javascript_semantics constant bo_ring = {"al","alex","am","an","and","anent","ann","ant","ar","ares","art","at","ax","axle", "dan","dar","darn","dart","de","den","dent","dna","drag","du","dun","dunn", "ed","edt","eh","el","em","en","end","eng","erg","eros","est","et","eta","ex", "ga","gad","gar","garth","ge","ghent","gnat","gnu","grad","gu","ha","had","han", "hand","hart","hat","he","hut","la","lam","lao","lax","lee","leo","lo","lot", "ma","max","mao","mo","moe","mel","met","mt","nat","nd","ne","ned","nh","nne","nu", "opel","opt","ott","ox","pa","pax","pee","pl","pm","po","poe","rag","ran","rand", "rant","rat","rd","re","red","ret","rna","ruth","sa","sat","se","sort","st", "ta","tad","tag","tam","tamp","tao","taos","tan","tang","tangent","tanh", "tar","tat","tater","tau","tax","ted","tel","ten","tenant","tent","tern", "than","that","the","then","tn","tnt","to","top","tor","tort","tot","trag", "tsar","tun","tuna","tung","tx","un","ut","wa"} function az(string word) return min(word)>='a' and max(word)<='z' and not find(word,bo_ring) end function sequence words = filter(unix_dict(),az), wdsaz = sort(columnize({apply(words,sort),tagset(length(words))})) sequence seen = {} procedure test(string w, sequence found={}) if found={} then seen = {} printf(1,"%s:\n",{w}) w = sort(lower(w)) end if for i=abs(binary_search({w[1..1],0},wdsaz)) to length(wdsaz) do {string ax, integer wdx} = wdsaz[i] if ax[1]!=w[1] then exit end if sequence e = tagset(length(w)) e[1] = 0 integer j = 2 for k=2 to length(ax) do while j<length(w) and ax[k]>w[j] do j += 1 end while if j>length(w) or ax[k]!=w[j] then exit end if e[j] = 0 j += 1 if k=length(ax) then string aw = words[wdx] e = filter(e,"!=",0) if length(e)=0 then if length(found) then sequence f = append(deep_copy(found),aw), sf = sort(deep_copy(f)) if not find(sf,seen) then seen = append(seen,sf) printf(1," %s\n",{join(f,", ")}) end if end if else test(extract(w,e),append(deep_copy(found),aw)) end if end if end for end for end procedure papply({"Rosetta", "PureFox","PeteLomax","Wherrera","Thundergnat"},test)
- Output:
Rosetta: treat, so sea, trot east, rot seat, rot state, or taste, or oar, test oat, rest star, toe as, otter PureFox: peru, fox pure, fox rex, of, up PeteLomax: exalt, poem latex, poem apex, motel axe, elm, pot axe, let, mop axe, me, plot atom, expel moat, expel Wherrera: rare, wehr rear, wehr ware, herr wear, herr Thundergnat: ad, tenth, rung dragnet, hunt dang, net, hurt hard, gent, nut gannett, hurd agent, dr, hunt hang, tend, rut nag, tend, hurt nag, thud, rent rang, thud, net ah, tend, grunt ah, dr, gent, nut haunt, dr, gent tart, dung, hen
Raku
Using the unixdict.txt word file by default.
<lang perl6>unit sub MAIN ($in is copy = , :$dict = 'unixdict.txt');
say 'Enter a word or phrase to be anagramed. (Loading dictionary)' unless $in.chars;
- Load the words into a word / Bag hash
my %words = $dict.IO.slurp.lc.words.race.map: { .comb(/\w/).join => .comb(/\w/).Bag };
- Declare some globals
my ($phrase, $count, $bag);
loop {
($phrase, $count, $bag) = get-phrase; find-anagram Hash.new: %words.grep: { .value ⊆ $bag };
}
sub get-phrase {
my $prompt = $in.chars ?? $in !! prompt "\nword or phrase? (press Enter to quit) "; $in = ; exit unless $prompt; $prompt, +$prompt.comb(/\w/), $prompt.lc.comb(/\w/).Bag;
}
sub find-anagram (%subset, $phrase is copy = , $last = Inf) {
my $remain = $bag ∖ $phrase.comb(/\w/).Bag; # Find the remaining letters my %filtered = %subset.grep: { .value ⊆ $remain }; # Find words using the remaining letters my $sofar = +$phrase.comb(/\w/); # Get the count of the letters used so far for %filtered.sort: { -.key.chars, ~.key } { # Sort by length then alphabetically then iterate my $maybe = +.key.comb(/\w/); # Get the letter count of the maybe addition next if $maybe > $last; # Next if it is longer than last - only consider descending length words next if $maybe == 1 and $last == 1; # Only allow one one character word next if $count - $sofar - $maybe > $maybe; # Try to balance word lengths if $sofar + $maybe == $count { # It's an anagram say $phrase ~ ' ' ~ .key and next; # Display it and move on } else { # Not yet a full anagram, recurse find-anagram %filtered, $phrase ~ ' ' ~ .key, $maybe; } }
}</lang>
- Truncated to only show the best few as subjectively determined by me:
Punctuation, capitalization and (in some cases) word order manually massaged.
Enter a word or phrase to be anagramed. (Loading dictionary) word or phrase? (press Enter to quit) Rosettacode doctor tease word or phrase? (press Enter to quit) thundergnat dragnet hunt Gent? Nah, turd. word or phrase? (press Enter to quit) Clint Eastwood downcast eliot I contest waldo nose to wildcat
Wren
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>
- Output:
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