Subscribed unsubscribe Subscribe Subscribe

Yet Another Obfuscated MATLAB Code

なんと、以下のコードはちゃんとした、実行できるMATLABコードになっています。

growth.m

                                        figure(1)
clf,hold on,grid on,view(58,38),feval(@(mm,x)mm(@(O)mm(@(Y,U,V,W,v,nN,NN,Mm,mM,md,Nn)...
mm(@(G)mm(Y(G),x,0,0,v(mM(x))),mm(@(L)(@(M)(@(n,p,q,r)mm(mm(@(l,n)l{n},{@()1,@(){mm(Y...
(L),                                                                             [25*...
v(1.                                                                             /r*(...
n-1)                                              )-   25/                       2*(r...
-1);                                           md((n-1),r)*5                     ^2-(...
r-1*                                          1)*5^  2/  2;0]                    ,[0;...
0;1]                           ,[   1;0        ;0    ],   6)                     ,M(n...
-1,0                        ,0,v(mM(x)))}            },                          ~(n>...
.0)+                       2*~(n  <=  0)))           ))                          ,(@(...
d)((        @(   u,n        ,t    ,N   )(            ((    mm   (mm              ((@(...
l,n)     l{n}),{(@()mm            (@                    ()(mm(@()Nn(u            (1),...
u(2)    ,u(3)  ,(  '*g'           ),                   U,5))  ))  ),(@           ()mm...
((@(     w,    b,   p,            m,    mN   ){(        mm    (@   (A            )Nn(...
A(1,           :)                    ,A(2,:),A(3,:            ),                 '-',...
W,N^           2*                   0.3,V  ,(  mN(N           /6                 ))),...
[u,(           u+    n*   w)]        ))    ,(   mm            (@   (f   ,T,      S){(...
d(u+              n*w,S,T,N-1))            ,(                    d(u+n*w,f(S,n   ,p),...
f(T,             n,p),  N   -1))           ,(                   d(u+n  *w  ,f(S  ,n,p...
*2),              (f    (T    ,n           ,(   p)*   2)),       N-1   ))    },  (@(r...
,n,p                    )r                    *(Mm(p))-nN(r            ,n        )*NN...
(p)+                    (1                   -Mm(p  ))  *n*(           n'        *r))...
,NN(                    m)   *n   -t*         Mm    (m   ),            n*        Mm(m...
)+NN                       (m)*t))}),9.8            /(                           7.14...
-N),                      0.1,2  +1  /10.6          ,-                           .102...
+1,(                       @(    r)   [1            *1                           *.32...
,.22                             ,1                                              *.08...
]*r+                             [0                                              ,1,(...
.5)]                             *(                                              1-r)...
)))}                                                                             ,1+(...
N>0))))))))))),@(f)mm(@(g)@(m,n,o,p)mm(f(g(g)),m,n,o,p),@(g)@(m,n,o,p)mm(f(g(g)),m,n,...
o,p)),O(0),O(1),O(2),O(3),O(4),O(5),O(6),O(7),O(8),O(9)),(@(I)mm(@(l,m)mm(l{1+(I>2)},...
char(m((m(58+I)-46):(m(59+I)-47))+18)),{@(J)J,@str2func},['[O`YS`aWhS1]Z]`ZW\SEWRbV',...
'TZ]]`Q`]aaaW\Q]aa_`b[]R^Z]b!TSdOZ/9>GLQTW[^c']))),@feval,9); %% (c) woodrush (2014) ...


そして、これを実行すると、なんとこの図が出てくるのです!
f:id:woodrush:20140825001754p:plain

手元にMATLABまたはOctave環境がある方は、是非自分で試してみてください。(Octaveだとかなり時間がかかりました。)コードをコピーして、直接コンソールに貼り付けるだけで実行できるようになっています。

このコードは、Yコンビネータの勉強をしていて書いていたものを、面白そうだったので難読化したものです。このコードのポイントは、function構文、そしてグローバル変数すら全く使わず、たった一つの無名関数を実行しているだけで動いているという事です。MATLABの無名関数では1行のコードしか記述・実行できないのですが、その制限の中で

の機能が実現されています。これらの中で特に再帰が一番難しく、そのテクニック中で用いられているのがYコンビネータの概念です。まだYコンビネータの原理については詳しくわかっていないのですが、1行の無名関数だけで再帰を実装できるこのテクニックには、かなり謎に満ちた魅力があります。

追記:これらのうち、再帰以外のテクニックについて詳しく説明したエントリを書きました。
MATLABの無名関数内で条件分岐・複数行実行を行う方法 - woodrush’s diary

Obfuscated Code

このような「一見して全く読めないのにちゃんと実行できて、更に意外な結果が出てくるコード」は一つのジャンルとなっています。特にC言語では IOCCC (The International Obfuscated C Code Contest) という世界大会があるほどで、入賞作品はあっと驚くようなコードがかなり沢山あり、全く違った世界が見えてきます。中でも、Yusuke Endoh氏の作品はかなり息を呑むようなものばかりで、特にASCII Fluidのコードは僕もかなりびっくりさせられました。これはかなりおすすめです。

[C][IOCCC] The 21st IOCCC: Most complex ASCII fluid のエントリ
http://d.hatena.ne.jp/ku-ma-me/20121018/p3

追記:
MATLAB File Exchangeにアップロードしてみました。
Growth - Yet another Obfuscated MATLAB code - File Exchange - MATLAB Central