Quine もどきで アスキーアート in 01/01/2016. Sincerely, AkinoHonami – 2016年年賀状

2016年年賀状

あけましておめでとうございます.
秋乃穂波です.(馴染みの無い方もいるかもしれませんが,ハンドルネーム,というやつですので,ページの間違いではありませんよ)

まずは,年賀状を受け取って(もしくは画像を見て)”なんのこっちゃい”と思った皆様.
申し訳ありません.それと,安心してください.ちゃんと解説します.

今年の年賀状,なんぞや

はい,まずは今年の年賀状.
こんな感じですね.
以下の解説はネタバレになりますので,コードだけ持って帰りたい人はコピーして一旦回れ右をどうぞ.

#ThisScriptIsWrittenInPython2.7.WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x.
W=" ";U="_";D='"'*3;Q="'"*3;S="<";L="&";T=">";zc=r"""import<re,random,zlib,base64&f=['eNrtld0JgDAMhI
e                          5wb                          L/FgqC9pI   0ptGK                          D
w                          0I5                          UL5zG+BZ    WmT3e                          6
UxViMxZjLsEbO44DzRH6Sz     O8d     QsC4LtJ3eaykIOKq     5KBY0       QbQRk     CSYUT1IPlkqOu+pBE9hg0a
Thp8SXTz9BkIGT0JuiMmxM     ENE     c+HWw8EydcVlntGs     a/          Il5jz     wnz4mQ13yeicc+C1rZOQnq
28MQYmM+qLO82QbxiYzHjy     xCU     Z7z+jf7ENVaI+Qw=     =','eNr     dlkES     gDAIAx/Th+X/v3Cc8dCGQN
GBHuRYq1tLCIzxk8Ad/qM6     Bk4     wcIKBEwycYKCZodV     VzJCQao     aClDM     EpJ5hIQ0MA+lgMKSFQZAeh
iU69Zq9U1kYfHWZH37LYA3     4XW     YV5CuGfHfjmbsOpE     sPqW+Yj     c/qnr     HYS3wXtNEcyGfMPslysuF8
d+OFs+HnGEOr0bdC0x0TtS     jV6     DuhaPNRPpTG+PTRw     DCfKEas     6WUlh     JOPU/JybUrhks1wThROhmj
yA7cJfJlFHU8MKuNXcQF5D     VYr     ','eNrdlMsRwCAIR     IuxMPrv     IpOJ8     YMsioFD5IruUz6b0iFBd5h
TXhA/BNTyRAA1X4So540QF     P0R     g2YEgqnGIDrdKESj     HIco2pG     IrB6L     qJB4g4xFPBCpeCK4T77NnB
akSUw2Zpj1yigZ/LQFB5O9     JzP     YOcTAbg+vNoNPqPb     8pFJJ+I     K15SL     2WUO67fkaA8e/GMs7tMlIW
j+0sbcwEp4rvFtWhjLXoFx     EZg     bfpsF+iHvJDuOTJ5     4ZF7P2O     Cs=',     'eNpTVh4mIB4nICQJ10/QH
ArtiCfGDtyeQ6KxSsLNRRM     lJQ     AJ2IHmUJrYgc1Po3     aM2jFqB     8l2EC     6vSLCD7DKRSnYQCjNyw2rU
j                          lE7     Ru0YWXaQ3YajVplI     uR3DBAA     A7Lix                          k
w                          =='     ]&df=zlib.decomp     ress(ba     se64.                          b
6     4decode(f[0]))&fn=f[1:]+     f[0:1]&nc="#This     ScriptI     sWrit     tenInPython2.7.W     h
e     nYouExecute,PleaseDoInPy     thon2.7.NoteThat     ItDoesN     otWor     kInPython3.x."+'     W
=     "%s";U="%s";D=\'"\'*3;Q=     "\'"*3;S="%s";L=     "%s";T=     "%s";     zc=r'%(W,U,S,L,T     )
+     D+re.sub(r"f=\[.+?\]","f     =%s"%("".join(("     %s"%fn)     .spli     t())),"".join(zc     .
s     plit()))+';'+Q+"".join([     random.choice("a     bcdefgh     ijklm     nopqrstuvwxyz+-*     /
=     :;[](){}")<for<x<in<rang     e(3200)])&for<i<     in<rang     e(320     0):&>if<df[i]==U     :
&     >>nc=nc[:i]+W+nc[i:]&c="     "&for<i<in<range     (31):&>     c+=nc     [i*100:(i+1)*100     ]
+     "\n"&ec=Q+D+r';exec(("".     join(zc.split())     ).repla     ce(S,     W).replace(L,"\n     "
)     .replace(T,W*4))'&c=c[:-     len(ec)-1]+ec+"\     n#Pleas     eVisi     t'http://congraz     i
a     .net/presto/works/nengaj     o-2016.html'.Sin     cerely,     MyRea     lNameAkaAkinoHon     a
m     i"&print<c;'''ip};;i/ydp     ]vkzn/c:fmlx;jit     :m/dq-n     f=*=;     qhdk:={nmuq=={n(     x
}                          rul                          jon]g+z     o-r-x                          a
z                          ou;                          mje(-bm     qvznt                          =
k-;rpo+ny=z}xb)cf-:z-m'''""";exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))
#PleaseVisit'http://congrazia.net/presto/works/nengajo-2016.html'.Sincerely,MyRealNameAkaAkinoHonami

