nagoya php vol.4 に参加しました。特定のフレームワークやアプリケーションではなく、純粋にPHPの勉強会です。
フォークじゃない 〜 横へな 2014.2.1 問題を実際に皆で解いてみる、という面白い試みがありました。codeiq.jpやcheckio.org等でコードを書いてみよう、というのがありますが、あれを集まった人がそれぞれ実行する、という形です。
素のPHPで書くことで、いろいろな発見がありますね。手続き型で書くことも最近ではあまり無くなりましたが、あえて書いてみると、オブジェクト指向についても再認識できるような気がします。私の書いたのはオブジェクトを使ったコードですが結構手続き型に近い形です。会場では後藤さんが手続き型で書いていました。
私の書いたコードです。(gist.github.com/ounziw/9563282)
お客が並ぶのは$queuelistですが、xが来たら$jammedlistに追加するようにします。$jammedlistの値が1以上かどうかで、xが来ているかどうかを判定しています。
元の課題では「xが来たらそれ以降そのレジはストップ」ということだったので、こういう実装にしてみました。特異な条件をつかっている分、シンプルに記述できますが、一方で汎用性は下がっています。元の課題を少し変更して、「xは通常の客の2倍の処理時間がかかる」にすると、このコードだと大幅に変更しなければなりません。「客」もしくは「レジ」を別オブジェクトに分離すると、この辺にも対処しやすそうな気がします。
ほんとは全部テストを書くべきなんでしょうけど、手抜きして「待ち人数が最小の所を求める」と「最終の出力を確かめる」だけ書いています。
$this->queuelist[$i] -= min($this->queuelist[$i], $this->capabilitylist[$i]);
の所は、元は
$this->queuelist[$i] = max(0, $this->queuelist[$i]-$this->capabilitylist[$i]);
のように書いていたのですが、第18回オフラインリアルタイムどう書くの問題をPythonでを参考に変更しました。
個人的にPythonはすごくお気に入りなので、CodeIQでもPythonに参考にする事が多いのですが、綺麗に書いてあるコードが多いような気がします。もしかしたらPHPのコードが汚いものが多いから、そう感じるのかもしれませんが。