Tag: PHP Brainfuck

PHPのソースに変換してeval()で実行させる

  • ,は未実装
<?php
// Brainfuck の Hello world ソース
$s = '+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.';
// Brainfuck のソースを PHP のソースに変換するためのパターン
$pat = array(
    '/^/'            => '$arr = array(0); $idx = 0;',
    '/\[([^\]]+)\]/' => 'while ($arr[$idx] != 0) {$1}',
    '/(([\+\-])+)/e' => "'\$arr[\$idx] $2= ' . strlen('$1') . ';'",
    '/(([><])+)/e'   => "'\$idx ' . ('$2' === '>' ? '+' : '-') . '= ' . strlen('$1') . '; !isset(\$arr[\$idx]) && \$arr[\$idx] = 0;'",
    '/\./'           => 'echo chr($arr[$idx]);',
);
$src = preg_replace(array_keys($pat), array_values($pat), $s);

// PHP ソース表示
//echo preg_replace('/([{};])/', "$1\n", $src);

// 実行
eval($src);

結果

Hello, World

変換されたPHPのソース

$arr = array(0);
$idx = 0;
$arr[$idx] += 9;
while ($arr[$idx] != 0) {
    $idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
    $arr[$idx] += 8;
    $idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
    $arr[$idx] += 11;
    $idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
    $arr[$idx] += 5;
    $idx -= 3; !isset($arr[$idx]) && $arr[$idx] = 0;
    $arr[$idx] -= 1;
}
$idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
echo chr($arr[$idx]);
$idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
$arr[$idx] += 2;
echo chr($arr[$idx]);
$arr[$idx] += 7;
echo chr($arr[$idx]);
echo chr($arr[$idx]);
$arr[$idx] += 3;
echo chr($arr[$idx]);
$idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
$arr[$idx] -= 1;
echo chr($arr[$idx]);

$arr[$idx] -= 12;
echo chr($arr[$idx]);
$idx -= 1; !isset($arr[$idx]) && $arr[$idx] = 0;
$arr[$idx] += 8;
echo chr($arr[$idx]);
$arr[$idx] -= 8;
echo chr($arr[$idx]);
$arr[$idx] += 3;
echo chr($arr[$idx]);
$arr[$idx] -= 6;
echo chr($arr[$idx]);
$arr[$idx] -= 8;
echo chr($arr[$idx]);
$idx += 1; !isset($arr[$idx]) && $arr[$idx] = 0;
$arr[$idx] += 1;
echo chr($arr[$idx]);

参考


Last-modified: 2010-06-23 (水) 01:59:52 (2675d)