一応画像でも置いておきます.
2016年年賀状

さてさて,全くもって意味が分からないという方向けに説明を始めると,これは Python というプログラミング言語で書かれたプログラムです.
そして,このプログラムを実行すると……
と,これ以降は本当ネタバレ.
もう一度言いますが”ソース書くのがめんどうだから来た.実行してくるからコードよこせ”という方は,上のものをコピーしてください.

さて,話を元に戻しましょう.
これはプログラム……ということで,実行する訳です.
そこで,実行すると表示されるのが以下.

#ThisScriptIsWrittenInPython2.7.WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x.
W=" ";U="_";D='"'*3;Q="'"*3;S="<";L="&";T=">";zc=r"""import<re,random,zlib,base64&f=['eNrdlkESgDAIAx
/Th+X/v3Cc8dCGQNGBHuRYq1tLCIzxk8Ad/qM6Bk4wcIKBEwycYKCZodVVzJCQaoaClDMEpJ5hIQ0MA+lgMKSFQZAehiU69Zq9U1
k    YfHWZH37LYA34X    WYV5CuGfHfjmbsOpEsPqW+Yjc/qnrHYS3wXtNEcyGfMPslysuF8d+OFs+HnGEOr0bdC0x0TtSjV6D
u    haPNRPpTG+PTRw    DCfKEas6WUlhJOPU/JybUrhks1wThROhmjyA7cJfJlFHU8MKuNXcQF5DVYr','eNrdlMsRwCAIRIu
x    MPrvIpOJ8YMsio    FD5IruUz6b0iFBd5hTXhA/BNTyRAA1X4So540QFP0Rg2YEgqnGIDrdKESjHIco2pGIrB6LqJB4g4x
F    PBCpeCK4T77NnB    akSUw2Zpj1yigZ/LQFB5O9JzPYOcTAbg+vNoNPqPb8pFJJ+IK15SL2WUO67fkaA8e/GMs7tMlIWj+
0    sbcwEp4rvFtWhj    LXoFxEZgbfpsF+iHvJDuOTJ54ZF7P2OCs=','eNpTVh4mIB4nICQJ10/QHArtiCfGDtyeQ6KxSsLN
R    RMlJQAJ2IHmUJr    Ygc1Po3aM2jFqB8l2EC6vSLCD7DKRSnYQCjNyw2rUjlE7Ru0YWXaQ3YajVplIuR3DBAAA7Lixkw==
'    ,'eNrtld0JgDAM    hIe5wbL/FgqC9pI0ptGKDw0I5UL5zG+BZWmT3e6UxViMxZjLsEbO44DzRH6SzO8dQsC4LtJ3eaykI
O    Kq5KBY0QbQRkCS    YUT1IPlkqOu+pBE9hg0aThp8SXTz9BkIGT0JuiMmxMENEc+HWw8EydcVlntGsa/Il5jzwnz4mQ13y
e    icc+C1rZOQnq28    MQYmM+qLO82QbxiYzHjyxCUZ7z+jf7ENVaI+Qw==']&df=zlib.decompress(base64.b64decod
e                      (f[0]))      &fn   =   f[1      :]+f[0:   1]&      nc="    #ThisScriptIs    W
r                      itten   InPy   t   h   o   n2.7   .When   Y   ouEx   ecu    te,PleaseDo    In
P    ython2.7.NoteT    hat   ItDoesNo     t     WorkInPy   tho     n3.x."+'   W=   "%s";U="%s"   ;D=
\    '"\'*3;Q="\'"*    3;   S="%s";L="    %    s";T="%s";   zc    =r'%(W,U,S   ,L   ,T)+D+re.   sub(
r    "f=\[.+?\]","f    =    %s"%("".joi   n   (("%s"%fn).    s   plit())),""    .    join(zc    .spl
i    t()))+';'+Q+""    .   join([random   .   choice("abcd   e   fghijklmnopq   rs   tuvwxyz   +-*/=
:    ;[](){}")<for<    x    <in<range(3   2   00)])&for<i    <   in<range(32    00)   :&>if   <df[i]
=    =U:&>>nc=nc[:i    ]+   W+nc[i:]&c    =   ""&for<i<in   <r   ange(31):&>   c+=n    c[i    *100:(
i    +1)*100]+"\n"&    ec=   Q+D+r';e     x     ec(("".j   oin     (zc.spli   t())).   rep   lace(S,
W    ).replace(L,"\    n").r   epla   c   e   (   T,W*   4))'&   c   =c[:   -len(ec)-   1   ]+ec+"\n
#    PleaseVisit'ht    tp://co      ngr   a   zia      .net/pr   est      o/works/neng     ajo-2016.
html'.Sincerely,MyRealNameAkaAkinoHonami"&p   rint<c;'''ip};;i   /ydp]vkzn/c:fmlx;jit:    m/dq-nf=*=
;qhdk:={nmuq=={n(x}ruljon]g+zo-r-xazou;mje(   -bmqvznt=k-;rpo+   ny=z}xb)cf-:z-m''';''   'vcot}j+*:]
-z+-qn)svfh;x-eml]v(m=y;c)r[{gjy(-[ipatv}m}   ;k(xqn}bhv)rwhyj   rtp:w[=p/:z{{=ktuj}i   t)ks}u]x[}s:
ztjgqcc;u/dyltj]+j:{gi[;hmviui(tj=-dh):h{l:   i}zzjy*c=c=qd[(h   xcpfyj:y-r/;z}xwtx=    ]p;yqyugo/mp
-b*s/nxn-tg:m{):kyratxzm:e/y]{]p*bgxocz[{ap   d}=jt)h]-v-)i:uj   g}[u;-pasnpfzxusb};   wac{eut{r;t*-
j/wmd:wjpgzvur)t=wacah;j][umot*qf;dzhuli//i   {zjp{;;qytkls-r(   ]:xgac/]ji}e+u)arw   wqnqhdb:yrcmlp
fso(=chkjha;g+=w=yerzmha-:m[jakgx}rwitwy[}[   zb-zt::qkmnnug]q   tc}]+*ihe-gjd*r]e    {+/)zdkrmdbetm
m[pe)l*-b)dme{gp(ifn[*'''""";exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))
#PleaseVisit'http://congrazia.net/presto/works/nengajo-2016.html'.Sincerely,MyRealNameAkaAkinoHonami

