Concurs internațional de cod C ofuscat

Concursul internațional de cod C obscurizat (în franceză  : „Concurența internațională C cod întunecat”) este un concurs de programare organizat anual din 1984 (cu excepția 1997, 1999, 2002 și 2003). Există mai multe înregistrări câștigătoare în fiecare an și fiecare an se încadrează într-o categorie precum „Cel mai mare abuz de preprocesor C” sau „Cel mai inconsistent comportament”.

Origine

IOCCC au fost lansate de Landon Curt Noll  (în) și Larry Bassel . Vorbeau despre codul abominabil pe care trebuiau să-l păstreze în munca lor de zi cu zi. Au decis să organizeze un concurs pentru cel mai prost cod C posibil. În spațiul permis de doar câțiva kilobyți, participanții reușesc să facă lucruri complicate: câștigătorul anului 2004 sa dovedit a fi un sistem de operare.

Citate

Câteva citate ale câștigătorilor și juriului din 2004 includ:

Exemple

Un exemplu de intrare este:

#define _ -F<00||--F-OO--; int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ }

Acest program calculează pi uitându-se la propria sa suprafață; o valoare mai precisă poate fi obținută folosind un program mai mare (această intrare a fost scrisă în C K&R  ; așa cum este, nu se compilează la ANSI C.)

Un alt exemplu este un simulator de zbor foarte ingenios, care a câștigat IOCCC în 1998:

#include <math.h> #include <sys/time.h> #include <X11/Xlib.h> #include <X11/keysym.h> double L ,o ,P ,_=dt,T,Z,D=1,d, s[999],E,h= 8,I, J,K,w[999],M,m,O ,n[999],j=33e-3,i= 1E3,r,t, u,v ,W,S= 74.5,l=221,X=7.26, a,B,A=32.2,c, F,H; int N,q, C, y,p,U; Window z; char f[52] ; GC k; main(){ Display*e= XOpenDisplay( 0); z=RootWindow(e,0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0)) ; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400, 0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6} ; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B= sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E *T*B,E*d/K *B+v+B/K*F*D)*_; p<y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; if(p [n]+w[ p]+p[s ]== 0|K <fabs(W=T*r-I*E +D*P) |fabs(D=t *D+Z *T-a *E)> K)N=1e4; else{ q=W/K *4E2+2e2; C= 2E2+4e2/ K *D; N-1E4&& XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M; XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){ XEvent z; XNextEvent(e ,&z); ++*((N=XLookupKeysym (&z.xkey,0))-IT? N-LT? UP-N?& E:& J:& u: &h); --*( DN -N? N-DT ?N== RT?&u: & W:&h:&J ); } m=15*F/l; c+=(I=M/ l,l*H +I*M+a*X)*_; H =A*r+v*X-F*l+( E=.1+X*4.9/l,t =T*m/32-I*T/24 )/S; K=F*M+( h* 1e4/l-(T+ E*5*T*E)/3e2 )/S-X*d-B*A; a=2.63 /l*d; X+=( d*l-T/S *(.19*E +a *.64+J/1e3 )-M* v +A* Z)*_; l += K *_; W=d; sprintf(f, "%5d %3d" "%7d",p =l /1.7,(C=9E3+ O*57.3)%0550,(int)i); d+=T*(.45-14/l* X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47 *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W* 179*v)/2312; select(p=0,0,0,0,&G); v-=( W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u )/107e2)*_; D=cos(o); E=sin(o); } }

Aspecte luate în considerare

Unele aspecte notabile ale intrărilor includ:

  • Forma listării, care poate arăta ca imagini, text etc. ;
  • Redefiniri ale preprocesorului pentru a face codul mai greu de citit;
  • Codul de auto-modificatoare  ;
  • Cel mai prost abuz de regulă: în mai multe rânduri a fost trimisă o înregistrare care a fost atât de evident absurdă încât a dus la o redefinire a regulilor pentru anii următori. Este o foarte mare onoare. Un exemplu este cel mai mic program care se afișează. Intrarea a fost un program de dimensiuni zero, care, la pornire, a afișat zero octeți pe ecran (care necesită o utilizare creativă a makefile-ului pentru a o corecta).

Mai multe dintre intrările anterioare sunt notabile pentru provocarea blocării compilatorului (mai ales cea din Visual Studio ).

Note și referințe

Note

  1. Dacă utilizați GCC , compilați cu următoarea linie de comandă: gcc -E r.c | sed 's/- -/--/g' > r2.c ; gcc -o r2 r2.c(dacă fișierul sursă este apelat r.c).

Referințe

  1. http://www.ioccc.org/years.html#2004_burley
  2. http://www.ioccc.org/2004/burley.hint
  3. http://www.ioccc.org/years.html#2004_jdalbec
  4. http://www.ioccc.org/2004/jdalbec.hint
  5. http://www.ioccc.org/years.html#2004_vik2
  6. http://www.ioccc.org/2004/vik2.hint
  7. http://www.de.ioccc.org/years.html#1988_westley
  8. http://www.de.ioccc.org/1988/westley.c
  9. IOCCC Flight Simulator .
  10. http://www.ioccc.org/years.html#1994_smr

Anexe

Articole similare

linkuri externe