[ANN] Obfuscated Erlang Competition
От: Mamut Швеция http://dmitriid.com
Дата: 16.10.06 12:40
Оценка: 19 (3) :))) :)))
2006 Obfuscated Erlang Competition

До третьего ноября сего года желающие поучаствовать в конкурсе запутанного кода на Эрланге должны прислать свои работы на euc06@erlang-consulting.com (не позже 12 часов дня 3го ноября!) победители будут объявлены на Конференции по Эрлангу 9го ноября. Победители прошлого года (напомню, что Lazy Cjow Rhrr разобрался
Автор: Lazy Cjow Rhrr
Дата: 06.12.05
в программе Урбана Боквиста (или Боки?))

Главный приз — рюкзак.
Второй приз — письменный набор из палисандра.

Правила:
— программы должны быть полностью работоспособными и что-то выполнять
— программы должны содержать инструкции по компиляции и описание того, что они делают
— программы должны состоять из не более, чем 500 строк кода, включая комментарии
— программы должны компилироваться в OTP R11B
— если компилятор не сможет откомпилировать программу, программа будет дисквалифицирована, но:
---- если программа будет компилироваться часами, выплевывая непонятные ворнинги, ей будут присуждены бонусные очки
---- программа получит бонусные очки, если ни компилятор, ни diyalizer при не выкинут ни одного предупреждения
— программы должны быть независимы от платформы (то есть компилироваться и работать и на Windows тоже!)
— Программы могут посылать все, кроме судей
---- Приветствуются участие и взятки со стороны работники, родственников и друзей судей
— На программы не могут быть наложены права. После участия они будут выложены в свободный доступ.

Судьи конкурса в этом году:
Mats Cronqvist, Ericsson, Hungary
Jan Nystrom, Erlang Training and Consulting, UK
Kostis Sagonas, Uppsala University, Sweden
Erik Stenman, Kreditor, Sweden
... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re: Результаты
От: Mamut Швеция http://dmitriid.com
Дата: 27.02.07 12:08
Оценка:
M>2006 Obfuscated Erlang Competition

Что-то я совсем про результаты забыл

Первый приз: Ричард Карлссон (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>



dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.