(ここからの画像は勘弁して下さい……)
……
なんとなく読めて来ましたかね.
これを実行すると表示されるのが

#ThisScriptIsWrittenInPython2.7.WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x.
W=" ";U="_";D='"'*3;Q="'"*3;S="<";L="&";T=">";zc=r"""import<re,random,zlib,base64&f=['eNrdlMsRwCAIRI
u     xMPrvIpOJ8YMsioFD5IruU    z6b0iFBd5hTXhA/BNTyRAA1X4So540QFP0Rg2YEgqnGIDrdKESjHIco2pGIrB6LqJB4g
4      xFPBCpeCK4T77NnBakSUw    2Zpj1yigZ/LQFB5O9JzPYOcTAbg+vNoNPqPb8pFJJ+IK15SL2WUO67fkaA8e/GMs7tMl
I       Wj+0sbcwEp4rvFtWhjLX    oFxEZgbfpsF+iHvJDuOTJ54ZF7P2OCs=','eNpTVh4mIB4nICQJ10/QHArtiCfGDtyeQ
6        KxSsLNRRMlJQAJ2IHmU    JrYgc1Po3aM2jFqB8l2EC6vSLCD7DKRSnYQCjNyw2rUjlE7Ru0YWXaQ3YajVplIuR3DB
A         AA7Lixkw==','eNrtl    d0JgDAMhIe5wbL/FgqC9pI0ptGKDw0I5UL5zG+BZWmT3e6UxViMxZjLsEbO44DzRH6Sz
O          8dQsC4LtJ3eaykIOK    q5KBY0QbQRkCSYUT1IPlkqOu+pBE9hg0aThp8SXTz9BkIGT0JuiMmxMENEc+HWw8Eydc
V     l     ntGsa/Il5jzwnz4m    Q13yeicc+C1rZOQnq28MQYmM+qLO82QbxiYzHjyxCUZ7z+jf7ENVaI+Qw==','eNrdlk
E     Sg     DAIAx/Th+X/v3Cc    8dCGQNGBHuRYq1tLCIzxk8Ad/qM6Bk4wcIKBEwycYKCZodVVzJCQaoaClDMEpJ5hIQ0M
A     +lg     MKSFQZAehiU69Z    q9U1kYfHWZH37LYA34XWYV5CuGfHfjmbsOpEsPqW+Yjc/qnrHYS3wXtNEcyGfMPslysu
F     8d+O     Fs+HnGEOr0bdC    0x0TtSjV6DuhaPNRPpTG+PTRwDCfKEas6WUlhJOPU/JybUrhks1wThROhmjyA7cJfJlF
H     U8MKu     NXcQF5DVYr']    &df=zlib.decompress(base64.b64decode(f[0]))&fn=f[1:]+f[0:1]&nc="#Thi
s     Script     IsWrittenIn    Python2.7.WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkIn
P     ython3.     x."+'W="%s    ";U="%s";D=\'"\'*3;Q="\'"*3;S="%s";L="%s";T="%s";zc=r'%(W,U,S,L,T)+D
+     re.sub(r     "f=\[.+?\    ]","f=%s"%("".join(("%s"%fn).split())),"".join(zc.split()))+';'+Q+""
.     join([ran     dom.choi    ce("abcdefghi            jklmnopqrst    uvwxyz+-*/=:;[](){}")<f    o
r     <x<in<rang     e(3200)    ])&for<i<i     n<range(     3200):&>    if<df[i]==U:&>>nc=nc[:i    ]
+     W+nc[i:]&c=     ""&for    <i<in<r     ange(31):&>c+=     nc[i*    100:(i+1)*100]+"\n"&ec=    Q
+     D+r';exec(("     ".joi    n(zc.s    plit())).replace(S    ,W).r    eplace(L,"\n").replac    e(
T     ,W*4))'&c=c[:     -len    (ec)-    1]+ec+"\n#PleaseVisi    t'ht    tp://congr  azia.net/    pr
e     sto/works/neng     ajo    -201    6.html'.Sincerely,MyRe    alN    ameAkaAki    noHonami    "&
p     rint<c;'''ip};;     i/    ydp]                              vkzn    /c:fmlx;    jit:m/d     q-
n     f=*=;qhdk:={nmuq     =    ={n(                              x}rul    jon]g+z    o-r-xaz    ou;
m     je(-bmqvznt=k-;rp         o+ny    =z}xb)cf-:z-m''';'''vcot}j+*:]-     z+-qn)    svfh;x    -eml
]     v(m=y;c)r[{gjy(-[i        patv}   m};k(xqn}bhv)rwhyjrtp:   w[=p/:z    {{=kt      uj}i     t)ks
}     u]x[}s:ztjgqcc;u/dy       ltj]+j   :{gi[;hmviui(tj=-dh)   :h{l:i}zz    jy*        c=c    =qd[(
h     xcpfyj:y-r/;z}xwtx=]      p;yqyug    o/mp-b*s/nxn-tg:    m{):kyratxz    m    :e    /    y]{]p*
b     gxocz[{apd}=jt)h]-v-)     i:ujg}[u;      -pasnpfz      xusb};wac{eut{      r;t*-j      /wmd:wj
p     gzvur)t=wacah;j][umot*    qf;dzhuli//i{            zjp{;;qytkls-r(]:xg    ac/]ji}e    +u)arwwq
nqhdb:yrcmlpfso(=chkjh'''""";exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))
#PleaseVisit'http://congrazia.net/presto/works/nengajo-2016.html'.Sincerely,MyRealNameAkaAkinoHonami

