AtCoder Regular Contest 001 やってみた

テレビでサマーウォーズやってましたね.見なかったけど.その時ツイッターを見ていたら,ふと「初心者プログラマー向けのプログラミングコンテスト“AtCoder”に参加してみましょう!」的なツイートを見かけたのでググってみた.ら,結構問題が簡単そうだったのでチャレンジしてみました.以下ネタバレ.問題はここ.A,Bは見た目簡単そうなので挑戦してみた.Cは時間があるときにゆっくり考える.というかまず他の回のAとBをやってから.Dは見ただけで頭がおかしくなりそうだったのでパス.ランキング見たら殆どの人が提出してない.捨て問…….

problems = gets
answer_queue = gets

answer1 = 0
answer2 = 0
answer3 = 0
answer4 = 0

answer_queue.each_char do |i|
  case i
  when "1"
    answer1 += 1
  when "2"
    answer2 += 1
  when "3"
    answer3 += 1
  when "4"
    answer4 += 1
  end
end

right_answer = [answer1, answer2, answer3, answer4].sort
puts "#{right_answer[3]} #{right_answer[0]}"
  • 1行目:予想してたけどRubyだと読みこむ意味がなかった.C++とかでループのカウンタに必要なんだろうか.今回は問題の都合上入力を受け付けないといけないので形式的に
  • 4-7行目:さすがに変数の初期化はしなきゃいけないらしい.突然ローカル変数に代入したら怒られた
  • 9行目:Rubyで文字列を1文字ずつ読み込む方法は知らなかった.調べてみたけど最初はeach_byteメソッドを使ってしまっていたので何をどうしても上手く行かなかった.byteの違和感は何となく感じ取ってはいたけど……
  • 11行目とか:case式のwhenに置くオブジェクトは当然ブロック内変数の型に合わせなきゃいけない.ここでは文字を切り出してるのでダブルクォーテーションが必要(今考えてみれば1文字だけだからシングルクォーテーションでもよかった?).最初にここを省いてしまって1とか2とか入力してしまっていたのも良くなかった
  • 22-23行目:選択肢の数を数えて配列に突っ込んで昇順にソートして最後の要素と最初の要素を出力したけど,他人のコードをのぞかせてもらったところどうもmax,minメソッドがあるらしい.もっとよく調べましょう.てかそれ以前に最初添字を[4]と[1]にしてたんだけどもうありえないミスだよねこれは
  • ていうかせっかくRuby使ってるんだから正規表現使って文字ごとにパターンマッチした数を配列に突っ込んでみたかったけど面倒だからまた今度調べよう
  • あと標準出力中の#{変数}記法もたまたま調べてて知ったんだけどこれ超便利じゃん何でどの入門書にも書いてないの
ondo = gets.chomp.split
a = ondo[0].to_i
b = ondo[1].to_i
i = 0

while a != b
  if a-b >= 8
    a -= 10
    i += 1
  elsif a-b >= 3 && a-b <= 7
    a -=5
    i += 1
  elsif a-b == 2 || a-b == 1
    a -= 1
    i += 1
  elsif (a-b == -1) || (a-b == -2)
    a += 1
    i += 1
  elsif (a-b <= -3) && (a-b >= -7)
    a += 5
    i += 1
  else
    a += 10
    i += 1
  end
end

puts i
  • 1行目:標準入力で2数値を取得!→改行を削除!→スペース文字で分割して配列に突っ込む! 分かりやすい! 素晴らしい! これだからRuby好き.ただ改行削除しなきゃいけないのに気づかなくてちょっと躓いた.これからは気をつけましょう.
  • 2-3行目:引き算する時はさすがに整数型にキャストしなきゃいけないらしい.文字リテラルのままでも文字コードで引き算してうまくいくかなーと思ったけどそれじゃ二桁のとき文字列リテラルになるから上手くいかない
  • 6-26行目:お前は小学生かと思われそうなコード.ホワイトボードでちゃんと場合分けしたよ!! 状態遷移図ってこういう時に使うのかなって思った.差は絶対値にすると楽かなーと思ったけどそうするとどうしても正負分けでif文ネストしなきゃいけなさそうで面倒だったのでやっぱやめた.
  • 10,19行目:なんとこの行の&&を||にしてました.差が3以上または7以下って恒真だってことになぜ気付けなかったのか.どんな数値を入れてもiが出力されすらしないので「もしかしてwhileで無限ループ起こしてるのかな?」と思いwhileの中にputs "#{a} #{b}"を追加し再実行.案の定ものすごい勢いでaが減算されていた.いくつ引かれてるのか分からなかったのでwhileだけコメントアウトしてみたら10行目でifが実行されてた.ここでようやく論理演算子が間違ってたことに気づく

感想.プログラミングコンテストの問題を解く,そしてACをもらうのは両方始めてだったけど楽しかったです.求められてるものに対して自分でコードを組めるようになるとやっぱり楽しい.あと1発で通ることは絶対なくて,いろんなことを調べさせられたのですごく勉強になった.これはまだ1回目の問題で,あと第5回まで,それと今日第6回があるので,可能なら参加してみたいなあと思いました.こういうの他にも探して解いてみたいなあ.

コメント

このブログの人気の投稿

慶大プレ小論文

改名