Integer to RomanNumeral in Haskell
意味があるかどうかわからないけど、なんとなく書いてみた。
戦略は Erlang の場合と同じ。なんとなく Erlang の時よりすっきりしている気がしなくもない。
convert.hs
main = putStrLn $ unlines $ map i2r [1..4999]
old_roman_unit :: Int -> Char
old_roman_unit n
| n == 1000 = 'M'
| n == 500 = 'D'
| n == 100 = 'C'
| n == 50 = 'L'
| n == 10 = 'X'
| n == 5 = 'V'
| n == 1 = 'I'
| otherwise = 'Q' -- 本当は例外?を投げたい気がする
i2r :: Int -> String
i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] []
i2r2 :: Int -> [Int] -> String -> String
i2r2 _ [] str = str
i2r2 n (u:us) str =
i2r2 (n `mod` u) us (str ++ replicate (n `div` u) (old_roman_unit u))
最後の行がちょっと微妙な気がする。誰か Haskell っぽく書くとこうなるってのを教えてくれるとうれしい。
今度逆も書いてみる。
Posted in Programming | コメントはありません | atom