で,これを実行すると

#ThisScriptIsWrittenInPython2.7.WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x.
W=" ";U="_";D='"'*3;Q="'"*3;S="<";L="&";T=">";zc=r"""import<re,random,zlib,base64&f=['eNpTVh4mIB4nIC
Q     J10/QHArtiCfGDtyeQ6KxS     sLNRRMlJQAJ2IHmUJrYgc1Po3aM2jFqB8l2EC6vSLCD7DKRSnYQCjNyw2rUjlE7Ru0Y
WX     aQ3YajVplIuR3DBAAA7L     ixkw==','eNrtld0JgDAMhIe5wbL/FgqC9pI0ptGKDw0I5UL5zG+BZWmT3e6UxViMxZj
LsE     bO44DzRH6SzO8dQsC4     LtJ3eaykIOKq5KBY0QbQRkCSYUT1IPlkqOu+pBE9hg0aThp8SXTz9BkIGT0JuiMmxMENE
c+HW     w8EydcVlntGsa/Il     5jzwnz4mQ13yeicc+C1rZOQnq28MQYmM+qLO82QbxiYzHjyxCUZ7z+jf7ENVaI+Qw==','
eNrdl     kESgDAIAx/Th+X     /v3Cc8dCGQNGBHuRYq1tLCIzxk8Ad/qM6Bk4wcIKBEwycYKCZodVVzJCQaoaClDMEpJ5hIQ
0MA+lg     MKSFQZAehiU6     9Zq9U1kYfHWZH37LYA34XWYV5CuGfHfjmbsOpEsPqW+Yjc/qnrHYS3wXtNEcyGfMPslysuF8
d+OFs+H     nGEOr0bdC0     x0TtSjV6DuhaPNRPpTG+PTRwDCfKEas6WUlhJOPU/JybUrhks1wThROhmjyA7cJfJlFHU8MKu
NXcQF5DV     Yr','eNr     dlMsRwCAIRIuxMPrvIpOJ8YMsioFD5IruUz6b0iFBd5hTXhA/BNTyRAA1X4So540QFP0Rg2YEg
qnGIDrdKE     SjHIco     2pGIrB6LqJB4g4xFPBCpeCK4T77NnBakSUw2Zpj1yigZ/LQFB5O9JzPYOcTAbg+vNoNPqPb8pFJ
J+IK15SL2W     UO67     fkaA8e/GMs7tMlIWj+0sbcwEp4rvFtWhjLXoFxEZgbfpsF+iHvJDuOTJ54ZF7P2OCs=']&df=zli
b.decompres     s(     base64.b64decode(f[0]))&fn=f[1:]+f[0:1]&nc="#ThisScriptIsWrittenInPython2.7.W
henYouExecut          e,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x."+'W="%s";U="%s";D=\'"\
'*3;Q="\'"*3;        S="%s";L="%s";T="%s";zc=r'%(W,U,S,L,T)+D+re.sub(r"f=\[.+?\]","f=%s"%("".join(("
%s"%fn).split(      ))),"".join(zc.split()))+';'+Q+"".join([random.choice("abcdefghijklmnopqrstuvwxy
z+-*/=:;[](){}"    )<for<x<in            <range(3200)])&for<          i<in   <r   ange        (3200)
:&>if<df[i]==U:    &>>nc=n     c[:i]+W+     nc[i:]&c=""&f     or<i<i     n   <r   an    ge(31   ):&>
c+=nc[i*100:(i+    1)*1     00]+"\n"&ec=Q+     D+r';ex     ec(("".join(      zc   .    split()    ))
.replace(S,W).r    epl    ace(L,"\n").replac    e(T,W    *4))'&c=c[:-len(    ec      )-1]+ec+"\    n
#PleaseVisit'ht    tp    ://congrazia.net/pre    sto    /works/nengajo-201   6.     html'.Sincerely,
MyRealNameAkaAk    i    noHonami"&print<c;'''i    p    };;i/ydp]vkzn/c:fml   x;   jit:m/dq-nf=*=;qhd
k:={nmuq=={n(x}    r                              u    ljon]g+zo-r-xazou;m   je   (-bmqvznt=k-;rpo+n
y=z}xb)cf-:z-m'    '                              '    ;'''vcot}j+*:]-z+-q   n)   svfh;x-eml]v(m=y;c
)r[{gjy(-[ipatv    }    m};k(xqn}bhv)rwhyjrtp:w[=p/    :z{{=ktuj}it)ks}u]x   [}   s:ztjgqcc;u/dyltj]
+j:{gi[;hmviui(    tj   =-dh):h{l:i}zzjy*c=c=q   d[(   hxcpfyj:y-r/;z}xwtx   =]   p;yqyugo/mp-b*s/nx
n-tg:m{):kyratx    zm:   e/y]{]p*bgxocz[{apd}   =jt)h   ]-v-)i:ujg}[u;-pas   np   fzxusb};wac{eut{r;
t*-j/wmd:wjpgzv    ur)t    =wacah;j][umot*q    f;dzhul    i//i{zjp{;;qyt     kl   s-r(]:xgac/]ji}e+u
)arwwqnqhdb:yrc    mlpfso      (=chkjh'      '';'''alqc+      towzq{         xk   **[kez:ulrwrine{}l
hwoq;+;=]b=u}[w    xpo:lxmohs            qk/lzjk}*uxx)/)juwi          dmo)   }+   g](zzvd(su[gb;{uak
lg)p}cuag;eao/gbppepfi'''""";exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))
#PleaseVisit'http://congrazia.net/presto/works/nengajo-2016.html'.Sincerely,MyRealNameAkaAkinoHonami

