torus711 のアレ

主に競技プログラミングの問題について書きます

AtCoder Regular Contest #011, B : ルイス・キャロルの記憶術

概要

数字を文字に置き換えて、数字を暗記する方法について考える。
変換ルールと英文が与えられるので、各単語を数字に変換せよ。

解法

変換ルールをそのまま実装すれば解けます。
以下の実装では、余計な文字を除去するために filter にかけ、その後一旦 words することで先頭のスペースを消しています。

コード

import Control.Applicative
import Control.Monad
import Data.List
import Data.Char

main = do
	getLine
	lines <- words . filter ( not . isVowelDot ) . map toLower <$> getLine
	putStrLn $ unwords . map ( map convert ) $ lines

isVowelDot :: Char -> Bool
isVowelDot = ( `elem` "aeiouy,." )

convert :: Char -> Char
convert c
	| c `elem` "bc" = '1'
	| c `elem` "dw" = '2'
	| c `elem` "tj" = '3'
	| c `elem` "fq" = '4'
	| c `elem` "lv" = '5'
	| c `elem` "sx" = '6'
	| c `elem` "pm" = '7'
	| c `elem` "hk" = '8'
	| c `elem` "ng" = '9'
	| c `elem` "zr" = '0'
	| otherwise = c