Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

PHPですべてをFにしたかった

すべてをFにしたかった結果

<?php

require "F";

F('FFffFfF FFfffFF FFfFfff FFfFFFF Ffffff FfffFf FfFfFff FFfFfff FFffFfF Ffffff FfFffff FFffFfF FFFffFf FFffFFf FFffFfF FFfffFF FFFfFff Ffffff FffFffF FFfFFFf FFFffFF FFfFffF FFffFff FFffFfF FFFffFf FfFFFf FfFFFff FFfFFFf FfffFf FFFfFF FfFf');
The Perfect Insider.

最初の <?php と require を消す方法は何かないだろうか…。
あと小文字のfを使うのも妥協した。

やったこと

F = 1, f = 0 に見立てて、2進数 -> 10進数 -> 文字化して、最後にeval()しただけ。

F
<?php

function F($str) {
    $str = str_replace('f', '0', $str);
    $str = str_replace('F', '1', $str);

    $ret = "";
    foreach (explode(' ', $str) as $s) {
        $ret .= chr(bindec($s));
    }

    eval($ret);
}

F()に渡す文字列を作るのは、その逆をすればよい。

<?php

$filepath = $argv[1];

$ret = [];

foreach (file($filepath) as $line) {
    foreach (str_split($line) as $c) {
        $ret[] = decbin(ord($c));
    }
}
$ret = implode(' ', $ret);

$ret = str_replace('0', 'f', $ret);
$ret = str_replace('1', 'F', $ret);

echo $ret;