Edited at

最高にラブリー💖なHello world 【php編】


はじめに

何ヶ月前でしょうか、私はjsfuckに夢中でした。jsfuckとは記号プログラミングの一種で、通常6種類の記号(!, +, [, ], (, ))のみを使用してjavascriptのコードとして動作させようという試みです。へ、変態だ…。そして、ある日ふと思ったのです。jsfuckがあるならphpfuckだってあるだろ、と。


レシピ



  1. Arrayという文字列を手に入れる。

    $Array = $dummy[] .= $dummy;    // Array
    



  2. Array から A, r, y を取り出す。リテラルをboolean型に変換するとfalseになります。falseは整数値型に変換すると0になります。trueなら1です。配列の添字に使います。

    echo +!_;           // 0
    
    echo +!!_; // 1
    $A = $Array[!_]; // A
    $r = $Array[!!_]; // r
    $y = $Array[-!!_]; // y


  3. A, r, y から p, I, n, T, fを作り出す。


  4. $p = $r & $y;
    
    $I = $y & ~$r | $A;
    $m = $r & ~$A ^ _;
    $n = ++$m;
    $T = $r ^ _ ^ $y;
    $f = $p ^ $I ^ _;

  5. A, r, y, p, I, T から H, e, l, o, w, d とスペースを作り出す。 


  6. $H = $A ^ $y & ~$r;
    
    $e = $p ^ $T | $A;
    $l = $A ^ $r ^ _;
    $o = $y ^ _ ^ $I;
    $space = $p & ~$T;
    $v = $r | $y ^ _;
    $w = ++$v;
    $d = $e & $l;

  7. 実行


  8. $printf = $p . $r . $I . $n . $T . $f;
    
    $helloworld = $H . $e . $l . $l . $o . $space . $w . $o . $r . $l . $d;
    $printf($helloworld);

  9. すべて記号に置き換える。




  • $__ : Arrayを退避


  • $$_ : 作り出した文字を退避


  • $___ : 作り出した文字を結合してprInTfにする


  • $$___ : 作り出した文字を結合してHello worldにする

    $__=$_[].=$_;                           // Array

    $___.=$$_[!_]=$__[!!_]&$__[-!!_]; // $$_[!_] <-- p
    $___.=$__[!!_]; // r
    $___.=$$_[!!_]=$__[-!!_]&~$__[!!_]|$__[!_]; // $$_[!!_] <-- I
    $$_[_]=$__[!!_]&~$__[!_]^_; // $$_[_] <-- m
    $___.=++$$_[_]; // n
    $___.=$$_[$__[!_]]=$__[!!_]^_^$__[-!!_]; // $$_[$__[!_]] <-- T
    $___.=$$_[!_]^$$_[!!_]^_; // f

    $$___=$__[!_]^$__[-!!_]&~$__[!!_]; // H
    $$___.=$$_[$__[!!_]]=$$_[!_]^$$_[$__[!_]]|$__[!_]; // $$_[$__[!!_]] <-- e
    $$___.=$$_[$__[-!!_]]=$__[!_]^$__[!!_]^_; // $$_[$__[-!!_]] <-- l
    $$___.=$$_[$__[-!!_]]; // l
    $$___.=$$_[$$_[!_]]=$__[-!!_]^_^$$_[!!_]; // $$_[$$_[!_]] <-- o
    $$___.=$$_[!_]&~$$_[$__[!_]]; // スペース
    $$_[$$_[!!_]]=$__[!!_]|$__[-!!_]^_; // $$_[$$_[!!_]] <-- v
    $$___.=++$$_[$$_[!!_]].$$_[$$_[!_]].$__[!!_].$$_[$__[-!!_]]; // worl
    $$___.=$$_[$__[!!_]]&$$_[$__[-!!_]]; // d

    $___($$___); // prInTf(Hello world)





  1. 一行にまとめれば完成

    $__=$_[].=$_;$___.=$$_[!_]=$__[!!_]&$__[-!!_];$___.=$__[!!_];$___.=$$_[!!_]=$__[-!!_]&~$__[!!_]|$__[!_];$$_[_]=$__[!!_]&~$__[!_]^_;$___.=++$$_[_];$___.=$$_[$__[!_]]=$__[!!_]^_^$__[-!!_];$___.=$$_[!_]^$$_[!!_]^_;$$___=$__[!_]^$__[-!!_]&~$__[!!_];$$___.=$$_[$__[!!_]]=$$_[!_]^$$_[$__[!_]]|$__[!_];$$___.=$$_[$__[-!!_]]=$__[!_]^$__[!!_]^_;$$___.=$$_[$__[-!!_]];$$___.=$$_[$$_[!_]]=$__[-!!_]^_^$$_[!!_];$$___.=$$_[!_]&~$$_[$__[!_]];$$_[$$_[!!_]]=$__[!!_]|$__[-!!_]^_;$$___.=++$$_[$$_[!!_]].$$_[$$_[!_]].$__[!!_].$$_[$__[-!!_]];$$___.=$$_[$__[!!_]]&$$_[$__[-!!_]];$___($$___);
    



おまけ

文字の作り方

$chr = ['A', 'r', 'y', '~A', '~r', '~y'];

$opr = ['^', '&', '|'];

for ($i=0; $i<count($chr); $i++) {
for ($j=0; $j<count($opr); $j++) {
for ($k=0; $k<count($chr); $k++) {
$str = $chr[$i] . $opr[$j] . $chr[$k];
$exec = 'echo ' . $str . ';';
eval($exec);
echo ' --> ' . $str . "\n";
}
}
}


参考

元ネタは下記。もっとマニアックなテクニックを知り、phpfuckを極めたい方はこちらを。