LINUX.ORG.RU

Завершился IOCCC'24

 , ,

Завершился IOCCC'24

0

5

3 августа 2025 года завершился юбилейный (40 лет) конкурс по написанию запутанного С-кода IOCCC.

Цели IOCCC:

  • Написать максимально неясную/запутанную программу на C в рамках установленных правил.
  • Показать важность стиля программирования — в ироничной форме.
  • Подчеркнуть ценность понятного и ясного кода через негативные примеры.
  • Проверить компиляторы C с помощью необычного кода.
  • Продемонстрировать тонкости языка программирования C.
  • Обеспечить безопасную площадку для плохого кода на C. :-)
  • Повеселиться с языком C!

В этом году победителей было больше, чем обычно, из-за пятилетнего перерыва.

  • 2024/burton – Prize in pentagrammatology – wordle hard mode solver
  • 2024/cable1 – Prize in bot talk – LLM inference engine
  • 2024/cable2 – Prize in murky waters – salmon recipe
  • 2024/carlini – Prize in perfect timing – Intel 4004 emulation
  • 2024/codemeow – Prize in tray planting – bonsai generator
  • 2024/endoh1 – Prize in patient pointillism – slow ray tracer in CPP
  • 2024/endoh2 – Prize in solid body physics – rotating rigid body simulation
  • 2024/ferguson1 – Prize in diabolical logistics – A Pact With the Devil On the Oregon Trail
  • 2024/ferguson2 – Prize in yil-tas – Navajo Code Talker translator
  • 2024/howe – Nice accent eh-ward – mini vi
  • 2024/kramer – Prize in linguistic arithmetic – natural language numerical calculator
  • 2024/kurdyukov1 – Prize in phased periodicity – phase of the Moon
  • 2024/kurdyukov2 – Prize in art restoration – JPEG artifact removal
  • 2024/kurdyukov3 – Prize in virtual quietus – gaming VM and doom
  • 2024/kurdyukov4 – Prize in embiggening – encode without literals
  • 2024/macke – Prize in imitative rebooting – OpenRISC CPU and Linux
  • 2024/maffiodo – Prize in creative interpretation - Jav*script interpreter
  • 2024/mills – Prize in ℤ₃ – Infocom v3 story interpreter
  • 2024/stedolan – Best one liner – icon from MD5
  • 2024/straadt – Prize in sound coding – layered music generator
  • 2024/tmarrec – Prize in cyclonic coding – 3D tornado simulation
  • 2024/tompng – Prize in quasi bijection – vortex encryptor decryptor
  • 2024/weaver – Sur prize – rickroll

Из самого интересного на мой взгляд (по ссылкам видео):

  • 2024/cable2 – использование скрытых UTF-8 символов для сокрытия рецепта жареной форели в for-цикле
  • 2024/endoh1 – отрисовка классического теста рей-трейсинга «шар на шахматной доске»
  • 2024/maffiodo – интерпретатор JS (вроде как полный), умещённый в лимиты конкурса (4993 байтов/2503 токенов)
  • 2024/weaver – рикролл. С анимацией и звуком в консоли.
  • 2024/tmarrec – симулятор циклона в коробке. Трёхмерного. В консоли.

Автор новости в этом году участвовал (и, наконец, взял награду) с бонсай-генератором – переосмысленной версией cbonsai, только без внешних зависимостей и умещенная в 2787 байтов.

Из заметных событий – очередная победа Ильи Курдюкова из РФ. В этом году занял целых 4 приза. То же самое он проделал в 2020-м. Илья, если ты тут есть – привет тебе! Радостно осознавать, что несмотря на мировые события, Россию тут не обидели.

>>> Смотреть всех победителей

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 3)

Написать максимально неясную/запутанную программу

Но ведь для этого есть perl...

Kolins ★★★★★
()

Теперь понятно как появился С++. Конкурсы значит они тут устрают…

LightDiver ★★★★★
()
Ответ на: комментарий от luke

Конкурс с 1984го, перл из 87го.

PPP328 ★★★★★
() автор топика

Вот научат ГПТшечку на таких примерах. Это плохие ребята, не играй с ними.

Ecl
()

Посмотрел код. Жесть. Хочу так же :)

