Итоги 20-го международного конкурса непонятного кода на C

    Организаторы IOCCC (Международный конкурс на самый непонятный код C) нажали кнопку «турбо». Если результаты прошлого конкурса опубликовали спустя четыре года после проведения, теперь прошло всего два месяца — и вот они.

    Участвовать в конкурсе могут готовые программы размером меньше 4096 байт, при этом количество значимых символов, без учёта пробелов, знаков табуляции и знаков ; ( ), не должно превышать 2048. Задачей конкурса является «проверять компиляторы на стресс, демонстрировать тонкости языка программирования Си и важность соблюдения стиля программирования (делая обратное)».

    Титул победителя (Best of Show) и звание «самой уменьшаемой» (most shrinkable) завоевал четырёхуровневый даунсэмплер akari (Makefile, akari.c). Программа умеет уменьшать разную графику, в том числе ASCII-графику. Поскольку её исходный код тоже отформатирован в виде ASCII-графики, то она может уменьшить и свой исходный код. В результате получается другая валидная программа на C, которая может обрабатывать текст. И это тоже ещё не конец. Обработав код вторично с помощью новой программы, получается третья функциональная программа (здесь компилятор gcc уже начинает выдавать некоторые предупреждения, но всё равно сделает исполняемый файл).

    Другие победители:
    • blakely (Makefile, blakely.c): программа играет в «Жизнь» Конвея, вычисляет число Пи до 16 знаков после запятой, получив на входе свой исходный код, а также проверяет первичность клеточного автомата
    • borsanyi (Makefile, borsanyi.c): быстрый генератор гистограмм необычным способом
    • dlowe (Makefile, dlowe.c): самообучающаяся нейросеть
    • eastman (Makefile, eastman.c): попытка повторить классический Amiga Boing Ball с помощью ASCII-графики
    • fredriksson (Makefile, fredriksson.c): с помощью декомпрессора Барроуза-Уилера создаёт исходный код программы agrep и запускает её (награда за «самую полезную» программу на IOCCC)
    • goren (Makefile, goren.c): программа-ребус в память о Рене Магритте
    • hamaji (Makefile, hamaji.c): программа для решения японских кроссвордов
    • hou (Makefile, hou.c): самодокументирующий научный калькулятор
    • konno (Makefile, konno.c): распознаёт нажатия клавиш на QWERTY-клавиатуре
    • richards (Makefile, richards.c): JIT-компилятор и калькулятор dc
    • toledo (Makefile, toledo.c): игра в «танки» для двух человек (требует X11)
    • vik (Makefile, vik.c): конвертер аудиофайлов .MOD в 44,1 кГц стерео и плеер
    • zucker (Makefile, zucker.c): генератор картинок с изображением символов
    Поддержать автора
    Поделиться публикацией

    Похожие публикации

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

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

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

    • НЛО прилетело и опубликовало эту надпись здесь
        +18
        Фото победителя:

          +7
          Давно текст гифом не жали.
            +1
            В PNG вышло больше, представьте себе.
            +10
            >Давно текст гифом не жали.

            Угу, при том, что Хабр прекрасно умеет подсвечивать код самостоятельно. И вполне неплохо прожевал победителя:
                                                   /*
                                                  +
                                                 +
                                                +
                                                +
                                                [         >i>n[t
                                                 */   #include<stdio.h>
                                    /*2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1;
                                 */int/**/main(int/**/n,char**m){FILE*p,*q;int        A,k,a,r,i/*
                               #uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d="P%"   "d\n%d\40%d"/**/
                             "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**"
                      "/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*="
                   "yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?"
                  "*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni("/**
                 */"i+k[>+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2"
                 ":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[
                 i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1]  !='\0'))?fopen(m[1],y+298):stdin;
                  /*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m]    =<2<5<64;}-]-(m+;yry[rm*])/[*
                   */q=(n<3||!(m[2][0]-'-'||m[2][1]))?stdout /*]{     }[*/:fopen(m[2],d+14);if(!p||/*
                   "]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++"  <)<      ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/)
                return+printf("Can "  "not\x20open\40%s\40"    ""       "for\40%sing\n",m[!p?1:2],!p?/*
              o=82]5<<+(+3+1+&.(+  m  +-+1.)<)<|<|.6>4>-+(>    m-        &-1.9-2-)-|-|.28>-w-?-m.:>([28+
             */"read":"writ");for  (   a=k=u= 0;y[u];  u=2    +u){y[k++   ]=y[u];}if((a=fread(b,1,1024/*
            ,mY/R*Y"R*/,p/*U*/)/*          R*/ )>/*U{  */   2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\}
            */sscanf(b,d,&k,& A,&           i,  &r)&&        !   (k-6&&k -5)&&r==255){u=A;if(n>3){/*
            ]&<1<6<?<m.-+1>3> +:+ .1>3+++     .   -m-)      -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8*/
            u++;i++;}fprintf   (q,    d,k,           u      >>1,i>>1,r);u  = k-5?8:4;k=3;}else
              /*]>*/{(u)=/*{   p> >u  >t>-]s                >++(.yryr*/+(    n+14>17)?8/4:8*5/
                 4;}for(r=i=0  ;  ;){u*=6;u+=                (n>3?1:0);if    (y[u]&01)fputc(/*
                  <g-e<t.c>h.a r  -(-).)8+<1.                 >;+i.(<)<     <)+{+i.f>([180*/1*
                  (r),q);if(y[u   ]&16)k=A;if                               (y[u]&2)k--;if(i/*
                  ("^w^NAMORI; {   I*/==a/*"                               )*/){/**/i=a=(u)*11
                   &255;if(1&&0>=     (a=                                 fread(b,1,1024,p))&&
                    ")]i>(w)-;} {                                         /i-f-(-m--M1-0.)<{"
                     [ 8]==59/* */                                       )break;i=0;}r=b[i++]
                        ;u+=(/**>>                                     *..</<<<)<[[;]**/+8&*
                        (y+u))?(10-              r?4:2):(y[u]         &4)?(k?2:4):2;u=y[u/*
                         49;7i\(w)/;}             y}ru\=*ri[        ,mc]o;n}trientuu ren (
                         */]-(int)'`';}             fclose(          p);k= +fclose( q);
                          /*] <*.na/m*o{ri{                       d;^w^;}  }^_^}}
                           "   */   return  k-                -1+   /*\'   '-`*/
                                 (   -/*}/   */0x01        );       {;{    }}
                                        ;           /*^w^*/        ;}
            
              0

              спасибо человеку, который скинул картинку, потому что с телефона это видится вот так

            +7
            Кстати, без подсветки сложно разобраться.
              +82
              А, ну теперь-то всё очевидно
              +1
              Конкурс на самый запутанный код прошел, теперь начался конкурс на самую лучшую подсветку синтаксиса. Уже есть 3 претендента, но хабр явно лидирует. Спешите отправлять нам заявки!
            –7
            Какой-то бессмысленный конкурс, имхо.
            Я понимаю, если бы оценивалось именно хитровыкрученное использование особенностей языка (коих в сях предостаточно).
            А просто по-дурацки назвать переменные и странно отформатировать код — это неинтересно. Это скорее конкурс ASCII-арта.
            Наоборот, было бы круто видеть чисто и правильно отформатированные сорцы — но с нифига непонятным действом!
              +2
              Тогда это был бы конкурс совсем с другой задачей.
                +3
                Программа умеет уменьшать разную графику, в том числе ASCII-графику. Поскольку её исходный код тоже отформатирован в виде ASCII-графики, то она может уменьшить и свой исходный код. В результате получается другая валидная программа на C, которая может обрабатывать текст. И это тоже ещё не конец. Обработав код вторично с помощью новой программы, получается третья функциональная программа (здесь компилятор gcc уже начинает выдавать некоторые предупреждения, но всё равно сделает исполняемый файл).

                Тоесть это для вас не особенность и не показатель уровня создателя? Если в этом всём вы различаете только
                по-дурацки назвать переменные и странно отформатировать код
                то интересно ли вам вообще на хабре находится?)
                  0
                  Первый абзац — это что именно та программа делает.
                  Сложность выполняемой задачи (многоступенчатая генерация кода или там игра в шахматы) это круто и наверняка это дополнительное средство произвести впечатление на жюри, только к декларируемой цели конкурса (непонятный код) прямого отношения не имеет.
                  А я писал именно об основной цели. Тут она, безусловно, достигнута… но имхо малоинтересными и неизящными способами.
                    +1
                    Так примите участие, покажите всем — как надо правильно.
                    Делов-то.
                  +1
                  Исходя из…

                  Участвовать в конкурсе могут готовые программы размером меньше 4096 байт, при этом количество значимых символов, без учёта пробелов, знаков табуляции и знаков; ( ), не должно превышать 2048.


                  … и того, что сделали люди — вы наверное шутите. Программа победителя 3273 символа. Как по мне, тут необходимо обладать очень хорошими знаниями в Си.
                    –2
                    Читайте мой ответ выше. Я нигде не ставил под сомнение квалификацию тех конкретных победителей. Я говорил, именно о самом конкурсе — о декларируемых целях/условиях и критериях судейства де-факто.
                  0
                  Программа-победитель напомнила мне также интересный квайн, выполненный в виде игры «жизнь».

                  Вот код для C#:
                  using System;class G  /* GAME OF LIFE by Igor Ostrovsky */  {static string[]S={
                  "############################################################################",
                  "#                                                               * *        #",
                  "#  ***                                                         *           #",
                  "#                                       *                      *           #",
                  "#                                     * *                      *  *        #",
                  "#                           **      **            **           ***         #",
                  "#                          *   *    **            **                       #",
                  "#               **        *     *   **                                     #",
                  "#               **        *   * **    * *                                  #",
                  "#                         *     *       *                                  #",
                  "#                          *   *                                           #",
                  "#                           **                                             #",
                  "#   **     **                                                              #",
                  "#    **   **                                        *  *                   #",
                  "# *  * * * *  *                                         *                  #",
                  "# *** ** ** ***                                     *   *                  #",
                  "#  * * * * * *                                       ****                  #",
                  "#   ***   ***                                                              #",
                  "#                                                                          #",
                  "#   ***   ***                                                              #",
                  "#  * * * * * *            *                                                #",
                  "# *** ** ** ***           *           *  *                             *** #",
                  "# *  * * * *  *                           *                           *  * #",
                  "#    **   **             ***          *   *                **            * #",
                  "#   **     **                          ****                              * #",
                  "#                                                                     * *  #",
                  "############################################################################",
                  };static void Main(){string T="\",r=\"using System;class G  /* GAME OF LIFE b"+
                  "y Igor Ostrovsky \"+\"*/  {static string[]S={\\n\";int p=31,i,j,b,d;for(i=0;"+
                  "i<27;i++){r+='\"'; for(j=0;j<76;j++){if(S[i][j]!='#'){b=0;for(d=0;d<9;d++)if"+
                  "(S[i-1+d/3][j-1+d%3]=='*')b++;r+=b==3 ||(S[i][j]=='*'&&b==4)?'*':' ';} else "+
                  "r+='#';}r+=\"\\\",\\n\";}r+=\"};static\"+\" void Main(){string T=\\\"\";fore"+
                  "ach(var c in T){if(c=='\\\\'||c=='\"'){r+='\\\\';p++;} r+=c; if(++p>=77){r+="+
                  "\"\\\"+\\n\\\"\";p=1;}} foreach(var c in T){r+=c;if(++p%79==0)r+='\\n';}Cons"+
                  "ole.Write(r);}}",r="using System;class G  /* GAME OF LIFE by Igor Ostrovsky "+
                  "*/  {static string[]S={\n";int p=31,i,j,b,d;for(i=0;i<27;i++){r+='"'; for(j=0;
                  j<76;j++){if(S[i][j]!='#'){b=0;for(d=0;d<9;d++)if(S[i-1+d/3][j-1+d%3]=='*')b++;
                  r+=b==3 ||(S[i][j]=='*'&&b==4)?'*':' ';} else r+='#';}r+="\",\n";}r+="};static"
                  +" void Main(){string T=\"";foreach(var c in T){if(c=='\\'||c=='"'){r+='\\';p++
                  ;} r+=c; if(++p>=77){r+="\"+\n\"";p=1;}} foreach(var c in T){r+=c;if(++p%79==0)
                  r+='\n';}Console.Write(r);}}
                  
                    +2
                    Makefile порадовал:
                    ##################
                    # 133t hacker rulz
                    ##################
                    #
                    love:
                    @echo 'not war?'

                    haste:
                    $(MAKE) waste

                    waste:
                    @echo 'waste'

                    easter_egg:
                    @echo you expected to mis-understand this $${RANDOM} magic
                    @echo chongo '' "/\\oo/\\"
                    @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo.
                    @${TRUE}
                      +4
                      $ make love
                      Not war.
                      Стандартное поведение bsd-make
                        0
                        $ make love
                        make: don't know how to make love. Stop
                        
                        make: stopped in /home/dbanet

                        :(

                        $ freebsd-version
                        10.2-RELEASE
                      0
                      А мне из предыдущих нравится вот это:
                      main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
                      


                      unix определена как 1
                        0
                        По красоте кода мне больше вот этот понравился:

                        #include <stdlib.h>
                        #include <string.h>
                        #include <dirent.h>
                        #include <stdio.h>
                        #include <math.h>
                        #include <time.h>
                        #define _ float
                        
                                          _ CRUSH(_*LEG,int ARM,_*FINGER) {
                                 _ GORE; for(GORE=0,--ARM; ARM>=0; --ARM)GORE+=FINGER[ARM]*ARM
                             [LEG]; return GORE; } _*BITE(){ _*BRAIN=calloc(sizeof(_),1<<17);int TOE
                          =getc(stdin),EYE,SKULL=0; while((EYE=getc(stdin))!=EOF){ ++BRAIN[(TOE<<8) +
                         EYE]; ++SKULL; TOE=EYE; } if(SKULL)for(TOE=0; TOE<8<<13; ++ TOE)BRAIN [TOE]/=
                         SKULL; return BRAIN; } _ CHEW(_*GUT,_ BONE[][1<<16]){ int GRR; for(GRR=0; GRR<
                         6; ++GRR){ GUT[GRR+256*256]=powf(1+expf(-CRUSH(BONE[GRR],1<<16,GUT)),-1); BONE
                         [6][50+GRR]=GUT[256*256+GRR]*(1.-GUT[(8<<13)+GRR]); } BONE[6][81]=1/(1 +expf(-
                         CRUSH(GUT+(1<<16),6,BONE[6]))); return BONE[6][82]=BONE[6][81]*(1.-BONE[6][81]
                         ),BONE[6][81]; } _ GNAW(_ FLESH,_ LEG[][2<<15],_*EYE){ int UG,MMM; LEG[6][13]=
                         FLESH-CHEW(EYE,LEG); LEG[6][14]=LEG[6][ 82]*LEG[6][13]; for(UG=0; UG<6; ++UG){
                         LEG[6][34]=LEG[6][UG+(1<<7)-14]*LEG[6][7<<1]*LEG[6][UG]; for(MMM=0; MMM<4<<14;
                         ++MMM)LEG          [UG][MMM]+=LEG[6][34]*.3*EYE[MMM]; LEG[6][UG]+=.3*LEG[6][14
                          ]*EYE[               256*256+UG]; } return powf(LEG[6]          [13],2); } _
                          **EAT(               char*TOMB){ DIR*BONE = opendir(               TOMB); int
                          BRAIN=               0; struct dirent*TOOTH; _**BODY               =0; while
                         (BONE?(TOOTH=        readdir(BONE)):0){ if(  TOOTH->                d_name[0]
                         !=46){ char*MOAN=malloc(strlen(TOMB)+strlen(TOOTH->d_name       )+1); sprintf(
                         MOAN, "%s%s",TOMB,TOOTH ->d_name); if(freopen(MOAN, "r",stdin)){ BODY=realloc(
                         BODY,sizeof(_*)*(BRAIN+1)); BRAIN ++ [BODY]=BITE(); } } } return BODY=realloc(
                         BODY,(1+BRAIN)*sizeof(_*)),BODY[BRAIN]=0,BODY; } int main(int GRR,char **UGH){
                         _ BRAINS[7][1<<16],***CORPSES; int PUS,OOZE,UG; for(srand(time(0)),PUS=0; PUS<
                          7; ++PUS)for(OOZE=0; OOZE<4<<14; ++OOZE)BRAINS[PUS][OOZE]=rand()/(_)RAND_MAX
                           -.5;fread(BRAINS,sizeof(BRAINS),1,stdin); if(*UGH[1]==45){ GRR-=2; CORPSES
                            =malloc(                                                         sizeof(_
                            **)*GRR                                                           ); for(
                             PUS=0;                                                             PUS<
                            GRR; ++             PUS)CORPSES[PUS]=EAT(UGH[2+PUS]);             for(UG=
                             0; UG<atoi       (&(UGH[1][1])); ++UG){ BRAINS[6][97]=       0; for(PUS
                              =0; PUS<GRR; ++PUS)for(OOZE=0; CORPSES[PUS][OOZE]; ++OOZE)BRAINS [6][
                                97]+=GNAW(1.-(_) PUS/(GRR-1),BRAINS,CORPSES[PUS][OOZE]); fprintf(
                                 stderr,"%d: %f\n",UG,BRAINS[6][97]); } fwrite( BRAINS, sizeof(
                                  BRAINS),1,stdout); } else for(UG=1; UG<GRR; ++UG)if(freopen(
                                      UGH[UG],"r",stdin))fprintf(stderr,"%s %f\n",UGH[UG],
                                               CHEW(BITE(),BRAINS)); return 0; }
                        
                        
                          +1
                          Вообще, если пожертвовать ASCII-артом и повторной сборкой обработанной программы и отформатировать исходную программу-победителя, убрав при этом из неё комментарии и объединив некоторые строки, можно получить вполне читаемый и удобный для восприятия код, который каждый, кто хоть раз писал на чистом, без примесей, C, поймёт и сможет адаптировать под свои нужды, причём, с помощью этой программы можно так же обработать ASCII-арт исходной, не отформатированной, программы, получив тем самым валидный код новой программы.

                          #include<stdio.h>
                          int main(int n,char **m) {
                          	FILE *p, *q;
                          	int A, k, a, r, i;
                          	char *d = "P%d\n%d\40%d\n%d\n\00wb+",
                          	b[1024],
                          	y[]="yuriyurarararayuruyuri*daijiken**akkari~n**"
                          	"/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*="
                          	"yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?"
                          	"*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni(i+k[>+b+i>++b++>l[rb";
                          	int u;
                          	for (i = 0; i < 101; i++)
                          		y[i * 2] ^= "~hktrvg~dmG*eoa+%squ#l2"
                          		":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[i] ^ y[i * 2 + 1] ^ 4;
                          	p = (n > 1 && (m[1][0] - '-' || m[1][1] != '\0')) ? fopen(m[1], y + 298): stdin;
                          	q = (n < 3 || !(m[2][0] - '-' || m[2][1])) ? stdout : fopen(m[2], d + 14);
                          	if(!p || !q)
                          		return +printf("Can not\x20open\40%s\40for\40%sing\n", m[!p ? 1 : 2], !p ? "read" : "writ");
                          	for (a = k = u = 0; y[u]; u = 2 + u) {
                          		y[k++] = y[u];
                          	}
                          	if((a = fread(b, 1, 1024, p)) > 2 && b[0] == 'P' && 4 == sscanf(b, d, &k, &A, &i, &r) && !(k - 6 && k - 5) && r == 255)	{
                          		u = A;
                          		if (n > 3) {
                          			u++;
                          			i++;
                          		}
                          		fprintf(q, d, k, u >> 1, i >> 1, r);
                          		u = k - 5 ? 8 : 4;
                          		k = 3;
                          	} else {
                          		(u) = +(n + 14 > 17) ? 8 / 4 : 8 * 5 / 4;
                          	}
                          	for(r = i = 0;;) {
                          		u *= 6;
                          		u += (n > 3 ? 1 : 0);
                          		if (y[u]&01)
                          			fputc(1 * (r), q);
                          		if (y[u] & 16)
                          			k = A;
                          		if (y[u] & 2)
                          			k--;
                          		if (i == a) {
                          			i = a = (u) * 11 & 255;
                          			if ( 1 && 0 >= (a = fread(b, 1, 1024, p)) && ")]i>(w)-;} {                                         /i-f-(-m--M1-0.)<{"[8] == 59)
                          				break;
                          			i = 0;
                          		}
                          		r = b[i++];
                          		u += (+8 & * (y + u)) ? (10 - r ? 4 : 2) : (y[u] & 4) ? (k ? 2 : 4) : 2;
                          		u = y[u] - (int)'`';
                          	}
                          	fclose(p);
                          	k = +fclose(q);
                          	return  k - -1 + (-0x01);
                          	{
                          		;
                          		{}
                          	}
                          	;;
                          }
                          
                            0
                            ferd.ca/obfuscation.html правда не C

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

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