Skip to content

Instantly share code, notes, and snippets.

@msszczep
Created April 13, 2019 13:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msszczep/2460ff0098768b6e2c22f476aa1dd5f6 to your computer and use it in GitHub Desktop.
Save msszczep/2460ff0098768b6e2c22f476aa1dd5f6 to your computer and use it in GitHub Desktop.
Subanagram script in Erlang (from May 11, 2008)
#!/usr/bin/env escript
% This is an Erlang version of the subanagram generator.
% It works far faster and the code is far shorter.
% It takes a word at the command line as an argument.
% e.g.: `./subanagram_prototype.erl representative`
% It delivers as output the words that are eligible subanagrams, ordered in length from shortest to longest,
% along with the number of points from each word, assuming no double or triple letter or word squares.
% Note: You need a file of words, one word per line, in the same directory as
% the script.
main([Original_word]) ->
List_of_words = file_parse("ospd3.txt"),
Subanagrams = sa_function(string:to_lower(Original_word), List_of_words),
Subanagram_sublists = lists:map(fun(Word_length) -> get_length(Subanagrams, Word_length) end, [2,3,4,5,6,7,8]),
print_sorted_lists(Subanagram_sublists).
print_sorted_lists(Sorted_lists) ->
lists:map(fun(Sorted_list) -> print_line(Sorted_list) end, Sorted_lists).
print_line(Sorted_list) ->
Points_list = dict:from_list([{$a, 1}, {$b,3}, {$c, 3}, {$d, 2}, {$e, 1}, {$f, 4}, {$g, 2}, {$h, 4}, {$i, 1}, {$j, 8}, {$k, 5}, {$l, 1}, {$m, 3}, {$n, 1}, {$o, 1}, {
$p, 3}, {$q, 10}, {$r, 1}, {$s, 1}, {$t, 1}, {$u, 1}, {$v, 4}, {$w, 4}, {$x, 8}, {$y, 4}, {$z, 10}]),
lists:map(fun(Word) -> io:fwrite("~s ~w~n", [Word, lists:sum(lists:map(fun(Letter) -> dict:fetch(Letter, Points_list) end, Word))]) end, Sorted_list).
get_length(List_of_words, Length_to_search_for) ->
lists:filter(fun(Word) -> length(Word) =:= Length_to_search_for end, List_of_words).
file_parse(File) ->
{ok, S} = file:open(File, [read,binary,raw]),
Size = filelib:file_size(File),
{ok, B1} = file:pread(S, 0, Size),
string:tokens(binary_to_list(B1), "\n").
sa_function(Original, List_of_words) ->
lists:filter(fun(Subanagram) -> length(Subanagram -- Original) =:= 0 end, List_of_words).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment