↓とあるAの問題を解いていたところ前処理(初期化処理)をやった時点で、状態遷移を管理する変数がない…ってことに気づいて断念したコード(を退避)。
<?php // Your code here! // 自分の得意な言語で // Let's チャレンジ!! $input_line = fgets(STDIN); $p = explode(" ", $input_line); $shigemi = $p[0]; $usagi = $p[1]; $jump = $p[2]; $ichi = Array(); // うさぎの位置配列 $field = Array(); // 場所管理用配列 // うさぎの位置を配列で取得 for($i = 0; $i < $usagi; $i++){ $ichi[] = fgets(STDIN); } // 茂み配列初期化 $field = Array(); for($i = 0; $i < $shigemi; $i++){ $field[0] = 0; } // うさぎを配置 for($i = 0; $i < $shigemi; $i++){ foreach($ichi as $val){ if(($i + 1) == $val){ $filed[$i] = 1; break; } } } print_r($filed); ?>
## 反省点
データ構造にハッシュ(連想配列)または2次元配列またはオブジェクトを使わずにできると思ったが、うさぎに番号を振らないと管理できないことに気づいて…あとでやり直すことにした。無計画にコードを書くと手戻りが発生するので、思いつきでコードを書いたらロスが激しいなあと思った(少し書き加えればいいだけだとしても)。
## 初学者は計画段階で頓挫する
問題の解き方の前に、前提条件の前処理(初期化処理)がそもそも分からなくなると思う。
プログラマがアルゴリズムを組み立てる前、どういう状態にデータ構造があるべきなのか、思いつかないならば処理の部分を考えようがない。
したがって、初期化とかデータ構造とかのパターンを知っておかないといけない。
数学で言えば「与えられている値はなにか」明確に知っている状態でなければならないが、プログラミングの場合は、今後、展開される様態に合わせた構造を持っていないと手詰まりになってしまうことがあるんではないか。
## オブジェクト指向は状態遷移が分かりにくいがオブジェクト指向は結局のところ非常に便利
paizaのSランク問題は状態遷移の管理が正しく書ければ意外に解ける(競プロに興味がない業務プログラマでも十分に解ける問題もある)。ただし、業務プログラミングの場合はオブジェクトの状態遷移処理のスパンを長くすると、可読性が落ちる=オブジェクト指向プログラミングであれば可読性が高いかといえばそうではない。
オブジェクト指向は手段の総称であって、そこに設計とかアーキテクチャというか、なんらかのバグを減らしコードをすっきりする方法論が必要になると感じる。オブジェクト指向が嫌い、などと極端なことを普段言っていたけど、結局のところpaizaスキルチェックをやっていると、オブジェクト指向は便利だと認めざるを得ない(極端なことを言うのはやめようと思った)。
コメント