はむへい’s diary

ねむいです。

AtCoderの精進問題集10問をRubyで解いてみた。

はじめに

けんちょんさんが選んだAtCoderの精進問題集10問をC++以外の言語で解くブームが来ているそうで、最近バイトで使い始めたRubyを用いて解いてみることにした。なお、細かい解説は本家↓を参照して欲しい。

qiita.com

競プロの問題をRubyで解くのはほぼ初めてなので、標準入出力から調べた、せっかくなのでそこから記そうと思う。

Rubyにおける標準入出力

以下のようにかける

整数の入力

ひとつの整数Nが与えられるケース

一つのN

 

空白区切りに整数N,Mが与えられるケース

空白区切りN

 

空白区切りに整数の配列hogeが与えられるケース

配列

 

N行に渡り整数の配列mokeが与えられるケース

複数行に渡り配列

 

 

文字列の入力

文字列

 

出力

出力

 

ここから問題を解いてみたゾーン

第1問:ABC 086 A - Product

ABC086A

 

第2問:ABC 081 A - Placing Marbles 

.countメソッドによって当該要素の数を数えられる

gistf72a8712321589617402e88fa7a7a1cc

 

第3問:ABC 081 B - Shift only

要素の中で2で割れる回数が最も小さいものが答えとなります(c++にあるmax,min関数はないっぽいので三項演算子を使ってます)

ABC081B

 

第4問:ABC 087 B - Coins

Rubyのfor文はc++でいうrange_based_for的なものなので、回数を保持したいならこんな感じに書くしかないっぽい(良い方法があったら教えてください) 

ABC087B

第5問:ABC 083 B - Some Sums 

ABC083B

第6問:ABC 088 B - Card Game for Two

 逆順ソートのやり方がわからなかったので、普通のソートをしてからひっくり返した。

ABC088B

第7問:ABC 085 B - Kagami Mochi

 .uniq!関数で重複要素を削除してくれるのでそれを使おう。

ABC085B

第8問:ABC 085 C - Otoshidama

空白区切りで出力しなさいって時に、 puts "#{a} #{b} #{c}"

こんな感じで記述するとよさげ。(文字列の中に変数の値を組み込んでいる。)

exitはプログラムを終了させるものだが、同じような機能のexit!とを用いるとAtCoderではREを吐いたので注意が必要。

ABC085C

第9問:ABC 049 C - 白昼夢 / Daydream

 文字列をreverse!すると改行文字が先頭に来てしまうので、ひっくり返す前にchomp!するのが吉。

異常に実行時間の短い提出を見つけたので見てみたら正規表現を用いて解いていて、一行のコードでACしているものもあった、競プロで戦略的にRubyを用いるなら正規表現をマスターしたほうが良さそうだ。(調べたらC++にも正規表現はあるらしい)

ABC049C

第10問:ABC 086 C - Traveling

二次元的に入力があたえられたが、落ち着いて処理すれば問題ない。

今回は各行の要素数が3で固定されているので、配列を3つ用いて処理した。

ABC086C

さいごに

RubyはABCの問題レベルでは十分に戦うことができることがわかった。

C++との比較を交えて記しているので、真のwebエンジニアがAtCoderを始める教材としてはとても読みにくいものとなってしまった。反省。