Первый приз: Ричард Карлссон (Richard Carlsson)
Первый приз вручается Ричарду Карлссону за программу, которая "показывает уровень обфускации легко достижимый при помощи мощного, но редко используемого флажка процесса — 'error_handler'." Это невероятно простая программа, но она абсолютно непостижима, если вы не понимаете, как Эрланг поступает с неопределенными функциями.
Вот и код:
-module(obf).
-compile(export_all).
undefined_function(_, _, []) -> [];
undefined_function(M, r, As) ->
apply(M, r, tl(As)) ++ [hd(As)];
undefined_function(M, c, As) ->
apply(M, r, hd(As)) ++ apply(M, c, tl(As)).
run() ->
process_flag(error_handler, obf),
obf:c(",olleH", " gnalrE ", "sresU", "!").
Вот, что происходит, если мы запустим эту программу:
Eshell V5.5.1 (abort with ^G)
1> c(obf).
{ok,obf}
2> obf:run().
"Hello, Erlang Users!"
3>
Второй приз: Лоран Пикуло (Laurent Picouleau)
Второй приз вручается Лорану Пикуло за программу, которая по сложности являет собой полную противоположность другому победителю. Эта программа является решателем Судоку (Sudoku), который, благодаря использованию макросов, представляет собой практически нечитаемую программу. Но что действительно понравилось судьям — это творческий подход к наименованию модулей, который вводит компилятор и систему загрузки кода в заблуждение настолько, что модуль приходится вручную переименовывать, прежде чем запустить.
Пример кода из программы:
%% File: .erl
%% created: 14 Sep 2005
%% Author: Laurent Picouleau <laurent_at_nerim.net>
-module('').
-export(['"'/1,''/4,'|'/3,'_'/3]).
-include(".hrl").
p(N)?w ?i_i(N),N>1->?l_e(1,N*N).
'"'(S)?w ?i_i(S),1<S->
#b{s=S,c=[{{L,C},?MT,p(T)}||
T<-[S],L<-?l_e(0,S*S-1),C<-?l_e(0,S*S-1)]}.
''(B,_,_,'_')->{ok,B};
''(B,L,C,V)->
?k ?l_s({L,C},1,B#b.c)of
{?v,{{L,C},?MT,P}}->
?k ?l_m(V,P) of
?f ->{v_f,B};
?t ->
S=B#b.s,D=?l_r({L,C},1,B#b.c,{{L,C},V,[]}),
E=u(L,C,V,D,S),
{ok,#b{s=S,c=E}}
?z;
{?v,{_,V,_}}->{ok,B};
{?v,{_,_,_}}->{a_s,B}
?z.
u(L,C,V,E,S)->{H,I,D}='|'(L,C,S),u(H++I++D,V,E).
u([],_,L)->L;
u([C|T],V,L)->
{?v,{_,S,P}}=?l_s(C,1,L),
N=P--[V],
R=?l_r(C,1,L,{C,S,N}),
u(T,V,R).
'|'(L,C,S)->A=S*S-1,B=L-L ?r S,D=C-C ?r S,
{[{X,Y}||Y<-?l_e(0,A),(Y<D)or(Y>=(D+S)),X<-[L]],
[{X,Y}||X<-?l_e(0,A),(X<B)or(X>=(B+S)),Y<-[C]],
[{X,Y}||X<-?l_e(B,B+S-1),Y<-?l_e(D,D+S-1),{X,Y}=/={L,C}]}.
'_'(A,B,C)->D=A-A ?r C,E=B-B ?r C,F=C*C-1,
{[{X,Y}||Y<-?l_e(0,F),X<-[A]],
[{X,Y}||X<-?l_e(0,F),Y<-[B]],
[{X,Y}||X<-?l_e(D,D+C-1),Y<-?l_e(E,E+C-1)]}.
Вот что происходит при запуске программы:
Eshell V5.5.1 (abort with ^G)
1> make:all([load]).
Recompile: "
Recompile: ''
** Module name '''' does not match file name '"''"' **
Recompile: oss
Recompile: oss_test
up_to_date
2> oss_test:test_easy().
=ERROR REPORT==== 11-Dec-2006::22:26:25 ===
Error in process <0.31.0%gt; with exit value:
{undef,[{'','"',[3]},
{oss_test,create,2},
{oss_test,test_easy,0},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_loop,3}]}
** exited: {undef,[{'','"',[3]},
{oss_test,create,2},
{oss_test,test_easy,0},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_loop,3}]} **
3> os:cmd("mv \"''.beam\" \".beam\"").
[]
4> oss_test:test_easy().
oss_test:test_easy().
[[-1,1,-1,2,9,7,-1,-1,8],
[-1,2,-1,3,5,-1,1,9,-1],
[5,-1,3,-1,-1,-1,7,-1,6],
[-1,-1,6,1,-1,5,2,7,3],
[2,7,5,6,-1,3,8,1,9],
[8,3,1,7,-1,9,6,-1,-1],
[3,-1,9,-1,-1,-1,5,-1,2],
[-1,5,2,-1,6,8,-1,3,-1],
[4,-1,-1,5,3,2,-1,6,-1]]
[[6,1,4,2,9,7,3,5,8],
[7,2,8,3,5,6,1,9,4],
[5,9,3,8,1,4,7,2,6],
[9,4,6,1,8,5,2,7,3],
[2,7,5,6,4,3,8,1,9],
[8,3,1,7,2,9,6,4,5],
[3,6,9,4,7,1,5,8,2],
[1,5,2,9,6,8,4,3,7],
[4,8,7,5,3,2,9,6,1]]
ok
5>