wvogel日記

自分用の技術備忘録が多めです.

何故.....codeforces(解決済)

Haskellで今日も、簡単なものを解いてみた。
が、なぜかruntime errorとかで通らない

手元でやるとどれも一瞬で答え出るし、環境もそれほどよくはないから問題はないはずなんだけど

問題はこちら

import Control.Monad

main = do n <- getContents
          forM_ (map (fromCentimeter.read) $ lines n) putStrLn

fromCentimeter :: Int -> String
fromCentimeter n = show (feet n) ++ " " ++ show (inch n)

inch :: Int -> Int
inch n = case n `mod` 3 of
                2 -> 1+ div n 3 - 12 * feet n
                otherwise -> (div n 3) - 12 * feet n

feet :: Int-> Int
feet n = div (div n 3) 12
これで10数個くらいは通るのだけど、途中でRUNTIME ERRORが出る.....
詳細を見ると、不調とかではなく、答えが出力されていない。
そんな無茶苦茶なコードでもないし、さっぱりわけがわからない。
どなたか分かる方いたら教えてください

ということで悩んでいたのですが、
getContentsで改行文字も読み込んでしまっているためだろう、
と、route150さんに意見を頂きました。

確かにgetContentsからではそうなりますね.....忘れてた
実際、getLine使って書きなおすと巧く行きました!


上のコードでは、
inch == 12
のときの対応が出来ていないのでそこを修正したものがこちら

import Control.Monad

main = do n <- getLine
          forM_ (map (fromCentimeter.read) $ lines n) putStrLn

fromCentimeter :: Int -> String
fromCentimeter n = show (feet n + div (inch n) 12)
                           ++ " " ++ show (inch n `mod` 12)

inch :: Int -> Int
inch n = case n `mod` 3 of
                2 -> 1+ div n 3 - 12 * feet n
                otherwise -> (div n 3) - 12 * feet n

feet :: Int-> Int
feet n = div (div n 3) 12

解決しました!
route150さん、ありがとうございます