皆さんは paiza を知ってますか?

エンジニアのコーディングスキルを測り、それをもとに転職しよう!
というサービスです。いわゆる競技プログラミングですね。
競技プログラミングは苦手なので練習のためやっています。

ちなみに似たサービスとしてCodeIQもあります。

違いとしては、

CodeIQ
  • オファーは受けるのみ(応募できない)
  • 出題者が明記されている
  • だれでも出題できるので、問題の難易度にバラつきあり
paiza
  • オファーも来るし応募もできる
  • 出題者が明記されていない
  • だれでも出題できるわけではないので、問題の難易度に安定感がある

みたいな違いがあります。
対して変わらないので、好きな方をやればいいと思います。
ちなみに私はpaiza派です。

言語

paizaであれば利用可能な言語は、

  • C
  • C++
  • C#
  • java
  • Python
  • Ruby
  • Perl
  • PHP
  • Javascript

があります。
メジャーどころは揃っているので、好きな言語を使えばいいと思います。

ちなみに、paizaでは実行速度も計測されるので、ガチな人はCとかですかね。
単純な書きやすさで言えばRubyかな、と。

ただ問題を解くだけじゃなく、オファーを受け取ったりしたい人は、
仕事で書きたい言語を使用する必要がありそう。

また、競技プログラミング上は変数名やメソッドなど必要ありませんが、
オファーを出す企業側がコードをチェックするので、その場合もいい感じの変数名にしたり、
細かくメソッドをつくったりというのはやっていいんじゃないかと。

標準入力を受け取る

実際に問題にとりかかる際に、標準入力を受け取る部分の コードが必要になります。

paizaでは、提出後に複数のテストケースにかけられますが、 どの問題も、
「提出したコードの実行(標準入力による値の取得、計算処理)→標準出力→正誤の判定」
という流れなので、標準入力を取得する部分のコードは必須になります。

この標準入力を取得する部分に苦戦しました。
簡単な問題は標準入力が1行だけなので、
サンプルコード をちょびっといじればよかったのですが、
問題が難しくなり、標準入力が複数行のものになると、
サンプルコードがほとんど役立たずでした。

問題を解きたいのに、問題を解く前の時点でつまずくと
非常にやる気を削がれるので、僕が使った言語の標準入力のサンプルを記載します。

まずはJavascriptです。
これはほぼサンプルコードそのままです。

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var line = chunk.toString();
    console.log(line);
});

次にRuby。 これはサンプルコードが使い物になりませんでした。
サンプルだと標準入力の1行分しかとれません。
そして短くて書きやすいです。

file = $stdin
line = file.readlines
file.close

puts line

最後にphp
これもRubyと同じく、複数行が取得できませんでした。

<?php
while ( ! feof(STDIN) ) {
  $line = trim(fgets(STDIN));
  var_dump($line);
}

実行速度的にはあまりよろしくないとは思いますが、
とりあえず上記を使えば、スムーズに問題を解き始められると思います。

上記を使って、標準入力について考える時間を、
問題をとくために使ってみてください!