Life Goes On

まあまあだけど楽しんでる方です

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")]