JavaScriptでQuine書いてみたよ!

前から, Quineというものがあることは知っていたのですが,

難しそうでずーっと避けていました.

なんとなく気になって書いて見た.

Quineと言うのは, ソースコードと全く同じ内容を出力するようなプログラムです.

書いてる時には, 「あっちを編集したらこっちがうまく行かなくなる」みたいな感じで,

あーーーーもう><

って感じでしたが, なんとなーくコツ的なものが分かってきました.

例によってJavaScriptです.

一番最初に思いついたのは, こんな感じ.

(function (){console.log('('+arguments.callee+')()')})()

あ, printが出力の時はs/console\.log/print/gってしてください.

しかしarguments.calleeはセコイよなぁ...

"use strict"的な意味でも.

そっか, callee使わないなら名前をつければいいじゃない!!!

(function f(){console.log('('+f+')()')})()


おい...おまっ....

どうしてもJavaScriptのせこいところを使ってる気がして...うーむ...

みんなどうやってQuine書いてるんだろ? って調べてたら,

eval使ったら結構簡単みたい.

こんな感じか?

eval(x="y=String.fromCharCode(34);console.log(('eval(x='+y+x+y+')'))")

String.fromCharCode(34)ってのは"の事.

んむー...

やっぱり, evalはイタダケナイ!!!!!

"use strict"的な意味で.

っつーわけで, calleeもevalも使わずに書けないかなぁ...

...

......

.........

............!!!!

文字列の変数展開使えば楽じゃね?

えっJavaScriptに変数展開が無い?

ネゴトはネテ言え\(-ω- )

あ, 変数展開は確かに無いです.

でもreplaceでそれっぽい事できるよねー

> 'foo#bar'.replace(/(.*)#(.*)/,'$1 $1 $1, $2 $2 $2 $2')
'foo foo foo, bar bar bar bar'


うにゃ, こりゃ使える.

ってことで, 書いたQuineはこんな感じ↓

(function(){console.log('(function(){console.log(_.replace(/(.*?)_(.*)(.)(.)/,"$1$3$1_$2$4$3$4$4$3$2"));})()\'\\'.replace(/(.*?)_(.*)(.)(.)/,"$1$3$1_$2$4$3$4$4$3$2"));})()


やったねっ

変数代入/クロージャーなし, callee/evalなし, String.prototype.replaceオンリーでQuineが書けたよ!

ってか, みんなのAA QuineとかPolyglot quineとか, 本当レベル高すぎ...