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!

Skjønner du hva denne koden gjør? Ikke jeg heller, men den gir deg snurrende snurrebasser i terminalen. Bidraget er fra Yusuke Endoh.
Publisert

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 .

Powered by Labrador CMS