VM i uleselig C-kode: Sjekk de rareste vinnerne
The International Obfuscated C Code Contest feirer 40-årsjubileum. Se om du skjønner hva vinnerbidragene gjør!
Etter en pause på fire år var "International Obfuscated C Code Contest" (IOCCC) tilbake igjen i år – og nå er vinnerne kåret, skriver The Register.
- Hvis du lurer på hva i alle dager IOCCC er for noe, så er det altså en konkurranse der målet er å skrive den mest obskure og obfuskerte koden i programmeringsspråket C – innenfor gitte regler.
- Konkurransen har blitt avholdt 28 ganger, første gang i 1984.
- Resultatene av 40-års-jubileumskonkurransen har ikke blitt presentert før nå i august 2025, av ulike årsaker som gjorde at arrangøren ikke har kunnet ta imot bidrag før mellom mars og juni i år.
Men den som venter på noe godt, venter som kjent ikke forgjeves! IOCCC28, som er navnet på 2024-versjonen av IOCC, gjennomført i 2025, er klare. Og vi lover at koden er like forvirrende som navngivingen av konkurransen!
Her er tre av de rareste bidragene:
#1: Skjult lakseoppskrift
Kan du finne ut hva denne koden fra Adrian Cable gjør?
#include <stdio.h>
unsigned int *salmon = U" is very yummy";
#define grill ;while(putchar(*salmon++))
#undef grill
#define grill
#undef grill
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d * %d = %d\n", i, i, i*i);
}
}
Nå er ikke C min sterkeste side, men jeg trodde likevel jeg skulle klare å skjønne litt av hva som foregikk. Men hvem hadde trodd at C-koden over gir deg en oppskrift på hvordan du tilbereder laks! Dette er resultatet når du kjører koden:
Season salmon fillets with olive oil, lemon juice, garlic, salt, and pepper, then grill over medium heat for 4-6 minutes per side until flaky and cooked through.
Her er en video som forklarer hvordan det hele henger sammen:
Hvis du vil teste den selv, så finner du konkurransebidraget og oppskriften på hvordan du kjører koden på din egen maskin her.
Hint: Prøv å kjøre cat -v prog.c for å vise skjulte tegn i koden, så blir det litt klarere hva som skjer.
#2: Penere kode får du ikke!
Et annet imponerende bidrag, var bidraget fra Ilya Kurdyukov. Sjekk denne vakre koden:
#include <time.h>
#include <stdio.h>
a,b=44,x,
y,z;main() {!a
?a=2551443,x= -b
,y=2-b,z=((time (
0)-592531)%a<<9)/ a
:putchar(++x>=a?x =
-b,y+=4,10:x<0?x= x
*x+y*y<b*b?a=1-x, -
1:x+1,32:"#."[( x
<a*(~z&255)>> 8)
^z>>8]),y> b?0
:main();}
Kjører du den, får du dette:
#####.........
#######...............
##########..................
###########.....................
#############.......................
#############.........................
##############..........................
###############...........................
###############...........................
###############.............................
###############.............................
###############.............................
###############.............................
###############...........................
###############...........................
##############..........................
#############.........................
#############.......................
###########.....................
##########..................
#######...............
#####.........
En visning av månen i sin nåværende fase, tegnet opp i terminalvinduet ditt. Kjører du koden på et annet tidspunkt, vil månen altså se annerledes ut. Ganske stilig!
Her kan du se en video som forklarer hvordan det fungerer:
Koden laster du ned herfra.
#3: Rickrollet dommerne
Det siste bidraget vi tar med er fra Vince Weaver, som med sitt bidrag klarte å rickrolle dommerpanelet.
Koden ser slik ut:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
char *A="~\\^__a^\\Z~\\\\^_ZZffa~\\^__a^\\Z~\\\\^_\\Zaaaca~_~ac_aaacaZ~\\^_\\aca~ZZZ\\ccaZZ\\Zaa_ZZ\\Z_a^\\ZZa_ZZ\\Zcca~ZZ\\Zf^_^\\ZZ\\Z_a^\\ZZa_~__\\_a~^\\Z~\\\\^_\\Zffaca_\\\\^_\\_a^\\Z~\\\\^_\\Z~acca_~ac_aaacaZ~\\^_\\aca~ZZZ\\ccaZZ\\Zaa_ZZ\\Z_a^\\ZZa_ZZ\\ZccaZZ\\Zf^_^\\ZZ\\Z_a^\\ZZa_~ZZ\\ZccaZZ\\Zaa_ZZ\\Z_a^\\ZZa_ZZ\\",
*B="?<<<<<=;?E<<<<><><>D<<<<<=;?E<<<<<><<<<?=C;<<<<<<<>>B<<<><<?;;;;;==@;;;;==@;;;;><=;><>B;;;;==?;;;;;><;;>;;;;><=;><>@B<<<<?=<<@@<<<<<@<<><<><<<<<<><<@@<<<<<?;<<>@C;<<<<<<<>>B<<<><<?;;;;;==@;;;;==@;;;;><=;><>B;;;;==@;;;;><;;>;;;;><=;><>@<;;;;==@;;;;==@;;;;><=;><>B;;;",
*C="~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~D~D~B~B~D~D~B~B~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~D~D~B~B~D~D~B~B~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L~L~N~K~L",
*D=";?;???;>@?;???;>@?;???;???;>@D@?;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;???;?",
E[]="ZxZxZxZxZxZxZl`<^<ZxZ>_>^>ZxZ<Nb@NZxZ<NTRd<NZxZ<QNQb>ZxZ>Q[<b<ZxZ>QVQRZxZBh<RZxZBh<RWh<ZxZ<h<QWhBZtOJVg<hDZnh<OJg<hHZjh@Jg<hHZjh@Jg<hHZjh@Jg<hHZjh@Jg<hJZhh@Jg<Qh@Yh>Zhh@Jg<a<h>Yh>Zhh@Jg<Xa<h<Yh@ZH~",
G[]="ZxZxZxZ>]<^<ZxZ@^<_<NZxZ>Na<RNZxZ>MQRSNZxZ<RPLRLQZxZ<a<VQRQZxZ>QVQRZxZ@a<RZxZBa<RZxZBa>Wh<Zv_<Wh<WhDZlXOXOWh<WhFZjh@Wh<WhFZjXYh>Jg<hFZjhBJg<hFZjhBJWhJZhhBJWh<Qb<Xi<h<Zfi>h<JWh<Qb<XYh@Zbh<i<h<JWh>a<YhBZbh@QXJWh>i>hDZbh<a>JWXiBhBZdi<Ra<JXiFZP~",
H[]="ZxZxZxZxZL`BZxZ>N_<^<ZxZ>TQRSTZxZ<TQKb<TZxZ<La<RTZxZ>a>KRQZxZ>Va<RZxZ@f<RZxZBa<RWZxZ>WQh<Wh<ZtOXOWJh<Wh@Znh@g<h<WhBZjhBg<JWhFZhhDWJWhFZhhDWJWhFZhXYh@WJhHZhXYh@WJhHZhXi<h>WJh>a<Rh<ZhXi<h>WJh>b<Qh<ZhXi<h>WJh>a>h<ZhXi>h<WJh>YQh>ZP~",
*I="/usr/bin/aplay",*J="r.raw",*h[]={E,G,G,H,H,G,G,E},*b,*n,*l,*W;
int f[64],o=0,w,i=0,s=0,S=0,j,d,x,c,r,Z=704e3,g[]={
9474192,11302972,13664348,14718064,6572056,4466688,9985064,13660272,14715016,15507616,8677424,11549756,12605528,13158600,4210752,2895872};
void a(char*N,char*L){for(n=N,l=L;*n;n++,l++){
d=(*l-58)*1e3;w=*n>'z'?0:8e3/f[*n-58];
for(j=0;j<d;j++,o++)if(w&&(j%w<w/2))b[o]+=(j>d/2)?32:63;}}
int main(int argc, char**argv) {
FILE *P;for(;i<64;i++)f[i]=440*pow(2,(i-45)/12.0);
if (!(b=calloc(Z,1))) return 1;
a(A,B);o=0;a(C,D);
if(!fork()){if((P=fopen(I,"r"))){fclose(P);P=popen(I,"w");s=1;}
else{P=fopen(J,"w");}if(P){fwrite(b,Z,1,P);}if (!s)fclose(P);else pclose(P);
for(;;);}
for(;;){W=h[S++&7];x=0;printf("\x1b[1;1H");
while(*W<'~'){c=*W-58;r=c<16?1:c<32?2:*(++W)-56;c&=15;
printf("\x1b[48;2;%d;%d;%dm",(g[c]>>16)&255,(g[c]>>8)&255,g[c]&255);
for(i=0;i<r;i++,x++)printf(x%80?" ":"\n ");
W++;}usleep(Z/3);}return 0;}
Sjekk videoen (eller last ned koden og prøv den selv):
Har du macOS må du installere Xterm og Quartz for å få det til å virke.
Du finner alle vinnerne på ioccc.org der du også finner en lenke for å laste ned alt sammen så du kan prøve på din egen maskin. Alle bidragene har et ./try.sh-script så det er enkelt å kjøre dem etter at du har kompilert med make all .