Jump to content

Textonyms: Difference between revisions

m
→‎{{header|Haskell}}: hlint, hindent – minor tidying
m (C code modified to use GLib I/O functions to load the dictionary)
m (→‎{{header|Haskell}}: hlint, hindent – minor tidying)
Line 821:
=={{header|Haskell}}==
<lang haskell>import Data.Maybe (isJust, isNothing, fromMaybe)
import Data.List (sortBy, groupBy)
import Data.Char (toUpper)
import Data.List (sortBy, groupBy)
import Data.Function (on)
 
toKey :: Char -> Maybe Char
toKey ch
| ch < 'A' = Nothing
| ch < 'D' = Just '2'
| ch < 'G' = Just '3'
| ch < 'J' = Just '4'
| ch < 'M' = Just '5'
| ch < 'P' = Just '6'
| ch < 'T' = Just '7'
| ch < 'W' = Just '8'
| ch <= 'Z' = Just '9'
| otherwise = Nothing
 
toKeyString :: String -> Maybe String
toKeyString st =
| any letisNothing mch = map (toKey.toUpper) st Nothing
| otherwise else= Just $ map (fromMaybe '!') mch
in if any isNothing mch then Nothing
where
else Just $ map (fromMaybe '!') mch
mch = map (toKey . toUpper) st
 
showTextonym :: [(String, String)] -> IO ()String
showTextonym ts = do
let keyCode = fst $ (head ts) ++
" => " ++
putStrLn $ keyCode ++ " => " ++ concat [w ++ " " | (_,w) <- ts ]
concat
putStrLn[ w ++ " "
| (_, w) <- ts ]
 
main :: IO ()
main = do
let src = "unixdict.txt"
contents <- readFile src
let wordList = lines contents
 
keyedList =
let wordList = lines contents
[ (key, word)
keyedList = [(key, word) | (Just key, word) <- filter (isJust.fst) $ zip (map toKeyString wordList) wordList]
| (Just key, word) <-
groupedList = groupBy ((==) `on` fst) $ sortBy (compare `on` fst) keyedList
textonymList = filter ((>1)isJust . lengthfst) groupedList$ zip (map toKeyString wordList) wordList ]
groupedList = groupBy ((==) `on` fst) $ sortBy (compare `on` fst) keyedList
 
textonymList = filter ((> 1) . length) groupedList
putStrLn $ "There are " ++ show (length keyedList) ++ " words in " ++ src ++ " which can be represented by the digit key mapping."
mapM_ putStrLn $
putStrLn $ "They require " ++ show (length groupedList) ++ " digit combinations to represent them."
[ "There are " ++
putStrLn $ show (length textonymList) ++ " digit combinations represent Textonyms."
show (length keyedList) ++
putStrLn ""
putStrLn "Top 5words in ambiguity:" ++
putStrLn $ "There are " ++ show (length keyedList) ++ " words in " ++ src ++ " which can be represented by the digit key mapping."
mapM_ showTextonym $ take 5 $ sortBy (flip compare `on` length) textonymList
putStrLn, "They require " ++
putStrLn $ "They require " ++ show (length groupedList) ++ " digit combinations to represent them."
putStrLn "Top 5 in length:"
putStrLn $, show (length textonymList) ++ " digit combinations represent Textonyms."
mapM_ showTextonym $ take 5 $ sortBy (flip compare `on` (length.fst.head)) textonymList </lang>
, ""
, "Top 5 in ambiguity:"
] ++
mapM_fmap showTextonym $ (take 5 $ sortBy (flip compare `on` length) textonymList) ++
putStrLn["", "Top 5 in length:"] ++
fmap
showTextonym
mapM_ showTextonym $ (take 5 $ sortBy (flip compare `on` (length . fst . head)) textonymList )</lang>
{{out}}
<pre style="font-size:80%">There are 24978 words in unixdict.txt which can be represented by the digit key mapping.
9,659

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.