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

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


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

## 完成品
```php
$_.=[];$__.=$$_[!_]=$_[!!_]&$_[-!!_];$__.=$_[!!_];$__.=$$_[!!_]=$_[-!!_]&~$_[!!_]|$_[!_];$$_[_]=$_[!!_]&~$_[!_]^_;$__.=++$$_[_];$__.=$$_[$_[!_]]=$_[!!_]^_^$_[-!!_];$__.=$$_[!_]^$$_[!!_]^_;$$__=$_[!_]^$_[-!!_]&~$_[!!_];$$__.=$$_[$_[!!_]]=$$_[!_]^$$_[$_[!_]]|$_[!_];$$__.=$$_[$_[-!!_]]=$_[!_]^$_[!!_]^_;$$__.=$$_[$_[-!!_]];$$__.=$$_[$$_[!_]]=$_[-!!_]^_^$$_[!!_];$$__.=$$_[!_]&~$$_[$_[!_]];$$_[$$_[!!_]]=$_[!!_]|$_[-!!_]^_;$$__.=++$$_[$$_[!!_]].$$_[$$_[!_]].$_[!!_].$$_[$_[-!!_]];$$__.=$$_[$_[!!_]]&$$_[$_[-!!_]];$__($$__);
```

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

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

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

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

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

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

	```php
	$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;
	```

1. 実行

	```php
	$printf = $p . $r . $I . $n . $T . $f;
	$helloworld = $H . $e . $l . $l . $o . $space . $w . $o . $r . $l . $d;
	$printf($helloworld);
	```
	
1. すべて記号に置き換える。
   
   * `$_` : `Array`を退避
   * `$$_` : 作り出した文字を退避
   * `$__` : 作り出した文字を結合して`prInTf`にする
   * `$$__` : 作り出した文字を結合して`Hello world`にする
  
	```php
	$_.=[];

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

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

	$__($$__);                            // prInTf(Hello world)
	```

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

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

## 別解

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

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

### 解説
* はじめの文字列は `ArrayArray` でも構わない。

	```php
	[].[]	// ArrayArray
	```

* 添字に使用する `0` と `1` は `boolean` であれば良いので夢が広がる。

	```php
	echo !![];		// 0
	echo ![];		// 1
	echo _!=_;		// 0
	echo _==_;		// 1
	echo _==[];		// 0
	echo []==[];	// 1
	```

* `"ArrayArray"[0]` で `A` が取り出せる。

	```php
	([].[])[!![]];		// A
	```
## おまけ
文字の作り方

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

* [bolknote.ru/all/4065/](https://bolknote.ru/all/4065/)