で,こ(ry

#ThisScriptIsWrittenInPython2.7.WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x.
W=" ";U="_";D='"'*3;Q="'"*3;S="<";L="&";T=">";zc=r"""import<re,random,zlib,base64&f=['eNrtld0JgDAMhI
e                          5wb                          L/FgqC9pI   0ptGK                          D
w                          0I5                          UL5zG+BZ    WmT3e                          6
UxViMxZjLsEbO44DzRH6Sz     O8d     QsC4LtJ3eaykIOKq     5KBY0       QbQRk     CSYUT1IPlkqOu+pBE9hg0a
Thp8SXTz9BkIGT0JuiMmxM     ENE     c+HWw8EydcVlntGs     a/          Il5jz     wnz4mQ13yeicc+C1rZOQnq
28MQYmM+qLO82QbxiYzHjy     xCU     Z7z+jf7ENVaI+Qw=     =','eNr     dlkES     gDAIAx/Th+X/v3Cc8dCGQN
GBHuRYq1tLCIzxk8Ad/qM6     Bk4     wcIKBEwycYKCZodV     VzJCQao     aClDM     EpJ5hIQ0MA+lgMKSFQZAeh
iU69Zq9U1kYfHWZH37LYA3     4XW     YV5CuGfHfjmbsOpE     sPqW+Yj     c/qnr     HYS3wXtNEcyGfMPslysuF8
d+OFs+HnGEOr0bdC0x0TtS     jV6     DuhaPNRPpTG+PTRw     DCfKEas     6WUlh     JOPU/JybUrhks1wThROhmj
yA7cJfJlFHU8MKuNXcQF5D     VYr     ','eNrdlMsRwCAIR     IuxMPrv     IpOJ8     YMsioFD5IruUz6b0iFBd5h
TXhA/BNTyRAA1X4So540QF     P0R     g2YEgqnGIDrdKESj     HIco2pG     IrB6L     qJB4g4xFPBCpeCK4T77NnB
akSUw2Zpj1yigZ/LQFB5O9     JzP     YOcTAbg+vNoNPqPb     8pFJJ+I     K15SL     2WUO67fkaA8e/GMs7tMlIW
j+0sbcwEp4rvFtWhjLXoFx     EZg     bfpsF+iHvJDuOTJ5     4ZF7P2O     Cs=',     'eNpTVh4mIB4nICQJ10/QH
ArtiCfGDtyeQ6KxSsLNRRM     lJQ     AJ2IHmUJrYgc1Po3     aM2jFqB     8l2EC     6vSLCD7DKRSnYQCjNyw2rU
j                          lE7     Ru0YWXaQ3YajVplI     uR3DBAA     A7Lix                          k
w                          =='     ]&df=zlib.decomp     ress(ba     se64.                          b
6     4decode(f[0]))&fn=f[1:]+     f[0:1]&nc="#This     ScriptI     sWrit     tenInPython2.7.W     h
e     nYouExecute,PleaseDoInPy     thon2.7.NoteThat     ItDoesN     otWor     kInPython3.x."+'     W
=     "%s";U="%s";D=\'"\'*3;Q=     "\'"*3;S="%s";L=     "%s";T=     "%s";     zc=r'%(W,U,S,L,T     )
+     D+re.sub(r"f=\[.+?\]","f     =%s"%("".join(("     %s"%fn)     .spli     t())),"".join(zc     .
s     plit()))+';'+Q+"".join([     random.choice("a     bcdefgh     ijklm     nopqrstuvwxyz+-*     /
=     :;[](){}")<for<x<in<rang     e(3200)])&for<i<     in<rang     e(320     0):&>if<df[i]==U     :
&     >>nc=nc[:i]+W+nc[i:]&c="     "&for<i<in<range     (31):&>     c+=nc     [i*100:(i+1)*100     ]
+     "\n"&ec=Q+D+r';exec(("".     join(zc.split())     ).repla     ce(S,     W).replace(L,"\n     "
)     .replace(T,W*4))'&c=c[:-     len(ec)-1]+ec+"\     n#Pleas     eVisi     t'http://congraz     i
a     .net/presto/works/nengaj     o-2016.html'.Sin     cerely,     MyRea     lNameAkaAkinoHon     a
m     i"&print<c;'''ip};;i/ydp     ]vkzn/c:fmlx;jit     :m/dq-n     f=*=;     qhdk:={nmuq=={n(     x
}                          rul                          jon]g+z     o-r-x                          a
z                          ou;                          mje(-bm     qvznt                          =
k-;rpo+ny=z}xb)cf-:z-m'''""";exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))
#PleaseVisit'http://congrazia.net/presto/works/nengajo-2016.html'.Sincerely,MyRealNameAkaAkinoHonami

