LoginSignup
17

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-27

変更履歴
* 2019/09/28 Array の取得方法が短くなりました。$__=$_[].=$_;$_.=[];
* 2019/09/28 かっこ多めの別解を追加しました。

はじめに

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

完成品

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

解説

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

    $Array .= [];   // 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を作り出す。

    $p = $r & $y;
    $I = $y & ~$r | $A;
    $m = $r & ~$A ^ _;
    $n = ++$m;
    $T = $r ^ _ ^ $y;
    $f = $p ^ $I ^ _;
    
  4. A, r, y, p, I, T から H, e, l, o, w, d とスペースを作り出す。 

    $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;
    
  5. 実行

    $printf = $p . $r . $I . $n . $T . $f;
    $helloworld = $H . $e . $l . $l . $o . $space . $w . $o . $r . $l . $d;
    $printf($helloworld);
    
  6. すべて記号に置き換える。

  • $_ : Arrayを退避
  • $$_ : 作り出した文字を退避
  • $__ : 作り出した文字を結合してprInTfにする
  • $$__ : 作り出した文字を結合してHello worldにする

    $_.=[];
    
    $__.=$$_[!_]=$_[!!_]&$_[-!!_];       // $$_[!_] <-- p
    $__.=$_[!!_];                         // r
    $__.=$$_[!!_]=$_[-!!_]&~$_[!!_]|$_[!_]; // $$_[!!_] <-- I
    $$_[_]=$_[!!_]&~$_[!_]^_;             // $$_[_] <-- m
    $__.=++$$_[_];                         // n
    $__.=$$_[$_[!_]]=$_[!!_]^_^$_[-!!_];    // $$_[$_[!_]] <-- T
    $__.=$$_[!_]^$$_[!!_]^_;               // f
    
    $$__=$_[!_]^$_[-!!_]&~$_[!!_];      // H
    $$__.=$$_[$_[!!_]]=$$_[!_]^$$_[$_[!_]]|$_[!_];  // $$_[$_[!!_]] <-- e
    $$__.=$$_[$_[-!!_]]=$_[!_]^$_[!!_]^_;   // $$_[$_[-!!_]] <-- l
    $$__.=$$_[$_[-!!_]];                  // l
    $$__.=$$_[$$_[!_]]=$_[-!!_]^_^$$_[!!_];   // $$_[$$_[!_]] <-- o
    $$__.=$$_[!_]&~$$_[$_[!_]];           // スペース
    $$_[$$_[!!_]]=$_[!!_]|$_[-!!_]^_;     // $$_[$$_[!!_]] <-- v
    $$__.=++$$_[$$_[!!_]].$$_[$$_[!_]].$_[!!_].$$_[$_[-!!_]];    // worl
    $$__.=$$_[$_[!!_]]&$$_[$_[-!!_]];    // d
    
    $__($$__);                            // prInTf(Hello world)
    
  1. 一行にまとめれば完成

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

別解

上記を応用すれば別解を生み出せます。

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

解説

  • はじめの文字列は ArrayArray でも構わない。

    [].[]   // ArrayArray
    
  • 添字に使用する 01boolean であれば良いので夢が広がる。

    echo !![];      // 0
    echo ![];       // 1
    echo _!=_;      // 0
    echo _==_;      // 1
    echo _==[];     // 0
    echo []==[];    // 1
    
  • "ArrayArray"[0]A が取り出せる。

    ([].[])[!![]];      // A
    

    おまけ

    文字の作り方

$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を極めたい方はこちらを。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17