読者です 読者をやめる 読者になる 読者になる

きくらげ観察日記

好きなことを、適当に。

書き初めQuineを書きました

皆様、明けましておめでとうございます。
新年早々インフルエンザに罹り、意図せず寝正月を送っていたのですが、そろそろ体調がよくなってきたので書き初めでもしてみようかと思います。

eval(x="c=($)=>String.fromCharCode($);q=c(34);b=c(92);s=c(59);n=c(10);sp=c(32);hs=c(3\
5############);pd=(_)=>_<10?'0'+_:''+_;fm={'!':[0,6,12,24,0,192]};Array.prototype.$=A\
r##  ####  ##ray.prototype.push;fm.E=[];fm.E.$(0);fm.E.$(255);fm.E.$(192);fm.E.$(255)\
;##  ####  ##fm.E.$(192);fm.E.$(255);fm.E.$(0);fm.H=[];fm.H.$(0);fm.H.$(195);fm.H.$(1\
9##        ##5);fm.H.$(255);fm.H.$(195);fm.H.$(195);fm.H.$(0);ms=[72,65,80,80,89,78,6\
9##  ####  ##,87,89,69,65,82,33].map(c).join('');cr=00;nx=(cr+1)%ms.length;fm.A=[];fm\
.##  ####  ##A.$(0);fm.A.$(126);fm.A.$(195);fm.A.$(255);fm.A.$(195);fm.A.$(195);fm.A.\
$############(0);x=x.replace('cr='+pd(cr),'cr='+pd(nx));y='eval(x='+q+x+q+'.split('+q\
+b+'n'+q+').join('+q+q+').split('+q+hs+q+').join('+q+q+').split('+q+sp+q+').join('+q+\
q+'))';fm.R=[];fm.R.$(0);fm.R.$(254);fm.R.$(195);fm.R.$(254);fm.R.$(195);fm.R.$(195);\
fm.R.$(0);l=y.length;i=0;p=(m)=>process.stdout.write(m);fm.N=[];fm.N.$(0);fm.N.$(227)\
;fm.N.$(211);fm.N.$(203);fm.N.$(199);fm.N.$(195);fm.N.$(0);cc=0;lc=0;fm.Y=[];fm.Y.$(0\
);fm.Y.$(231);fm.Y.$(102);fm.Y.$(60);fm.Y.$(24);fm.Y.$(24);fm.Y.$(0);wd=85;wb=1+12*(n\
x%7);hb=1+10*(Math.floor(nx/7));fm.W=[0,195,219,219,126,36,0];wn=12;hn=7;fm.P=[];fm.P\
.$(0);fm.P.$(254);fm.P.$(195);fm.P.$(254);fm.P.$(192);fm.P.$(192);fm.P.$(0);while(i<l\
){if(cc==wd){if(i==l-1){p(y[i]+n);break;}else{p(b+n);cc=0;lc++;continue;}}if(hb<=lc&&\
lc<hb+hn&&wb<=cc&&cc<wb+wn){w=cc-wb;h=lc-hb;if(w<2||10<=w){p(hs);cc++;continue;}else{\
p(fm[ms[nx]][h]&(1<<(7-w+2))?sp:hs);cc++;continue;}}p(y[i]);i++;cc++;}z=125;z+2356;z=\
++z;v=z+'v';z*z+v;3258;".split("\n").join("").split("#").join("").split(" ").join(""))

書き初めです。
こうしてみるとあまりよくわかりませんね。
端末で開くとこのように見えます。
f:id:cloudear8:20170106072810p:plain
ソースコードの左上のほうにでっかく「H」と書いてありますね。

このプログラムはnode.jsで動くJavaScriptになっています。実行してみると、以下のように出力されます。
f:id:cloudear8:20170106073249p:plain
先ほどの「H」が「A」に変わりました。位置も少し動いています。

この出力もプログラムになっていて、ちゃんと実行することができます。
f:id:cloudear8:20170106073459p:plain
今度はPになりました。

さらにひたすら実行し続けます。
f:id:cloudear8:20170106073549p:plain
f:id:cloudear8:20170106073556p:plain
f:id:cloudear8:20170106073603p:plain
f:id:cloudear8:20170106073609p:plain
f:id:cloudear8:20170106073616p:plain
f:id:cloudear8:20170106073623p:plain
f:id:cloudear8:20170106073629p:plain
f:id:cloudear8:20170106073635p:plain
f:id:cloudear8:20170106073642p:plain
f:id:cloudear8:20170106073648p:plain

「H」→「A」→「P」→「P」→「Y」→「N」→「E」→「W」→「Y」→「E」→「A」→「R」→「!」

そうです。このプログラムは、実行すると順に1文字ずつ文字が埋め込まれたソースコードを出力し、最終的に「HAPPY NEW YEAR!」と出力するプログラムになっています。

ちなみに、「!」のコードをさらに実行してみると、最初に戻ります。
f:id:cloudear8:20170106074314p:plain
このコードは最初の書き初めと全く同一のコードです。試しにdiffを取ってみましょう。
f:id:cloudear8:20170106074351p:plain
不思議ですね。でも、コツを掴むと意外と簡単に書けます。