さっそく簡単な問題を解いてみた
感想
Haskell結構面白いんだけど、入出力回りがものすごくだるい
— ゆうなんとか@ジョウト地方さん (@yuu_hara) 2013年5月24日
その結果
いまいち萌えないコード[ついっか]
— ゆうなんとか@ジョウト地方さん (@yuu_hara) 2013年5月25日
ができあがってしまった[ついっか]
— ゆうなんとか@ジョウト地方さん (@yuu_hara) 2013年5月25日
解いてみた問題
ものすごく簡単な問題です。
A: センター採点 - AtCoder Regular Contest #001 | AtCoder
要は与えられた文字列をひとつづす数えて、最も多いものと最も少ないものの数を出力する、というものです。早速Haskellで解いてみて無事にACをもらった解答例がこちら。
main = do getLine y <- getLine let answer = map (\c -> read [c]::Int) y let ca = map (\a -> length (filter (== a) answer)) [1..4] let best = maximum ca let worst = minimum ca let result = show best ++ " " ++ show worst putStrLn result
あまり綺麗じゃないのはお察しください。
ちなみにこのコンテストに参加した時にRubyで書いたものがこちら。今から1年以上前に書いたひどいコードです。エラー処理とか書いているのと、まだ不慣れだったのとでかなり長くなってます。こちらもお察しください。
gets questions = $_.to_i gets answers = $_ numbers = [0,0,0,0] if questions >= 1 && questions <= 100 then if answers.length-1 == questions then answers.each_byte{|c| unless c == 10 then numbers[(c.to_i)-49] = numbers[(c.to_i)-49] + 1 end } else puts "問題数と解答の文字列数が違います" return end else puts "問題数は1から100までです" return end puts "#{numbers.max} #{numbers.min}"
今同じものを書くとしたらこうですね。
gets count = gets.strip.chars.group_by{|a| a }.map{|g| g[1].length } puts "#{count.max} #{(count.min if count[1]).to_i}"
何が難しかった?
冒頭の通り入出力をまともに使えるようになるまでかなり時間がかかりました。入力を受け付けるまでに何度もコケるわ、何か入力してEnter押したら謎のエラーは出るわ、それは大変でした。あと型推論を一応してくれるのですが、ときどきこちらで明示しなければいけないところがあって、それが原因でコケることが多くてもにょもにょしてました。計算させるところは思った通りの感じでだいたいすんなりかけるので、そこはいいところ。