/* Letter frequency (Rosetta code) in Picat. http://rosettacode.org/wiki/Letter_frequency """ Open a text file and count the occurrences of each letter. Some of these programs count all characters (including punctuation), but some only count letters A to Z. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => go. go => % Chars = read_file_chars("letter_frequency.pi"), Chars = delete_all(read_file_chars("unixdict.txt"),'\n'), M = letter_freq(Chars), println(sort_keys=M.sort_map(values).reverse), % sort on values (much slower on large files) % println(sort_values=M.sort_map(values)), % slower % M2 = [ C=sum([1 : CC in Chars, CC=C]) : C in Chars.remove_dups().sort()], % println(M2), nl. letter_freq(S) = Map => Map = new_map(), foreach(C in S) Map.put(C,Map.get(C,0)+1) end. sort_map(Map,values) = [K=V:_=(K=V) in sort([V=(K=V): K=V in Map])]. sort_map(Map,keys) = sort([KV : KV in Map]). sort_map(Map) = sort_map(Map,keys).