Wantedlyエンジニア新人研修（コーディング）


## 概要

- [AIZU ONLINE JUDGE](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)を使用。
- ICPC国内予選の問題(Volume 11)の3番目まではどの年の問題でも最低限解けるようにするのが目標。
- 他にも、"Course"タブに使うアルゴリズムごとに別れた問題があるのでそれをやってもいいかも。

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

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

- １問目はやるだけの問題。if文、ループ、配列を使った基本的な操作ができればいいものが多い。
- ２問目は少し複雑な実装問題で、データをどう持つかなどの設計力が問われる。
- ３問目は大抵、再帰構造が書けるかどうかが問われる問題が出る



## システムに慣れる

### ユーザー登録

まずは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](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_A) (出力のみ)

を出してみる。C/C++/Javaに関しては答えがあるので、そのままコピペで出してみれば良い。
Javaの人はClass名をMainにしないと通らないので注意。

Rubyの場合は

```ruby
puts "Hello World"
```

でOK。

### もう少し肩慣らし

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

[X Cubic](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_B) 1行1入力
[Rectangle](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_C) 1行2入力
[Standard Deviation](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_C) 複数入力

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

言語のバージョンなどは少し情報が古いが、ここにいろいろな言語の書き方がまとまっている。
[今流行りのエディタSublimeText2を使って、AOJで競技プログラミングを楽しもう](http://qiita.com/shibainurou/items/07da4136027e4b61abe8)

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

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

```in.txt
5
70 80 100 90 20
3
80 80 80
0
```

以下のように実行

```bash
$ ruby Standard_Deviation.rb < in.txt
```

### Rubyでの解答例

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

#### X_Cubic

```ruby:X_Cubic.rb
puts gets.to_i ** 3
```

#### Rectangle

```ruby:Rectangle.rb
a, b = gets.split.map(&:to_i)
puts [a*b, (a+b)*2].join ' '  # puts "#{a*b} #{(a+b)*2}"
```

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

```ruby:Rectangle.rb
require 'scanf'
a, b = gets.scanf("%d %d")
printf("%d %d\n", a*b, (a+b)*2)
```

#### Standard Deviation


```ruby: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.split`か`gets.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](http://judge.u-aizu.ac.jp/onlinejudge/topic.jsp?cid=ITP1)

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

## 1回目

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

- [Problem A](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1186)
- [Problem B](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1187)
- [Problem C](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1188)

日本語もあるので、日本語でやりたい人は日本語で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
```