webhack / ウェブ技術が好き

javascriptやcssやHTML5とかサーバーサイド等のウェブ技術全般を好きに書くブログ

paizaでSランクを取る方法[Ruby]

転職サイトのpaizaはお題に合わせてコードを書けるから楽しいですよね。

下のランク(D)から上のランク(S)までなるほどと頭を使う問題がバランスよく揃っていて、採用側の機能は使った事ないですが書いたコードも見れるようなので即興のコードを見てもらうにはぴったりなサービスかなと思います。

さて、ここから本題です。少し前にRubyを使ってSランクを取ったので、そこで気づいた"コツ"を紹介していきます。

1. 入出力を揃える

DランクからC、Bと進む中で入出力ルールがほぼ同じ事に気が付くと思います。

そのため標準入力から読み取る部分、コードの最後で出力する部分を揃えます。

ストリーミングで処理が必要な問題は少なかった気がするので、ドカンとデータを読み込んで配列やマップに格納。処理した結果データが格納されている配列やマップをドカンと出力する形に統一されて行きました。

2. ローカル環境で単体テストは必須

paizaの環境内(ブラウザ内)で簡単なテストができます。最初はこれだけで十分かな?と思うのですが、いざ実行結果を見るとボロボロだったりします。

制限時間30分、60分の中でもpaizaが準備してくれているテストケースをパスする単体テスト、またそこから5~10パターンぐらいの単体テストデータと期待値を準備してローカル環境で単体テストを実行するのが大切でした。

最小最大の境界値テスト、何も行われない場合のテスト、null/nilが発生しそうなテスト、などお約束のパターンに対応するだけで点数が格段に上がると思います。

3. イレギュラーな入力値でテスト

自分だけかも知れませんが、大丈夫だろうと思っていたコードでもRuntimeエラーが意外と多く発生しました。

上記2つの「1. 入出力を揃える」「2. ローカル環境で単体テストは必須」に合わせて不正な値の入力、また不正な値が出力を検出できるようにテストするとRuntimeエラーの発生を抑えられます。

手っ取り早く言うとポストコンディション、プレコンディションのアサーションですね。

4. 下のランクから初めて問題の意味に慣れていく

上のランクの問題数が少ないからという事もあるのですが、問題の形式に慣れて時間を短縮するのが重要だと感じます。

最初の3問目ぐらいまでは「んんんん?」と問題の意図をどう解釈すれば良いのか悩む事になると思いますので、間違いながら慣れましょう。数問を解いていく中で次第に分かってきます。

5. 焦って/慌てて解答しない

解答までの時間によって点数が異なってくるのと、また問題の平均スコアに平均解答時間が書いているため、この時間を超えたらダメなんじゃないかと焦ったり、十分なテストを行っていないと分かっているのに「まあ大丈夫でしょ」と解答を投稿してしまいたくなります。

時間の制約があるので残り10分とかになると焦るんですよね。そしてテストが足りてないなと思うコードは、やっぱりエラーが起こります。

もう少しだけ時間をかけて、自分で納得できるだけのテストコードをパスした状態のコードを提出した方が良い点数になります。

まとめ、コーディングとテスト

paizaはテストコードをパスする事で点数が加算されます。そのためテストコードを書かない人や、事前にテストをする習慣のなくエラーがあれば直せば良いと考えるタイプは点数が高くなりづらそうです。

問題を解けるだけのプログラミングスキルがある前提という話ではありますが、そこから先はどこまで問題を理解して単体テストを出来るかで高い点数が取れると思います。