と,元に戻ります.

“2016 Happy New Year”

改めまして,あけましておめでとうございます.
今年もよろしくお願い致します.

ソース解説

さて,ここからはソースの解説をしていきます.

まずは,このコードのために参考にしたページから紹介しておきます.
超絶技巧 Ruby プログラミング – Esoteric, Obfuscated Ruby Programming
(参考というかほぼパクリです……偉大なる先人に敬礼)

さて,では,2016 に見えるコードを分かりやすい形に改変したものから.
(後で細かく説明を加えるので,ひとまずは読めなくて大丈夫です)
本来は zc 内の改行やスペースは代替文字で置き換えられているモノを,見やすくしているため,一部変更があります.

# -*- coding: utf-8 -*-
# ThisScriptIsWrittenInPython2.7.
# WhenYouExecute,PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x.

# zc からコメントを剥ぐ用
import re

# スペースや改行を代替文字に変えるための変数定義
W=" "
U="_"
D='"'*3
Q="'"*3
S="<"
L="&"
T=">"

# exec で実行するコード
zc=ur"""
import re, random, zlib, base64

# 書く文字のドット情報.順に 2016, happy, new, year
f=[
    ('eNrtld0JgDAMhIe5wbL/FgqC9pI0ptGKDw0I5UL5zG+BZWmT3e6UxViMxZjLsEbO44DzRH6Sz'
        'O8dQsC4LtJ3eaykIOKq5KBY0QbQRkCSYUT1IPlkqOu+pBE9hg0aThp8SXTz9BkIGT0JuiM'
        'mxMENEc+HWw8EydcVlntGsa/Il5jzwnz4mQ13yeicc+C1rZOQnq28MQYmM+qLO82QbxiYz'
        'HjyxCUZ7z+jf7ENVaI+Qw=='),
    ('eNrdlkESgDAIAx/Th+X/v3Cc8dCGQNGBHuRYq1tLCIzxk8Ad/qM6Bk4wcIKBEwycYKCZodVVz'
        'JCQaoaClDMEpJ5hIQ0MA+lgMKSFQZAehiU69Zq9U1kYfHWZH37LYA34XWYV5CuGfHfjmbs'
        'OpEsPqW+Yjc/qnrHYS3wXtNEcyGfMPslysuF8d+OFs+HnGEOr0bdC0x0TtSjV6DuhaPNRP'
        'pTG+PTRwDCfKEas6WUlhJOPU/JybUrhks1wThROhmjyA7cJfJlFHU8MKuNXcQF5DVYr'),
    ('eNrdlMsRwCAIRIuxMPrvIpOJ8YMsioFD5IruUz6b0iFBd5hTXhA/BNTyRAA1X4So540QFP0Rg'
        '2YEgqnGIDrdKESjHIco2pGIrB6LqJB4g4xFPBCpeCK4T77NnBakSUw2Zpj1yigZ/LQFB5O'
        '9JzPYOcTAbg+vNoNPqPb8pFJJ+IK15SL2WUO67fkaA8e/GMs7tMlIWj+0sbcwEp4rvFtWh'
        'jLXoFxEZgbfpsF+iHvJDuOTJ54ZF7P2OCs='),
    ('eNpTVh4mIB4nICQJ10/QHArtiCfGDtyeQ6KxSsLNRRMlJQAJ2IHmUJrYgc1Po3aM2jFqB8l2E'
        'C6vSLCD7DKRSnYQCjNyw2rUjlE7Ru0YWXaQ3YajVplIuR3DBAAA7Lixkw==')
    ]

# 圧縮されたドット情報から,今回のもの(先頭)を展開
df=zlib.decompress(base64.b64decode(f[0]))

# 新しいドット情報を作成(順を入れ替えるだけ)
fn=f[1:]+f[0:1]

# コードをつくる(exec とその少し前, 最終行を除く)
nc=(
    "#ThisScriptIsWrittenInPython2.7.WhenYouExecute,"
    "PleaseDoInPython2.7.NoteThatItDoesNotWorkInPython3.x."
    'W="%s";U="%s";D=\'"\'*3;Q="\'"*3;S="%s";L="%s";T="%s";zc=r' % (W,U,S,L,T) +
    D +
    re.sub(r"f=\[.+?\]", "f=%s" % ("".join(("%s" % fn).split())),
        "".join(zc.split())) +
    ';' +
    Q +
    "".join(
        [random.choice("abcdefghijklmnopqrstuvwxyz+-*/=:;[](){}")
            for x in range(3200)]
        )
    )

# スペースの挿入
for i in range(3200):
    if df[i]==U:
        nc = nc[:i] + W + nc[i:]

c= ""

# 改行の挿入
for i in range(31):
    c += nc[i*100:(i+1)*100] + "\n"

# 追加部分
ec=(
    Q +
    D +
    r';exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))'
    )

# 追加部分挿入
c=(c[:-len(ec) - 1] +
    ec +
    "\n#PleaseVisit'http://congrazia.net/presto/works/nengajo-2016.html'." +
    "Sincerely,MyRealNameAkaAkinoHonami"
    )

# 出力
print c;

# 画面埋め用のゴミ
'''ip};;i/ydp]vkzn/c:fmlx;jit:m/dq-nf=*=;qhdk:={nmuq=={n(x
}ruljon]g+zo-r-xa
zou;mje(-bmqvznt=
k-;rpo+ny=z}xb)cf-:z-m'''
"""

