Итоги 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 года.


    Изобретатель бинарного лямбда-исчисления Джон Тромп представил на конкурс IOCCC программу 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));} 

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

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 27

      +3
      ЕщЕ!
      +1
      А я только собрался спать…
        0
        Я тоже собираюсь. Но, похоже, процесс затянется = )
        0
        Обожаю такое сумасшествие :)
          0
          Хотел летом написать код для генерации кадров ASCII анимации из звездных войн в виде компилящегося кода, ну по аналогии с Self-printing Game of Life in C#, только вместо процесса «Жизни», был бы «Фильм» о звездных войнах в виде ascii графики, т.е. каждая компиляция — новый кадр, содержащий ASCII графику, кучу base64 строк с данными и код. Также хотел, чтобы в этом коде было реализовано сжатие по RLE или даже кодированию изменений от кадра к кадру. Этот код конечно бы занимал намного больше, чем 4096 байта, но все равно было забавно.

          Но к счастью мне было лень и я отказался от этой безумнейшей затеи :)
            0
            Прям фильмы в ASCII? Star Wars в таком формате я бы с удовольствием посмотрел. Хотя правильнее, конечно, Матрицу.
              0
              так смотрите :-) подключайтесь по телнету к towel.blinkenlights.nl и там будут звездные войны
                0
                Спасибо, это тоже прикольно. Хотя я всё же говорил об автоматической аппроксимации кадров из фильма посредством ASCII-графики.
                  +17
                  Ну в VLC есть такая функция:
                    0
                    В последних версиях VLC она уже в цвете работает ;-)
                      0
                      В цвете оно как-то хуже воспринимается, нежели чёрно-белое.

                      А в целом забавная штука — радует что разработчики находят время и на приятные (пусть и не сильно полезные) мелочи, чтобы порадовать пользователей :)
                        +2
                        Дело не в VLC. Это libaa (как вариант libcaca), известная с незапамятных времен. Прогнать видео через нее можно и в mplyaer, и в xine, и в чем еще вам надо.
                        +1
                        можно на досуге поиграть с друзьями в игру «угадай фильм».
                          +1
                          Мне кажется, по моему скрину все угадали.
                            0
                            Он все равно возьмет красную.
                              0
                              О нееетттт… по картинке подумал о Морфиусе, дающему Нео таблеточку :) И только затем глянул на имя файла.
                      0
                      А можно перемотать на середину, а то я с первого раза не посмотрел?
                        0
                        Где-то на ютубе была копия, которую можно и перемотать. Другое дело, трафика на такой просмотр уйдет намного больше…
                  –2
                  Я когда-то на приставке Dandy с кассетой Basic где была память 255 байт для программы написал для себя игру типа Solo на клавиатуре :)
                  И оно разбрасывало буквы, которые надо было нажимать, на весь монитор в рандоме.
                  Программа считала количество и итоговый процент ошибок.
                  Жаль нельзя было сохраняться…
                    +1
                    «код валидной программы на Brainfuck, причём запустить её можно без стороннего интерпретатора» — это сумасшествие какое-то!!!

                      0
                      Бесконечно длинной программе не нужен процессор для работы. Она работает сама.
                      0
                      В первом примере карта мира сделана на 80 символах в строке. Наследие перфокарт! ФОРТРАН навсегда!
                        –1
                        Не хочу вас расстраивать, но все консольные программы под windows, как правило, работают с 80 символами в строке, так что карта мира не является ничем особенным.
                          +1
                          Расстроили, я надеялся хотя бы на MS-DOS…
                            +2
                            Как-то странно звучат «все» и «как правило» в одном предложении. Так бы и писал уж «по-умолчанию».
                          0
                          Когда работает профи, на результат его работы очень приятно смотреть даже неспециалисту. Верстка кода — это же шедевр. Так просто.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое