wataメモ

日々のメモをつらつらと書くだけ

paizaのランク上げ

とりあえずpaizaのランクをAランクまで(最初はSランクがあるのを知らなかったので上限だと思っていた)あげようと思い、昨日、一昨日とチャレンジ。ハッカソンはやったことあっても、スキルチェックは1度もやったことなかったのでとりあえずDランクからトライした所感。

paiza.jp

ランクごとのレベルについて

 Dランク、Cランクについては小手調べ程度なので問題を理解する時間の方が長いくらいだった。Bランクについてはうっかりすると考慮漏れが出る可能性もある感じではあった。
 そしてAランク。このレベルに来ると、設計無しに単純に処理を書き並べてもコード量やバグが多くなってしまうのではと感じた。仕様から設計(コードのイメージ)を見通す力が無いとクリアするのは時間が掛るだろう。制限時間としては6時間あるようなのでベタな方法でも試行錯誤すれば100点ではなくクリアは出来るのかもしれない。

特徴について

 paizaは問題の前提で異常系は気にしなくても良い。 その分問題に集中出来るので、まさにデータやアルゴリズムを扱う能力を試すことが出来る。これは「脳内実行環境」*1の練度やキャパシティを測ることだと考えている。ただ、言語を扱うスキルを測るにはちょっと弱い気はしている。もちろん言語をきちんと把握していれば簡潔に記述することができるが、把握して無くてもクリア出来る、出来ないにはあまり影響無いという意味だ。「脳内実行環境」が出来ている人には、言語仕様をちらっと見ればどの言語でも基本的にはクリア出来ると思う。ただ、コードを見れるのであれば、その人の言語の習熟度もある程度見ることは出来るのは間違いない。
 業務プログラミングではそれ以外にも違ったスキルも求められることになる。特に異常系に関しては極力異常系を気にしなくて書ける様に集中管理等の設計は行うが、どこかでは担保したり、異常系発生時にわかりやすくログを出すなり、回復処理を行わなければならない。その為その辺の知識があるかどうかは測ることが出来ない。この品質に大きく関わる部分を設計出来る人財は業務のプログラミングでは非常に重要で、その価値はトータルで見ると天と地ほどの差になる。
 この業務プログラミングと競技プログラミングの違いを @chokudai さんは以下のようにツイートしている。

見通す力(設計力)について

 あまり意識して来なかったが、確かにこの限られた時間の中で「見通す力」はなかなか身につかない物なのかもしれないと感じた。常にトライアンドエラー、仕様から直感でコードを書き始めていることを続けていると訓練されない能力だ。クラス分け、メソッド分け、データ構造の組み合わせから最適な方法かつ大量データの処理を前提に性能を意識することになる。性能を意識する必要が出てくると有効なアルゴリズムを知っていると良いが、自分は競技プログラマではないので殆ど勉強したことはない。ただpaizaの問題については、アルゴリズムを知らなくても単純な枝刈りとメモ化、全件探索をしないように気をつけるだけで十分だった。(ナップサック問題ぐらいは勉強したが)

クリアの為に意識したこと

 美しいアルゴリズムを知らない場合に意識することとしては、データをごちょごちょ弄らないこと。(例えばArrayの要素を入れたりsliceして途中から抜いたり・・・)これをやりだすと、限られた時間の中ではデータ操作のバグ潰しに時間を取られかねない。データを綺麗に保つより、新しいメモリ空間に中間データを作ったりしてメモリ的には富豪プログラミングを行う。もちろん最初にお題のデータ件数想定を確認はするが、万が一これがダメな場合はその時考えようというスタンスだ。まあ、幸いpaizaの問題では1度としてメモリが足りなくなる様なことにはなっていないが。
 設計については、オブジェクト指向カプセル化)で行い、処理を書く部分は関数型で書く。経験上これが一番バグらずに書ける。このバランスの取りどころは言語化が難しいが、感覚的には 関数型で綺麗に書くために オブジェクト指向で補間する感じだ。

Aランクのクリア時間について

 問題にもよるだろうが、概ね30分前後ぐらいだった。きちんと測っていないが感覚的には以下。

  1. 5分から10分ぐらいで問題の理解および設計
  2. 10分から15分程度で実装
  3. 残り5分から10分ぐらいでテスト。
  4. 数分で最後にソースレビュー

 2.の実装はサンプルのデータを動かしながら動作確認。3.については思いつく例外パターンを想定したデータを作成してテストをしていく。最後に無駄な処理が無いか等の軽いリファクタリングを行う。 100点を目指しているので、あまり大掛かりなリファクタリングはせずブラッシュアップ程度。

最後に

 時間内に書ききらないといけないということで、気持ち的にはどうしても焦っていて問題をよく読まない場合があった。「出力を0埋めの2桁の整数に」を見逃していて100点が取れないことがあった。最初は何がバグっているのかわからず、何度もコードを見なおしてしまった。まったくわからなかったので、再度問題を読んだところ気がつくという体たらく。(自信があったのにテストケースが落ちて「まさか!」と思い、動揺していたのは秘密)
 非常にプログラミング力を向上させる、もしくは新しい言語を勉強する時の腕試しとしては有益なサイトなので、興味があれば是非利用してみては。

*1:頭の中でコードの実行、データの中身をイメージする