Isa@Diary

ソフトウェア開発やってます。プログラミングとか、US生活とかについて書きます。

Haskell練習

すごいH本

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!


を買ってIOまで一通り読んだので書いて覚えていこうと。
Codeforcesの簡単な問題をいくつか解いて入出力に慣れていく予定。

練習1

http://www.codeforces.com/problemset/problem/194/A

ソース

solve [a,b]
      | b `div` a >= 3 = 0
      | otherwise = a - (b `mod` a)
main = interact $ show . solve . map (read::String->Int) . words

空白区切りされた数字を読み込むにはwordsでStringのリストにしたものをreadで変換すればいいっぽい。
interactを使うと実行するたびにEOFを入力しないといけなくてめんどい。

練習2

http://www.codeforces.com/problemset/problem/208/A

solve [] ('W':'U':'B':xs) = solve [] xs
solve ret ('W':'U':'B':xs) = reverse ret:solve [] xs
solve ret (x:xs) = solve (x:ret) xs
solve ret [] = reverse ret : []

main = do
     line <- getLine
     putStrLn (unwords $ solve [] line)

パターンマッチ便利す。

練習3

http://www.codeforces.com/problemset/problem/205/A

solve::Int -> Int -> [(Int,Int)] -> String
solve ret tmp (x:xs)
      | tmp > (snd(x)) = solve (fst(x)) (snd(x)) xs
      | tmp == (snd(x)) = solve (-1) tmp xs
      | otherwise = solve ret tmp xs
solve ret _ []
      | ret == (-1) = "Still Rozdil"
      | otherwise = show ret

main = do
     num <- getLine
     args <- getLine
     let l = zip [1..] $ map (read::String->Int) $ words args
     putStrLn(solve 0 (2^30) l)

IntからStringへの変換はshowを使えば良い。無限リストを使って1,2,3,...というindexを
付加するのが楽なのもよい。

おわりに

結構面白いかもしれない。ただTLEやらMLEを見積るのが難しいのと、デバッグしにくいのは
難点かもなぁ。
->http://d.hatena.ne.jp/kazu-yamamoto/20120606/1338957783
こんなんありました。