Ruby
programming

Wantedlyエンジニア新人研修(コーディング)

More than 5 years have passed since last update.


概要



  • AIZU ONLINE JUDGEを使用。

  • ICPC国内予選の問題(Volume 11)の3番目まではどの年の問題でも最低限解けるようにするのが目標。

  • 他にも、"Course"タブに使うアルゴリズムごとに別れた問題があるのでそれをやってもいいかも。

ICPC国内予選の3問目までと言うのは、特に難しいアルゴリズムの問題が出るわけではないので、バグを生みにくいくてサクッと書ける綺麗なコード設計をする良い練習になる。

具体的には以下の様な特徴がある。


  • 1問目はやるだけの問題。if文、ループ、配列を使った基本的な操作ができればいいものが多い。

  • 2問目は少し複雑な実装問題で、データをどう持つかなどの設計力が問われる。

  • 3問目は大抵、再帰構造が書けるかどうかが問われる問題が出る


システムに慣れる


ユーザー登録

まずはRegistration。自分はAffiliationにカンマを入れたら登録できなかった。

ソースコードなんて隠しても仕方ないのでSource Code Policy(提出ソースコードの公開)をpublicにする。


言語選び

使える言語とバージョンは以下のページに書いてある。

http://judge.u-aizu.ac.jp/onlinejudge/status_note.jsp?tab=2

例えば、Cで1秒で終わるプログラムがRubyだと10秒かかるなどということもあるので、言語間でタイムリミットやメモリリミットにハンデが付けられている。

この表によるとRubyはCの5倍遅いプログラムでも大丈夫らしい。


実際に提出してみる

あっているプログラムが書けても、出し方が間違っていてうまくいかないこともあるのでまずは、

Hello World (出力のみ)

を出してみる。C/C++/Javaに関しては答えがあるので、そのままコピペで出してみれば良い。

Javaの人はClass名をMainにしないと通らないので注意。

Rubyの場合は

puts "Hello World"

でOK。


もう少し肩慣らし

先ほどの問題は入力を取らなかったので、入力の取り方も含め以下の

問題で肩慣らしする。

X Cubic 1行1入力

Rectangle 1行2入力

Standard Deviation 複数入力

ここにある問題は基本的に全て入力は標準入力からとって、標準出力に答えを吐き出す形式なのでとりあえず使う言語の標準入出力のやり方を調べると良い。

言語のバージョンなどは少し情報が古いが、ここにいろいろな言語の書き方がまとまっている。

今流行りのエディタSublimeText2を使って、AOJで競技プログラミングを楽しもう


ローカルでのRubyの実行の仕方

textファイルを作って入力をコピー


in.txt

5

70 80 100 90 20
3
80 80 80
0

以下のように実行

$ ruby Standard_Deviation.rb < in.txt


Rubyでの解答例

こんなところで詰まってもしかたがないと思うので解答例を書いておく


X_Cubic


X_Cubic.rb

puts gets.to_i ** 3



Rectangle


Rectangle.rb

a, b = gets.split.map(&:to_i)

puts [a*b, (a+b)*2].join ' ' # puts "#{a*b} #{(a+b)*2}"

(scanf/printfを使ったパターン)


Rectangle.rb

require 'scanf'

a, b = gets.scanf("%d %d")
printf("%d %d\n", a*b, (a+b)*2)


Standard Deviation


Standard_Deviation.rb

while (n = gets.to_i) != 0 do

ss = gets.split.map(&:to_i)
m = ss.reduce(:+).to_f / ss.size
alpha_2 = ss.map{|s| (s - m) ** 2}.reduce(:+) / ss.size
puts Math.sqrt(alpha_2)
end

map, reduceで書いてる部分はどうでもよくて、覚えて欲しいのは

while (n = gets.to_i) != 0 doの部分。この形はよく使うはず。

gets.split.(&:to_i)というパターンもよく使う。

引数なしのsplitは優秀なので気づかないかもしれないがgetsの結果は最後の改行が含まれるので、gets.splitgets.chompのどちらかで使うこと


結果の見方

いきなり上手く行けばAcceptedとなるが、結構そうは行かない。

答えが間違っているのはWrong Answerだが、それ以外の問題も結構あるCompile Error, Runtime Error, Time Limit Exceededなどそれぞれの判定結果の意味は以下のページで知れる。

http://judge.u-aizu.ac.jp/onlinejudge/status_note.jsp


もっと練習したい人

もう少しやりたい人は

Introduction to Programming I

のコースの中から選んで見ると良いかも。


1回目

誰もICPCをやったことがなかったので、現状最新の2013年度から行く。

日本語もあるので、日本語でやりたい人は日本語でOK

ICPCは言語がC,C++,Javaに固定されているがここはなんでもOK

WantedlyはRubyを使っているのでRubyでやるのがいいかも


ProblemA.rb

while (line = gets) do

h, w = line.split.map(&:to_i)
break if h == 0 && w == 0

# your code here

end



ProblemB.rb

loop do

# RubyではM,T,R,Pと大文字にすると定数になるため同じ文字を重ねた
mm, tt, pp, rr = gets.split.map(&:to_i)
break if mm + tt + pp + rr == 0

# your code here

end