# zc は本来,スペースや改行を代替文字に置き換えているため,その実行はコメントアウト
# exec(("".join(zc.split())).replace(S,W).replace(L,"\n").replace(T,W*4))

# zc からコメントを剥ぐ
zc = re.sub(ur"\#\s.+?\n", "", zc)

# zc を実行
exec(zc)

# PleaseExecuteThisOrVisit'http://congrazia.net/presto/works/nengajo-2016.html'.
# 01/01/2016.Sincerely,

はい.
大分汚いコードですね.
実は結構文字数に制約があり,短いコードにしたため(もちろん実力不足もありますが)汚くなってしまっております.
このままではわかりづらいと思うので,大まかな仕組みから解説を.

やってること

このプログラムがやってることは

1, 自身の Quine(もどき) を作成
(実際は出力する文字のドットの情報を更新しているので,厳密な Quine ではない)
2, 与えられたドット情報を使ってスペースを埋め込む
3, 出力

です.

Quine とはなんぞや

まずは Quine の説明から.
と言っても,Wikipediaの記事 を読むのが簡単かも.
簡単にいえば,「自分自身を出力するプログラム」です.

今回,これを Python で実現するにあたり使用したのがexec
(リンク先は Python の documentation)
簡単にいえば,与えられた文字列をスクリプトとして実行する関数ですね.
Quine に使うとこんな感じ.

script="""
def test():
    print 'script="'+'""%s"' % script +'""'
    print 'exec script'

test()
"""
exec script

(三連のダブルクォーテーションを,ちょっと汚い方法で出してるから読みにくいかも)

つまり,この年賀状のやっていることは,毎回(ドット情報以外)同じコードを吐きつつ,それにスペース等を入れていく.
ということな訳です.

ドット情報の更新

先程も話しましたが,これ,一回の実行毎にドット情報を更新する必要があります.
今回はコードが短くなって簡単な方法ということで,リストをくるくるしてます.
……自然言語で伝えることを諦めたので以下のコードで.

f = [0, 1, 2, 3]
new_f = f[1:] + f[0:1]
print new_f
# [1, 2, 3, 0] 

まあそういうこと.
あとは,これで,f の定義を正規表現を使ってリプレイスするだけです.
(解説コードの 51 行目ですね.スペースを詰める為に面倒な事をしているので読みにくいですが)

大体の解説がこれで終わったような気もするので,次からはこれの実現について話していきます.

スペースと改行,それとスペース埋めの問題

“どうして Python なの?” “だって思うだろ.ふざけてるって”

はい.どうして Python を使うのか.
(それも,後で述べるけれど,Python は目的と相性が悪い)
勿論,自分が Python に慣れているから.というのもあるわけですが.
“なんで Python なんか使ったんだよ” というセリフが聞きたかったからです.
プログラミング言語を擬人化しているページ元ネタを解説しているページからも分かる通り,彼女 Python,こういうおちゃらけたこと苦手なんですよね.特に自分のコードでアスキーアートのようなものを作るとか.
なにせ,改行,インデントは文法のうち.スペースが使えないと書けない文が存在する.

for x in range(100):
    pass

とかですね.
一般的にこういうことは Ruby がやりやすいんだそうです.
さて,では解決方ですが……すごく単純.

