Nagoya.phpは、皆でコードを書く、というのがメインになっています。今回は、のんびり座りたい 〜 横へな 2013.2.2です。課題の説明は上述のページをごらんください。

取ったアプローチ

「人が座席を選ぶ」処理をどう扱うか、がキーポイントだと思われます。私は、「座席ごとに点数を付けておく」というアプローチにしました。このアプローチにした主な理由は

  1. 座席を一つずつ調べ、座るかどうかを判定するのは大変そう
  2. 座席の選び方は皆同じ(「Aさんは端が好き」「Bさんは中央が好き」といったことは無い)
  3. 点数化しておくと、『一つに決まらない場合は、候補のうち最も左にある席を選ぶ』がやりやすい

です。

「1.」は、問題の説明に素直に従うとこのアプローチになりそうです。ただ、foreachを多用することになって大変だろう、と予想したので、避けました。

「2.」は、今回の問題に関していえば、座席に点数があると楽だ、というものです。もし、人それぞれに好みが異なる場合は、人の側に座席を選択するロジックを持たせることになります。

「3.」は、Nagoya.phpで過去に取り組んだ問題で同様の処理があったので、それをそのまま流用できる、という理由です。

「人が座っている状況」も点数化する

座席を選ぶ処理のところで、「人が座っているかどうか」を判定する方法も考えられます。しかし、「3.」の処理を生かしたかったので、「人が座っている状況」も点数化しました。

基本は、隣の座席の人数=点数(両方空きは0、片方空きは1、両方埋まりは2)と点数化し、「人が座っている状況」は+10としました。+10は2より大きければOKです。こうしておけば、座席の点数を調べれば「人が座っているかどうか」の判定もできる、という方針です。

書いたコードは https://gist.github.com/ounziw/7348fc9022116d3b5b4... です。

他の人のコード

他の参加者のコードを、見つけた範囲で掲載しています。

https://github.com/hidenorigoto/Nagoya.Php10

https://github.com/kenjis/NagoyaPHP.Vol10

https://github.com/longkey1/nagoyaphp-160130-douka...

私のコードの特徴

今回に限った話ではないですが、私の場合、コードの外での工夫が多いようです。今回でいえば、「人が座っている状況」も点数化する、などです。

この方針だと、良い方針を思いつけば、高速にプログラム作成できます。実際、今回の課題は約20分で完成しました。しかし、良い方針を思いつかなかった場合、かえってロスになる可能性も高いです。

また、この方針は、チームでコーディングする場合は必ずしもプラスとは限りません。今回私が採用した方針を、他の人が「いいね」と感じるとは限らないからです。私の発想と合わない人にとっては、理解しにくいコードかもしれません。

面白いので継続したい

同じ問題に皆で取り組むことで、人それぞれに異なるコードを書いていて面白いな、と思います。時間が限られているので、その場で完成できるスピードが要求されますが。参加希望者に事前に問題を知らせておく、というのも良いかもしれません。

カテゴリー
記事公開日: 2016年02月01日

Nagoya.PHP 第12回に参加しました。会場はカルテットコミュニ... 詳細はこちら