ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

さっそく簡単な問題を解いてみた

感想


その結果

解いてみた問題

ものすごく簡単な問題です。
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押したら謎のエラーは出るわ、それは大変でした。あと型推論を一応してくれるのですが、ときどきこちらで明示しなければいけないところがあって、それが原因でコケることが多くてもにょもにょしてました。計算させるところは思った通りの感じでだいたいすんなりかけるので、そこはいいところ。