JavaScript小ネタ(+と[と](あるいは")から如何にして任意の自然数を作るか)
+[++[+[]][+[]]]を評価すると1になります
— @pinokotereに2400円 (@popkirby) March 29, 2013
というネタが流れてみて面白かったから弄って改良を加えてみた。
最後には、評価すると10^18もの大きな数になる短いJavaScriptコード
+[""+ ++[[]][+[]]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]] = 1000000000000000000
を作ることができた。
なにができたの?
結果から言うと、javascript(Chrome上でうごくもの)において、
+と[と]と (スペース記号)の4つの記号を組み合わせることで任意の自然数を作ることができた。 また、使用可能な記号に"を追加すると、短いコードで任意の自然数作ることが出来た。
まずは帰納法で
"0"を作る
ChromeのJavaScriptコンソールであれこれ試したところ、 +[]または+""または+''または+null を評価すると0になる。
nからn+1を作る
またnを任意の整数として
++[n][0]を評価するとn+1になる。
1の多様な作り方
nの代わりに[]、""、''を入れて、このような式を評価するとn=0と解釈して インクリメントおよびデクリメントをしてくれるようだ。
帰納法で任意の数を
+と[と]のみを使ったコードから
0がすでに作れる。
+[] = 0
したがって、
z+1 = ++[z][+[]]
の関係を利用し、
++[[]][+[]] = ++[[]][0] = 1 ++[++[[]][0]][+] = ++[1][0] = 2
しかしこれだとコードが長くなってしまい面白くない。
数を文字として組み合わせる(10進数で表記)
JavaScriptコンソールをぽちぽち弄ってみたところ、
""+2+3+4 = "234"
という関係で数字を文字列に、
+["234"] = 234
という関係から 文字列を数字に変換することが出来る。
任意の数を短い表記で
前半の結果から、+と[と]のみから、帰納法より、1や0(もちろん更に大きい数も)を作れ、
後半の結果から、それを十進数における数字として配置することができる。
これら2つの成果を生かして、より短い表記で任意の自然数を表記することができる。
以下が試してみたものになる。
+[""+ ++[[]][+[]]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[[]]] = +[""+1+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0] = 1000000000000000000 = 10^18
このようにして、+と[と]と"しか用いることなく、任意の自然数を、可能な限り短いコードで、作ることが出来た。