| 計算機関係 (プログラミング篇) | 12/27/2007 |
わざと読みにくく解読不能にしたプログラムは、一般に「obfuscated」なプログラムと呼ばれ、Cについては 国際コンテスト も開かれていたりする。
最も面白い例を一つ。オリジナルは 上記コンテスト の1988年「phillipps.c」。想像をはるかに越えた出力が得られる。Javaにも移植されているが、このC版のほうがずっと面白い。謎解きについては ここ あたりが参考になる。
#include <stdio.h>
main(t,_,a )
char *a;
{
return!0<t ? t<3?main(-79,-13,a+main(-87,1-_,main(-86, 0, a+1 )+a)):
1,t<_?main( t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2 ?_<13 ?
main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main( _, t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/"):t<-50?_==*a ?putchar(31[a]):main(-65,_,a+1):main((*a == '/') + t,
_, a + 1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}
[3年ぶりくらい久々に追加更新] 565文字のテトリスのプログラム。いかに短く作るかって趣旨だが、結果はかなり解読不能。JavaScriptなので、ブラウザで実行する。今はもう少し短いバージョンもある。出典は こちら。
<body onKeyDown=K=event.keyCode><script>X=[Z=[B=A=12]];h=e=K=t=P=0;function Y()
{C=[d=K-38];c=0;for(i=4;i--*K;K-13?c+=!Z[h+p+d]:c-=!Z[h+(C[i]=p*A-Math.round(p/
A)*145)])p=B[i];!t|c+4?c-4?0:h+=d:B=C;for(f=K=i=0;i<4;f+=Z[A+p])X[p=h+B[i++]]=1
if(e=!e){if(f|B){for(l=228;i--;)Z[h+B[i]]=k=1;for(B=[[-7,-20,6,17,-9,3,6][t=++t
%7]-4,0,1,t-6?-A:-1];l--;h=5)if(l%A)l-=l%A*!Z[l];else for(P+=k++,j=l+=A;--j>A;)
Z[j]=Z[j-A]}h+=A}for(i=S="";i<240;X[i]=Z[i]|=++i%A<2|i>228)i%A?0:S+="<br>",S+=X
[i]?"■":"_";document.body.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y()</script>
さらに徹底して、どう書いても解読不能にしかならないプログラミング言語もある。「esoteric」な言語と呼ばれることもあり、結果的にそうなってしまったのもあるし、最初からパロディとして作られたのもある。機械語もこの範疇だろうけれども、幾つか有名どころで「Hello, world!」を書くとどうなるかを紹介する。
Intercal (1972年に作られた古典。"伽藍とバザール" (Linuxユーザ必読) のEric S. Raymondも関係している)
PLEASE DO ,1 <- #13 DO ,1 SUB #1 <- #238 DO ,1 SUB #2 <- #112 DO ,1 SUB #3 <- #112 DO ,1 SUB #4 <- #0 DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #238 DO ,1 SUB #7 <- #26 DO ,1 SUB #8 <- #248 DO ,1 SUB #9 <- #168 DO ,1 SUB #10 <- #24 DO ,1 SUB #11 <- #16 DO ,1 SUB #12 <- #158 DO ,1 SUB #13 <- #52 PLEASE READ OUT ,1 PLEASE GIVE UP.
Befunge (2次元プログラミング。後継の Funge もある)
v
>v"Hello world!"0<
,:
^_25*,@
ZT (別の意味での2次元プログラミング)
48><<<<<ZT><ZT>< Hello | ><ZT<<ZT><ZT><ZT World!| >>>>65><6F><6F><6C><<<<< <<<2><ZT><ZT><ZT><ZT>>>8 ZT>>>>>>6C><20><72><64>> <>ZT>>>>><ZT><ZT><ZT<>>5 <<<<ZT<>>>>>6C><57><ZT>> <<ZT<>ZT<>>>>>ZT>>ZT<>>7 ZT>>21><ZT<>ZT<<ZT>>>>>| <>ZT><ZT<>42>>>>><ZT by| <<<<ZT<>21><<<< Philipp| <<<<<>ZT>>ZT Winterberg| -------EXIT--[ ZT ]----| -[www.winterbergs.de]-/
Brainfuck (名称はさておき、素晴らしい。チューリングマシンそのもの。派生言語多数)
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Whitespace (空白とタブによるプログラム。Slashdot でもネタになっていたので、今では最も有名かも)
長いので こちら へどうぞ。1行目はコメント、その後がプログラム本体。
他にも色々あるが、Malbolge や Java2K は圧縮結果やコンパイル結果みたいで気が利いてないし、Unlambda はコンビネータ (関数型プログラムの機械語みたいなもの) そのものだし、割愛。
その後、リンクを整備したついでに、Wikipediaのリンクも幾つか掲げておく: Intercal、 Befunge、 Brainfuck、 Whitespace、 Malbolge。
「Hello, world!」を色んなプログラミング言語で書くと、ってウェブページは、例えば ここ とか ここ とか ここ (おそらく最多) とか、そこら中にあるが、この 「プログラマの進化」 はけっこう笑えるかも (作者不詳。すでに1994年には原形あり)。「Flowers for Algernon」を思い出した、とか言うとネタばらしか。