Вот эту странную обфускацию они же явно не вручную делают?


   #define a(x) } else p b(#x)){ 
   #define I ; } else p i==j++){ 
        #define c sprintf
        #define   o    ->
        #define   p   if(
        #define   t   f++
        #define   s   ( )
        #define   z   x o
        typedef struct d*     e; struct d{ union{ char*f; double n; } ; char*g,h
        ,l,m; e e,x,b,q,(     *r) s; int u; } ; e q,v; int y,(*w) s=strlen, (*A)
        s=strcmp; char*B,     *f,C, r=0, g[99], *(*D) s=strdup; e E(int m){ e x=
        calloc(1, sizeof(     struct d)); z b=v; z m=m; return v=x; } e F(e q) {
        while(q){ p !A(g,     q o g)){ return q; } q=q o b; } return 0; } e G(e*
   q){ e x=E(4); z g=D(g)     ; z b=*q; z x = E(0); return *q = x; } H s{ int x;
   while((x=*f==47 & f[1]     ==47) |isspace(*f)){ p x){ while(*f && *f!=10)t; }
   else t; } } J s { H s;     p*f)t; } K(char*K){ char*d=strchr(K,*f); return d?
                              d-K:-1; } L s{ return K(";)]") != -1; } M(char*x){
                              return!A(x,g); } b(char*x){ int u=w(x); p !strncmp
(x,f,u)&!isalnum(f[u])){ f+=u; return 1; } return 0; } N s{ int x=1; while(*f&&x
){ C=*t; x+=C-123?C-125?0:-1:1; } } double O(e x){ char*P; return z m&1?z n:z m&
2?strtod(z f,&P) :0; } e Q(e x){ e n=E(2); char*f="[object]",m=z m; p m&1){ c(g,
"%g",z n); f=g; } p m &2)f=z f; n o f=D(f); return n; } e R(int); S s{ return 95
==*f||isalnum(*f); } T s{ char*d=g; while(S s)*d++=*t; *d=0; } e U(int h){ int i
=0,j,n,P,V; double X,Y; char*d,b; e l,y, x=E(0),u; H s; p L s){ return x; } i=K(
"-+!~"); p i>-1){ t; } C=*f; p C==40){ t; x=U(0); J s; } else p C==91|C==123){ z
m=4; t; J s; } else p C==34|C==39){ d=g; t; z m=2; while(* f!=C){ char P=*t; p P
==92){ P=*t; P=P==110?10:P==120?strtol(f,&f,16):P; } *d++=P; } *d=0; t; z f=D(g)
; } else p isdigit(*f)){ z m=1; z n=strtod(f,&f); } else p S s){ int W=0; g:T s;
p M("function")){ J s; J s; J s; d=f-1; x=E(2); N s; z f=strndup(d,f-d); } else{
p M("var")){ t; W=1; goto g; } u=F(q); p W|!u)u=G (&q); x=u o x; z e=u; } } p i>
-1){ X=O(x); n=X; p j=0){ I X=-X I I X=!n I X=~n; } x=E (1); z n=X; } while(*f){
H s; p L s)break; i=K(",=!&|><-+*/%[(."); p i>-1){ b=*f; p i<h){ break; } int W=
0,k=0,h=0; t; p *f==61){ W=2; t; } else p *f==b){ h=1; t; } y=0; l=E(1); X=O(x);
double*Z=&l o n; char m=z m; n=X; p i<13){ y=U(i==12?0:i); Y=O(y); P=Y; } p j=0)
{ I l=y I p W){ V:p m==y o m){ p m&4)V=x!=y; else p m &1) goto O; else goto Q; }
else p (m|y o m)==2){ Q:V=A(Q(x) o f,Q(y) o f); } else{ O:V=X-Y; } i=k; p j=0) {
I V=V==0 I V=V>=0 I V=V<=0 I V=V>0 I V=V<0 I V=V!=0; } *Z=V; W=0; } else{ W=1; p
y o m&4){ l=y; } else{ l=E(y o m); l o r=y o r; p y o m&2)l o f=D(y o f); else l
o n=y o n; } } I k=5; goto V I*Z=h?n&&P : n &P I*Z=h?n||P:n|P I p h){ *Z=n>>P; }
else{ k=3-W; goto V; } I p h){ *Z=n<<P; } else{ k=4-W; goto V; } I*Z=X-Y I p (m|
y o m)&2){ e u=Q(x); y=Q(y); d=malloc(w(u o f)+w(y o f)+1); c(d,"%s%s",u o f,y o
f); l o m=2; l o f=d; } else{ *Z=X+Y; } I*Z=X*Y I*Z=X/Y I*Z=n%P I J s; p m&2){ c
(g,"%c",P<w (z f)?z f [P]:0); l o m=2; l o f=D (g); } else{ c(g,"%s",Q (y) o f);
goto q; } I c(g,"arguments"); e B=q,u=G(&q) o x; i=0; while(*f){ H s; y=U (1); p
!r){ c(g,"%d",i++); G(&u o q) o x=y; u o u++; } p *f==41)break; t; } t; i=r; p z
r){ p !r)l=z r(u o q); } else{ d=f; f=z f; l=R (0); f=d; } p !i){ r=i&~1; } q=B;
I H s; T s; p M("length")){ *Z=m&2?w(z f):z u; } else{ q:y=F(z q); p !y){ y=G(&z
q ); z u ++; } l=y o x; p !l o e)l o e = y; } } p W){ p !r){ l=z e o x=l; } else
continue; } x=l; } else t; } return x; } h(e x,e l,int b){ p x&&x !=l){ e u=z x;
z h=y; p u){ p u o h!=y)h(u,0,0); h(u o q,0,1); } h(z q,0,1); p b)h (z b,l,1); }
} _(e l){ y=1; h(v,l,1); y=0; h(q,0,1); e*B=&v,x=v; while(x){ e*b=&z b; p z h&!z
l){ *B=*b; p z m&2)free(z f); p z g)free(z g); free(x); } else{ z h=0; B=b; } x=
*b; } } e R(int h){ e x=E(0),y,l,d=q,u=v; while(*f){ H s; p *f==123){ t; p !r)x=
R(1); else N s; } else{ int u=0,d; p *f==125){ t; break; a(if)char*B; int P; u:d
=r; j:B=f; J s; l=U (0); J s; p !(int)l o n)r=4; P=r; y=R(0); p *f==59)t; p !P){
x=y; } H s; p u){ p !r&!P){ x=y; f=B; goto j; } else{ } a(else)r=(!P&!d)*4; P=r;
y=R(0); p !P){ x=y; } } r=u?d&~2:d|(r&3); a(while)u=1; goto u; a(return)y=U (0);
p !r){ x=y; r|=1; } a(break)p !r)r|=2; } else p *f){ y=U (0); p !r)x=y; J s; } }
p !h)break; } z l=1; z l=0; q=d; return x; } e ba(e x){ printf("%s",Q(z x) o f);
return E(0); } main s{ c(g,"print"); e x=G(&q); z m=2; z z r=ba; char u [1<<16];
B = f = u ; while ( ( C = getchar s ) > 0 ) * t = C ; * f = 0 ; f = B ; R (1); }
Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Вручную. И выравнивание и обфускация. В этом году был форум в дискорде для обсуждения, никто тулзы не делает, смысла нет, руками проще.

