AtCoder Regular Contest 006 参加してみた
001 を試しに 2 問解いた翌日に本大会に参加するというセルフ無茶振り.今回も A と B しか挑戦できませんでしたが両方とも一発で AC もらえました.が,やっぱり不慣れなせいか失敗が続出.というかそもそもプログラミング自体が不慣れだった.まあ勉強勉強.
rightnum = gets.chomp.split.map(&:to_i) bonus = gets.to_i takahashinum = gets.chomp.split.map(&:to_i) match = rightnum & takahashinum case match.length when 6 puts 1 when 5 if takahashinum.include?(bonus) puts 2 else puts 3 end when 4 puts 4 when 3 puts 5 else puts 0 end
方針
2 つの配列を作って 2 重ループで全ての組み合わせを検証しなきゃダメかな? と思ったけどそういえば配列って積取れるよな,ということを思い出したのでその方針で.それに length メソッドくっつければちょうど一致してる数値の個数が返ってくるからそれを case で使えばいいねってのを連想できたので良かった.
- 1 行目:
gets.chomp.split.map(&:to_i)
は早速覚えた.文字列入力→末尾改行削除→空白文字で分割して配列に→それぞれの要素を整数型にキャスト.ただ最後の map メソッドの引数の"&:"の意味がよく分かってない.たぶん2つは別々のものなんだろうけど." : " はシンボル? として "&" って何だったっけ…… - 4 行目:またここで積と間違えて和を取ってました.死.何で幾つかサンプル通ったんだろう…….このミスに気づかず 20 分近く取られた.次回以降入念にチェックしましょう
- 10 行目:Array#include? は返り値がブール変数なので if とかの真偽判定に使えるから便利.覚えたい.こういう探す系のメソッドの "?" って分かりやすいよね.かわいい女の子が首かしげて訊いてるイメージ
- ちなみに Ruby 内で実行速度 2/17 位タイ ( 59ms )でした.地味に嬉しい
nl = gets.chomp.split.map(&:to_i) amida = [] nl[1].times do amida << gets end place = gets.index("o") nl[1].downto(1) do |l| if amida[l-1].slice(place-1,1) == "-" place -= 2 elsif amida[l-1].slice(place+1,1) == "-" place += 2 end end puts place/2+1
方針
見た瞬間死んだと思った.AC 2 つ取れれば嬉しいなーと思ってたけど今回は無理だと悟った.諦めずに考えてみた.あみだくじを 1 行ずつ読み込んで文字列のまま配列に突っ込んで,下から上に上がるので添字は小さくなっていくから downto メソッドを使って,自分が今居る位置の右か左に横棒があればその方向に移動して downto で回して一番上に行けば最後の返り値が求められてる場所なんじゃね? と思って頑張って組んでみた.ググってみたら String#slice メソッドを発見したのでそれを利用してみた.
- 1 行目:他人のコードを覗いてみると,どうも
n, l = gets.chomp.split.map(&:to_i)
ってやっちゃっていいらしい.変数は問題文と同じ方が当然分かりやすいので次回からそうしよう.変数スワップのa, b = b, a
の時も思ったけどつくづく Ruby の仕様は際限なく気違いだと思う - 6 行目:String#index メソッドは n 文字目で返してくれるので分かりやすい.使いやすい.考えやすい
- 16 行目:
place
はあくまで何文字目かを表してるから何らかの加工をしないとあみだくじの位置にはならないよなー,と思いつつ何回かサンプルを通してみたらやっぱり 2 で割って 1 を足すと正答になるらしい.当たれと思いながらplace/2+1
と乱暴に加工して提出.程なくして AC.超感動
反省と感想
和と積間違えないようにします.余裕を持って C に行って悩んだまま終わりたい.それにしてもあみだくじは自分にしてはよく頑張ったなあと思える.自信にしたい.
コメント
コメントを投稿