public
Last active

  • Download Gist
anagram.hs
Haskell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import List
import qualified Data.Map as Map
 
-- Given as stdin
-- presents
-- serpents
-- no
-- on
-- whatever
-- Expected Output:
-- [["serpents","presents"],["on","no"]]
 
-- This version only displays words that have more than one
-- match in the list, and sorts by the words that got the most matches.
 
-- Can we do the map bit better?
 
main = do
input <- getContents
print $ anagrams $ lines input
 
anagrams words =
sorted_anagrams
where
sorted_anagrams = sortBy sorter filtered_anagrams
sorter a b = compare (length b) (length a)
filtered_anagrams = Map.elems $ Map.filter filter_function all_anagrams
filter_function words = length words > 1
all_anagrams = do_anagrams words Map.empty
do_anagrams [] result = result
do_anagrams words result = do_anagrams
(tail words)
(Map.unionWith
(++)
(Map.fromList [(sorted_current_word, [current_word])])
result)
where
current_word = head words
sorted_current_word = sort current_word
anagram.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12
input = STDIN.read.split("\n")
result = Hash.new([])
input.each do |word|
sorted_word = word.split('').sort.join
result[sorted_word] += [word]
end
values = result.values.sort { |a, b| b.size <=> a.size }
p values[0..3]

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.