89問目
http://projecteuler.net/index.php?section=problems&id=89
与えられたローマ数字を最小限の数字で表現するとき、どれだけの数字が節約できるか求める。
最初は与えられたローマ数字をいったん自然数に変換してから再度ローマ数字に戻していたのですが、ローマ数字のままで置換した方が簡単でした。(Euler problems 89 - HaskellWiki と同じです。すみません。)
やっぱりまだ euler089 s = length s - (length $ minimal s) をポイントフリースタイルで書くことができません。λabcd.abd(bcd) ?
main = do roman <- readFile "roman.txt" print $ euler089 roman euler089 :: String -> Int euler089 s = length s - (length $ minimal s) minimal :: String -> String minimal s = foldl (flip replace) s romans replace :: (String, String) -> String -> String replace (a, b) "" = "" replace (a, b) (x:xs) = if ls == a then b ++ replace (a, b) rs else x : replace (a, b) xs where (ls, rs) = splitAt (length a) (x:xs) romans :: [(String, String)] romans = [("DCCCC", "CM"), ("CCCC", "CD"), ("LXXXX", "XC"), ("XXXX", "XL"), ("VIIII", "IX"), ("IIII", "IV")]