1, 必要なスペース
代替文字で置き換えて,大胆に replace してます.
代替文字への置き換えはコード外で行っています.
replace は解説の 98 行目で.
それぞれ
スペースを “<", 改行を "$", インデント単位を ">”
にしています

2, 邪魔な(アスキーアートのための)スペース
こちらは doc 等を書くときに使う三連のダブルクォーテーションの中に全てを収めることで回避しています.
そもそもの空白文字は”<"に置き換えているため,混ざることはありません. 3, 余分な(アスキーアートのための)スペース埋め アスキーアートを作るためには,余分な文字列を挿入する必要があります. つまり,2016 の文字を作った後,さらに文字がないと下のほうが書けてしまう (コードを全て書ききってもまだアスキーアートには文字が必要) という場合を想定しないといけません. これは,zcの後に余分な文字列を,三連のシングルクォートで囲んたものを挿入することで回避しています. ただの文字列は文字列として評価されて終わりなので,表示を邪魔もしませんしね. (実は exec せずに実行している場合,対話環境だと邪魔してくるのですが……(笑)) 解説の 90 行目以降のものですね. 1, 2, 3 合わせるとつまり,こういうこと.

s="""
   for<
i<in  <ran
ge(5  ):$>
print<"Tes
ting  .%s"   %i$''
'Aof  Akih   o.'''
"""
code = "".join(s.split()).replace("$","\n").replace(">"," "*4).replace("<"," ")
exec(code)

ここまでくれば,後は簡単ですね
(と制作当時の私は思っていました)

ドット絵のデータ

次は,ドット絵のデータをどう埋めるか.
最初は専用の class を組んで,長方形を単位にして圧縮したり色々やっていたんですが明らかに容量が足りない訳です.
圧縮率は悪くなかったのですが class の定義とかが結構文字数を食ってしまうので,はがきのサイズにしようと思ったら 200 文字 × 64 行 みたいな気持ちの悪いコードになるわけです.
(流石に言いすぎですが)
なので,はじめからあるライブラリに頼ることに.
そこで使うのが zlib
そして,コードが明らかに短くなるデータ.
説明するより以下を見るほうが早いですね.
こんな感じ

####################################################################################################
####################################################################################################
#__________________________###__________________________#########___#####__________________________#
#__________________________###__________________________########____#####__________________________#
######################_____###_____################_____#####_______#####_____######################
######################_____###_____################_____##__________#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
######################_____###_____################_____#######_____#####_____######################
#__________________________###_____################_____#######_____#####__________________________#
#__________________________###_____################_____#######_____#####__________________________#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#_____########################_____################_____#######_____#####_____################_____#
#__________________________###__________________________#######_____#####__________________________#
#__________________________###__________________________#######_____#####__________________________#
####################################################################################################
####################################################################################################

はい.
制作も楽々.
しかも,同じ文字ばかり使うので,驚きの圧縮率.
こいつは 50 文字くらいに圧縮できたはずです.

しかしそれはASCIIではない

はい.文字数数えるところで気付きました.
解説の 61 行目からですね.
ここでちょっとずれたりするわけです.
\n なんかが文字コードの途中に現れると最悪です.
base64 に直さなきゃですね.
(なお,この圧縮率の低下によりコードが 80 × 25 から 100 × 32 必要になり,全てのドットを打ち直すことになる)
(まさかこの作業に n 時間もかかることになろうとは……)

結局,
ドットデータ -> zlib で圧縮した文字列 -> base64 にしたもの
にして保存して,使うときは逆に変換して使っています.
ここで,コード全体を圧縮する案もあったのですが,それじゃなんとなく面白みが無いなと思いやめました.
はがきの状態でも,代替文字さえ知っていれば(読みたいかはともかく)コードを読めるほうが面白いですからね.

まとめ

・Python でも意外と遊べる.
・久しぶりにガリガリと汚いスクリプトを書いた
・class, function などなどは偉大.無いと死ぬ
・来年は Ruby とかがいいな
・というかもうドット打ちたくない
・.txt とかを読んできて exec で python が遊べる
・.py で書け
・サーバ上で,cgi は 1 ファイルだけでも色々できるってことね
・やるべきではない
・長い文字列は zlib, base64 の合わせ技で短くしたうえで,出力できる
・その必要はおそらく今後一生ない
・というかどうせ読めないので出力しなくて良い
・年賀状には時間をかけるべきでない
・年を越した気にならない
・というか去年やるべきことが色々終わってない気がする
・結論: 所詮遊びは遊び.学べることはあまりない
・みんなもプログラミングで遊ぶときは気をつけてね

今年も,こういう無駄な事をたくさんしていける年にできたらいいなぁ.
勿論すべき事ももっとたくさんしていきたい.

ひとまずフロイトの精神分析学入門とかが読みたい.
(本当はユングの原型論とかに打ちのめされたいのだが)

まあ,何はともあれ,皆さんの一年が良きものでありますように.
また,今年も秋乃穂波をよろしくお願いいたします.

投稿者: 秋乃 穂波

こんぐらついあ.-con grazia- の管理人.秋乃穂波. B の鍵に腰掛けながら,A の鍵に足をついて活動している好奇心. 音楽やTRPG,プログラミングなどなど,趣味とネットを泳いでます. Twitter: @akh_cg mail: akihoあっとcongrazia.net

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です