PPP328 ★★★★★
() автор топика

Илья, если ты тут есть – привет тебе!

Я здесь.

2024/kurdyukov2 - это мой проект JPEG Quant Smooth, под сокращением jpegqs уже есть в некоторых дистрибутивах линукса.
2024/kurdyukov3 - было написано в сентябре 2020-го, потом опыт портирования Doom использовал в своём проекте FPDoom (было тут в новостях). На днях добавил расширенную версию конкурсной работы с нативным JIT для x86/x86_64/aarch64 и даже для Эльбруса!

Все мои работы для конкурса были написаны в 2020-м (далее делал лишь небольшие дополнения), я ожидал конкурс в 2021. А пришлось ждать лишних 4 года чтобы их отправить.

Правильнее написать что это 28-й конкурс. Я считаю, что использование 2024 года, как решили судьи - неправильно, приём работ на конкурс начался на последних минутах 29 декабря 2024, всего пару дней 2024-го, которые ничего не решали.

Бонус: Заходим по ссылке на сайт IOCCC, в текстовом после справа от Start заменяем текст на doomp.bin, нажимаем Start - запускается Doom прямо в браузуре. Кстати, Web версия это тоже JIT на JavaScript, переводит опкоды в JS код на лету. Без JIT не удавалось получить приемлемую производительность в браузере.

jpegqs
()
Ответ на: комментарий от Zhbert

Обфускация делается примерно так (если речь про дефайны):

  • Пишешь обычный код
  • Ищешь повторяющиеся области (необязательно в виде блока, дефайны - просто строковая замена)
  • Заменяешь в коде
  • Смыть, повторить.

Но обычно в рамках конкурса это уже lazy move и делается только чтобы влезть в рамки по размеру и токенам. Обфускация делается через алгоритмы. Например в моей работе строки хранятся внутри double

PPP328 ★★★★★
() автор топика

Чего только в этой жизни не бывает! 😁😁😁

sparkie ★★★★★
()
  1. Открыл исходники.
  2. Заплакал кровавыми слезами.
  3. Закрыл исходники.

Пойду ка я и дальше свои YAMLы редактировать. Оно может и уныло, зато кукуху сохранишь и в дурку не уедешь.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Уехавшая кукуха - это весело, вы многое теряете

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от jpegqs

