Help us understand the problem. What is going on with this article?

「第5回オフラインリアルタイムどう書くの参考問題」をPHPで解く

More than 5 years have passed since last update.

http://qiita.com/Nabetani/items/0ddde0164a745cd09c34
http://nabetani.sakura.ne.jp/hena/ord5railsontiles/

懐かしチクタクバンバン。
ただしこちらはパネルは動きません。
進むラインを求めます。

<?php
    class TICKTUCK{

        // 入力方向から次の入力方向を求める ←0↑1→2↓3
        private $panel = [
            0=>[0=>0, 1=>1, 2=>2, 3=>3],
            1=>[0=>1, 1=>0, 2=>3, 3=>2],
            2=>[0=>3, 1=>2, 2=>1, 3=>0],
        ];

        // 入力方向による現在値の変化 ←-1↑-13→+1↓+13
        private $direction = [0=>1, 1=>13, 2=>-1, 3=>-13 ];

        // 侵入許可パネル
        private $okPanel = [10=>1, 11=>1, 12=>1, 23=>1, 24=>1, 25=>1, 36=>1, 37=>1, 38=>1];

        /**
        * チクタクバンバン
        * @param  String 「101221102」みたいな文字列
        * @return String 「BEDGHIFEH」みたいな文字列
        */
        public function get($input){
            // 現在地
            $nowPanel = 11;
            // 現在の方向
            $nowDirection = 1;
            // 進んだ順
            $ret = '';

            do{
                // 現在地
                $ret .= chr(65 + $nowPanel%10);
                // 次の方向を求める
                $nowDirection = $this->panel[$input[$nowPanel%10]][$nowDirection];
                // 次の現在地を求める
                $nowPanel += $this->direction[$nowDirection];

            // 進める限り繰り返し
            }while(isset($this->okPanel[$nowPanel]));

            return $ret;
        }
    }

    // テスト
    $test = [
        ['101221102','BEDGHIFEH'],
        /* 省略 */
    ];

    $ticktuck = new TICKTUCK();
    foreach($test as $key=>$data){
        $answer = $ticktuck->get($data[0]);
        if($answer !== $data[1]){
            print('えらー');
        }
    }

パネルのA~Iをそれぞれ0~8に割り当て、パネルの形状によって移動する次のパネルを求める、という基本的には単純な作りです。
ただ普通に0~8とすると2→3の移動がOKとみなされてしまうため、侵入許可パネルという微妙なプロパティを作る羽目になりました。
あとPHPは
private $okPanel = array_flip([10, 11, 12, 23, 24, 25, 36, 37, 38]);
とか書けないから微妙にめんどい。

かかった時間は1時間くらい。
完成した後で考えなおしてみたら'ABC-DEF-GHI'の位置とかでやったほうがずっと簡単そうだった。
まあいいか。

rana_kualu
不労所得で生きたい。
https://twitter.com/rana_kualu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away