前から, 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とか, 本当レベル高すぎ...