2024/kurdyukov4 - с этой работой завёл баг на GCC. Очень медленно работает, пожирает десятки гигабайт памяти.
2024/kurdyukov1 - обсуждение этой работы репостнул Илон Маск. Когда оказалось, что Грок смог понять что она делает. Хотя я не вижу в этом ничего необычного, она простая и выглядит на то, что и делает.

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 1)
Ответ на: комментарий от jpegqs

Справедливости ради, у вас очень палевное число (я про Луну), я б разделил на пару выражений. Из-за этого в дискорде даже дискуссия была, что ваш код похож на чей-то из прошлой победы.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

А я и не осуждаю, совсем напротив: это я так степенью изврата восхищаюсь, а в данном случае, степень изврата и есть искусство

pihter ★★★★★
()

Написать максимально неясную/запутанную программу на C в рамках установленных правил.

В большинстве случаев достаточно просто написать макросню со всякими __VA_ARGS__ с обёртками и прочими непотребствами, код сразу в головоломку превратится.

Dr64h ★★★★
()
Ответ на: комментарий от PPP328

Предлагаю так на форуме общаться. Например, кодировать что-нибудь обидное про модераторов, а потом в lor возмущаться после удаления:

- "Да за щто?! Где тут флуд?! ДВИМ!!!"
apt_install_lrzsz ★★★★
()
Ответ на: комментарий от PPP328

в моей работе строки хранятся внутри double

Ничоси! Если не ошибаюсь, был еще конкурс, где нужно было спрятать уязвимость и бэкдор в максимально безупречно и безобидно выглядящем коде

I-Love-Microsoft ★★★★★
()

Я спец по C++. Он же Rust, но новость тоже интересна.

nicholas_ru
()
Последнее исправление: nicholas_ru (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

был еще конкурс, где нужно было спрятать уязвимость и бэкдор в максимально безупречно и безобидно выглядящем коде

Это «Underhanded C Contest».

question4 ★★★★★
()
Ответ на: комментарий от Kolins

Но ведь для этого есть perl…

Автор Перла — постоянный участник и неоднократный призёр.

question4 ★★★★★
()
Ответ на: комментарий от PPP328

Смыть, повторить.

Так cpp обратно деобфусцирует!

Shadow ★★★★★
()
Ответ на: комментарий от firkax

Просто я не люблю тех кто использует C89.

jpegqs
()
Ответ на: комментарий от jpegqs

Думал пожаловаться что оно теперь в с99 неверно работает, но оказалось всё предусмотрено.

firkax ★★★★★
()
Ответ на: комментарий от jpegqs
yr@e525:~/ME/tests$ cc double.c
double.c: In function ‘main’:
double.c:4:33: error: passing argument 1 of ‘puts’ from incompatible pointer type [-Wincompatible-pointer-types]
    4 |   ,1.0410277430195262e+34};puts(x);}
      |                                 ^
      |                                 |
      |                                 double *
In file included from double.c:1:
/usr/include/stdio.h:714:30: note: expected ‘const char *’ but argument is of type ‘double *’
  714 | extern int puts (const char *__s);
      |                  ~~~~~~~~~~~~^~~
yr@e525:~/ME/tests$ cc --version
cc (Debian 14.2.0-19) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

пришлось каст добавить:

#include <stdio.h>
int main(){double x[]={
  4.861994245760871e+111//**/6.04514788903827e+205,1
  ,1.0410277430195262e+34};puts((const char *)x);}

с ним работает

vyv ★★★
()

Надо тоже попробовать. Хотя бы просто поучаствовать. А так, поздравляю ТС и прочих наших ребят, ну и всех остальных кто победил и участвовал конечно. Проявления творчества это здорово.

LINUX-ORG-RU ★★★★★
()

Если это доставляет удовольствие участникам, я их искренне поздравляю.

Но вот мне, например, участвовать в таком было бы максимально неинтересно, мне интереснее, наоборот, как писать код, который максимально прозрачен, будет хорошо читаться даже через 5 лет (а лучше всего если ещё не превратится за это время в тыкву из-за прибитости к версиям библиотек или ещё чему, но это, конечно, уже слегка другая тема).

Победителей поздравляю!

hobbit ★★★★★
()

Я правильно понимаю, что максимально неясная/запутанная программа - она же бессмысленная ?

kto_tama ★★★★★
()
Ответ на: комментарий от kto_tama

Нет, (почти) все работы делают что-то полезное или красивое. «Почти» - потому что есть ещё редкие, которые просто ломают компилятор или ожидания читающего (см. пример с рецептом рыбы в ОП-посте)

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)

ахринеть. просто ахринеть :)

дайте мне такую же шизу! две!!!

Rastafarra ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.