Итоги 21-го конкурса IOCCC

от автора

Объявлены победители 21-го международного конкурса обфусцированного кода на C. Как обычно, участники удивили способностью втиснуть совершенно невероятные вещи в программы до 4096 байт. Чтобы получить максимальное удовольствие, организаторы конкурса рекомендуют смотреть версию без спойлеров и пытаться понять по коду программы, что она делает.

Например, что делает такая программа?

             main(l         ,a,n,d)char**a;{     for(d=atoi(a[1])/10*80-    atoi(a[2])/5-596;n="@NKA\   CLCCGZAAQBEAADAFaISADJABBA^\   SNLGAQABDAXIMBAACTBATAHDBAN\   ZcEMMCCCCAAhEIJFAEAAABAfHJE\   TBdFLDAANEfDNBPHdBcBBBEA_AL\    H E L L O,    W O R L D! "      [l++-3];)for(;n-->64;)         putchar(!d+++33^              l&1);}

Ответ

Правильно, она печатает карту мира

И не просто печатает, но ещё показывает на карте точку с заданными координатами, которые можно указать при запуске (символ " или #).
Кстати, это «лучшая маленькая программа» на IOCCC 1992 года.


Для примера, изобретатель бинарного лямбда-исчисления Джон Тромп представил программу tromp.c с минимальной реализацией бинарного λ-исчисления.

       Int L[A],m,b,*D=A,         *c,*a=L,C,*U=L,u;s          (_){u--&&s(a=*a);}           char*B,I,O;S(){b=b            --?b:m|read(0,&I,1             )-1;return~I>>b&1;              }k(l,u){for(;l<=u;               U-L<A?*U++=46^l++[                "-,&,,/.--/,:-,'/"                ".-,-,,/.-,*,//..,"               ]:exit(5));}p(Int*m){              return!*U?*m=S()?U++,!S             ()?m[1]=p(++U),2:3:1,p(U)            :S()?U+=2:p(U[1]++),U-m;}x(           c){k(7*!b,9);*U++=b&&S();c&&x          (b);}d(Int*l){--l[1]||d(l[d(*l),         *l=B,B=l,2]);}main(e){for(k(10,33        ),a[4]-=m=e-2&7,a[23]=p(U),b=0;;e-2       ?e?e-3?s(D=a),C=a  [3],++1[a=a[2]],d(      D):c?D=c,c=*D,*D=    a,a=D:exit(L[C+1])     :C--<23?C=u+m&1?O      =O+O|C&1,9:write(m    ||(O=C+28),&O,1)+        1:(S(),x(0<b++?k(0,   6),U[-5]=96:0)):(          D=B?B:calloc(4,X))  ?B=*D,*D=c,c=D,D[            2]=a,a[++D[1]]++,D [3]=++C+u:exit(6)              )e=L[C++],u=L[C];} 

Однако, Джон Тромп даже не вошёл в тройку победителей.
Первое место. Идеальная обфускация
zeitak.c
Очень изощрённо обфусцированный код. Даже если анализировать деобфусцированную версию zeitak_deobfucate.c, то очень сложно понять, что она делает.

Второе место. Самое простое использование C
hamano.c
Смешная программка шифрует тексты по алгоритму пляшущих человечков, генерируя файлы PDF.
Ну, и код программы как бы намекает:

Код

                          #define  \                         D(s)"<<"#s">>"                       #define  q(s)p(#s)                      #define S " endobj "                     #define Y "endstream"S                     #include     <stdio.h>                     #define  o(s) b[s]=_;\                      p("%u    0  obj",s); #define E for         (c=d;c  < 123;c++)   #define DANCE         "trailer   "D\     (/Root 3 0            R /Size %d)            "\nstartxref %u %%%%EOF\n*/"       #define              p(s, ...)             _+=printf(s,  ##__VA_ARGS__)        #define C         "<</Type/Page         /Parent %d %d R /Resources <<\         /ProcSet[       /PDF/Text]/Font       <</U"D(/Subtype/Type1/BaseFont\           /Courier) "  /T<</Subtype/Type3   /FontBBox[0 0 10 10]/FontMatrix[\            %f 0 0 %f 0 0]/FirstChar %d/LastChar %d/Encoding<</Differences[%d"             typedef int N;typedef char*Nyan;typedef char A;N a,b[64],d=65,_,v               [32]={84,0,64,282,90,74,330,85,93,173,167,176,80,208,81,13,7,87                 ,160,346,32,128,170,218,16,26}; Nyan w[]={"+*-(,&-&","+*,&-&"                   ,"+*.&/&","+*/*/+","+*())'('"  ,"+**&)&","+*(&'&","+*'*'+",                     "","+,./","+,-,./","+--,+*"  ,"","+,(/","+,),(/","+-),+*"                      ,"10 0 d0 ","8 7 2 2 re "   ,"+*+.'`'@'mi +/+/(mi"};Nyan                        nyan(Nyan _,N y,A n){                         N g=v[~-y%32];Nyan                          s=w[g>>n&3|n*2];                          for(a=0;*_=*s++;                          a++,_++,*_++=32)                          {*_+=*_-32?10:0;                          if(a%2&&*_/16==3                          ){if(g>>8)*_=105-*_;                         _++;*_++=32;*_=~-a&&a-13                         ?108:109;}}return n?n-9?nyan                        (_,y,n-2):_:nyan(_+=~y&' '?sprintf                       (_,17[w]):0,y,9);}N main(N c){A e[256];                      p("/*%%PDF-1.3%%*/")-2;q(#include<stdio.h>\n);                     q(#define o *_++&& *_-41\n#define);p(" endstream ");q                    (main(){for(;*_++;      *_-40?:putchar(o?*_:o?10:41));\n)                   ;q(#define  endobj          return 0;}\n);q(typedef int ET;/)                  ;q(*);o(1)*b=~(p(D                 (/Length 2 0 R)"stream\n"))                 ;for(p("BT 12 818"                    " Td/%c 12 Tf 12 TL%%%c/"                "static char*_=\""                       " \\\n",7[v],*v/2);c=               getchar(),~c;c-10?                         p("/%c 12 Tf(\\%o)"              "Tj",v[~-c%' '<25[                         v]&&!~-(~-c/'@')?0             :7],c):(p("()'")))                         ;p("%%\";\nET ");*            b-=~_;p(Y"/*");E{a                         =nyan(e+sprintf(e,           16[w]),c,6)-e;o(c-                         59)p(D(/Length %d)          "stream\n%s"Y,a,e)                         ;}o(2)p(" %u"S,*b);         o(3)p(D(/Pages 4 0                         R)S);o(4)p(D(/Count        1/MediaBox[0 0 595                         842]/Kids[5 0 R])S)       ;o(5)p(C,4,0,6e-2,                         6e-2f,d,122,d);E p(      "/%c",~-c/6+~14?c:                         d);q(]>>/CharProcs<<)     ;E if(~-c/6+~14)p(                           "/%c %d 0 R",c,c+~58);    for(q(>>/Widths[),                             c=59;--c;p(" 10"));a=p   ("]>>>>>>/Contents 1                              0 R>>"S);for(p("xref\  0 %d ",--d);c<d;p("%010u\  %05d n  ",*(c+++b),NULL));   return!(p(DANCE,d,a));} 

Третье место. Стеганография

Приложение для стеганографии позволяет спрятать картинку PNG или текст внутрь другой картинки PNG, а потом извлечь его обратно. Секретные биты прячутся в нижних значениях RGB. В качестве бонуса автор предоставил изображение шоколадных конфет, которое обладает уникальными качествами: после кодирования и последующего декодирования в изображении появляется код валидной программы на Brainfuck, причём запустить её можно без стороннего интерпретатора.

ссылка на оригинал статьи http://habrahabr.ru/post/155335/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *