銀色うつ時間

思い出すたび何か胸につっかえてるだけ

『フカシギの数え方』 おねえさんといっしょ! PHPで数えてみよう!

おねぇさぁぁぁぁぁん! 日本科学未来館のアニメに狂気が宿っていると話題に

http://nlab.itmedia.co.jp/nl/articles/1209/11/news104.html -ねとらぼ

日本科学未来館のアニメがあまりにも面白かったので触発されて書いてみました。間違ってる可能性も大いにありますので、その辺生暖かい目で見てください。英語で探せばもっといいコードが出てくると思います。

class Explode {

    private $x      = 0;
    private $y      = 0;
    private $size   = 0;
    private $dest   = 0;
    private $line = array();

    function __construct($arg) {
        $this->size = (int)$arg;
        $this->x = (int)$arg - 1;
        $this->y = (int)$arg - 1;
        for ($i = 0; $i < $this->size; $i++) {
            for ($j = 0; $j < $this->size; $j++) {
                $this->line[$i][$j] = 0;
            }
        }
    }
        
    function setGoOn($x, $y) {
        $this->line[$x][$y] = 1;
    }

    function walk($x, $y) {
        $this->line[$x][$y] = 1;
        if ($x == $this->x && $y == $this->y) {
            $this->dest++;
        } else {
            if ($x < $this->size -1 && $this->line[$x + 1][$y] === 0) {
                $this->walk($x + 1, $y);
            }
            if ($x > 0 && $y < $this->size -1 && $y != 0 && $this->line[$x - 1][$y] === 0) {
                $this->walk($x - 1, $y);
            }
            if ($y < $this->size - 1 && $this->line[$x][$y + 1] == 0) {
                $this->walk($x, $y + 1);
            }
            if ($y > 0 && $x > 0 && $x < $this->size - 1 && $this->line[$x][$y - 1] === 0) {
                $this->walk($x, $y - 1);
            }
        }
        $this->line[$x][$y] = 0;
    }

    function getCount() {
        return $this->dest;
    }
}  
$arg  = intval($argv[1]) + 1;
$oneisan = new Explode($arg);
$oneisan->setGoOn(0, 0);
$oneisan->walk(1, 0);
echo $oneisan->getCount() * 2;

実行してみる。

f:id:arerreee:20120914023259p:image

ちゃんとおねえさんの数えた通りの数字になっていますね!

ただ、おねえさんと違って私たちは手近なところにスーパーコンピューターなんてあるはずがないので5x5か6x6が限界だと思います(5マスのときは20秒くらいかかりました)。

さもないと「あれから25万年がたった・・・」なんて話になるので、実行はお気をつけて!


githubに置いときます

https://github.com/sisidovski/CombinationalExplosion