古いPCのファイルを見ていて、昔、学生時代、Javascriptで自分自身を出力するプログラムを書いてみて楽しんでたのを思い出しました。昔の自分に負けたくないので、頭の体操に(?)もう一度書いてみました。
→http://iijimas.wankuma.com/2009/01/SelfReplicationJS.html
実行結果は何も面白くありません。数字をカウントアップして表示するだけです。
ソースの表示すると、その都度HTMLが変わっているのがわかります。
このようなプログラム(スクリプト)を書くこと自体がパズルっぽくて面白いと思うのは僕だけでしょうか。
実際の生命とか、コンピュータウイルスとかもこんなアルゴリズムかその応用でできているのでしょうか。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Self Replication JS</title>
<script type="text/javascript">
var v="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head>\r\n<meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" />\r\n<title>Self Replication JS<"+"/title>\r\n<script type=\"text/javascript\">\r\n";
var w="function encode(s){\r\nvar r=\"\";\r\nfor(var i=0;i<s.length;i++){\r\nc=s.charAt(i);\r\nr+=(c=='\"') ? \"\\\\\\\"\":\r\n(c.charCodeAt()==10) ? \"\\\\n\":\r\n(c.charCodeAt()==13) ? \"\\\\r\":\r\n(c.charCodeAt()==92) ? \"\\\\\\\\\":\r\n(c==\"<\" && i+1<s.length && s.charAt(i+1) == \"/\") ? \"<\\\"+\\\"\":\r\nc;\r\n};\r\nreturn '\"'+r+'\"';\r\n}\r\n";
var x="function next(i){\r\nvar s = v;\r\ns+=\"var v=\"+encode(v)+\";\\r\\n\";\r\ns+=\"var w=\"+encode(w)+\";\\r\\n\";\r\ns+=\"var x=\"+encode(x)+\";\\r\\n\";\r\ns+=\"var y=\"+encode(y)+\";\\r\\n\";\r\ns+=\"var z=\"+encode(z)+\";\\r\\n\";\r\ns+=w+x+y+i+z;\r\ndocument.open();document.write(s);\r\nsetTimeout(\"next(\"+(i+1)+\")\",1000);\r\n}\r\n";
var y="<"+"/script>\r\n<"+"/head>\r\n<body>\r\n";
var z="<"+"/body>\r\n<"+"/html>";
function encode(s){
var r="";
for(var i=0;i<s.length;i++){
c=s.charAt(i);
r+=(c=='"') ? "\\\"":
(c.charCodeAt()==10) ? "\\n":
(c.charCodeAt()==13) ? "\\r":
(c.charCodeAt()==92) ? "\\\\":
(c=="<" && i+1<s.length && s.charAt(i+1) == "/") ? "<\"+\"":
c;
};
return '"'+r+'"';
}
function next(i){
var s = v;
s+="var v="+encode(v)+";\r\n";
s+="var w="+encode(w)+";\r\n";
s+="var x="+encode(x)+";\r\n";
s+="var y="+encode(y)+";\r\n";
s+="var z="+encode(z)+";\r\n";
s+=w+x+y+i+z;
document.open();document.write(s);
setTimeout("next("+(i+1)+")",1000);
}
</script>
</head>
<body onload="next(0);">
</body>
</html>