JavaScript小ネタ(+と[と](あるいは")から如何にして任意の自然数を作るか)

Twitter

というネタが流れてみて面白かったから弄って改良を加えてみた。


最後には、評価すると10^18もの大きな数になる短いJavaScriptコード

+[""+ ++[[]][+[]]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]]
= 1000000000000000000

を作ることができた。

f:id:jagging:20131019142537p:plain


なにができたの?

結果から言うと、javascript(Chrome上でうごくもの)において、
+と[と]と (スペース記号)の4つの記号を組み合わせることで任意の自然数を作ることができた。 また、使用可能な記号に"を追加すると、短いコードで任意の自然数作ることが出来た。

まずは帰納法で

"0"を作る

ChromeJavaScriptコンソールであれこれ試したところ、 +[]または+""または+''または+null を評価すると0になる。
f:id:jagging:20131019141358p:plain

nからn+1を作る

またnを任意の整数として
++[n][0]を評価するとn+1になる。
f:id:jagging:20131019141353p:plain

1の多様な作り方

nの代わりに[]、""、''を入れて、このような式を評価するとn=0と解釈して インクリメントおよびデクリメントをしてくれるようだ。
f:id:jagging:20131019141347p:plain

帰納法で任意の数を

+と[と]のみを使ったコードから

0がすでに作れる。

+[] = 0

したがって、

z+1 = ++[z][+[]]

の関係を利用し、

++[[]][+[]] = ++[[]][0] = 1
++[++[[]][0]][+] = ++[1][0] = 2

...などと帰納法より、任意の自然数を作ることが出来る。

f:id:jagging:20131019142532p:plain

しかしこれだとコードが長くなってしまい面白くない。

数を文字として組み合わせる(10進数で表記)

JavaScriptコンソールをぽちぽち弄ってみたところ、

""+2+3+4
= "234"

という関係で数字を文字列に、

+["234"]
= 234

という関係から 文字列を数字に変換することが出来る。

f:id:jagging:20131019144121p:plain

任意の数を短い表記で

前半の結果から、+と[と]のみから、帰納法より、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

f:id:jagging:20131019142537p:plain

 

 

このようにして、+と[と]と"しか用いることなく、任意の自然数を、可能な限り短いコードで、作ることが出来た。