مسابقه بین‌المللی کدنویسی مبهم به زبان سی

لوگوی مسابقات

مسابقه بین‌المللی کدنویسی مبهم به زبان سی (به انگلیسی: International Obfuscated C Code Contest) یا به اختصار IOCCC یک مسابقه برنامه‌نویسی رایانه است که در آن هدف نوشتن خلاقانه‌ترین کد به زبان سی و به شکلی مبهم و نامفهوم است. این مسابقه از سال ۱۹۸۴ تا ۱۹۹۶ به شکل سالانه برگزار شد و پس از آن هم در سال‌های ۱۹۹۸، ۲۰۰۰، ۲۰۰۱، ۲۰۰۴، ۲۰۰۵، ۲۰۰۶، ۲۰۱۱، و ۲۰۱۲ برگزار شد.[۱] این مسابقه به صورت «جشنواره ابهام سینتکسی سی» تشریح شده است.[۲] برنده هجدهمین دوره و نوزدهمین دوره که در سال ۲۰۰۵ و ۲۰۰۶ برگزار شده بودند، در سال ۲۰۱۱ اعلام شد.[۳] تا قبل از سال ۲۰۰۴، کدهای نامزد در مسابقه به وسیله ایمیل ارسال می‌شدند،[۴] در سال ۲۰۰۴ که هفدهمین دوره مسابقات برگزار شد، کدها از طریق یک رابط مبتنی بر وب فرستاده شدند.[۵] نامزدها به شکل ناشناس توسط یک هیئت داوری بررسی می‌شوند. فرایند داوری در رهنمودهای مسابقه [۶]مستندسازی شده است و از دور حذفی تشکیل می‌شود. مرسوم است که هیچ اطلاعاتی در مورد تعداد شرکت‌کنندگان در مسابقه منتشر نشود. برنده‌ها در چندین دسته مختلف اعلام می‌شوند، همانند «بهترین سوءاستفاده از پیش‌پردازنده سی» یا «نامنظم‌ترین رفتار» یا همچنین «جالب‌ترین خروجی» و سپس برنده‌ها در وب‌سایت رسمی مسابقه اعلام می‌شوند.

مثال‌ها

[ویرایش]

کد زیر یکی از کدهای شرکت‌کننده در سال ۱۹۸۸ بود. این کد با نگاه کردن به مساحت خودش، عدد پی را محاسبه می‌کند.[۷]

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

برای کامپایل کد بالا، باید دستور زیر اجرا شود:

gcc -traditional-cpp -o r r.c or gcc -E r.c | sed 's/- -/--/g' > r2.c ; gcc -o r2 r2.c

مثال پیش رو یک شبیه‌ساز پرواز است که برنده سال ۱۹۹۸ بود.

#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); } }

برنامه بالا باید با دستور زیر کامپایل شود:

cc banks.c -o banks -DIT=XK_Page_Up -DDT=XK_Page_Down \
	-DUP=XK_Up -DDN=XK_Down -DLT=XK_Left -DRT=XK_Right \
	-DCS=XK_Return -Ddt=0.02 -lm -lX11 -L/usr/X11R6/lib

منابع

[ویرایش]
  1. "Summary of IOCCC Winners" (plain text). IOCCC. 2011. Retrieved 2011-11-12.
  2. Palmer, Geoff (November 1, 2004). "Beyond the command line". PC World Magazine New Zealand. Archived from the original on 10 February 2013. Retrieved 2013-04-07.
  3. "Previous IOCCC Winners". IOCCC. 2011. Archived from the original on 9 April 2009. Retrieved 2011-11-12.
  4. "2001 Rules". IOCCC. 2001. Archived from the original (plain text) on 16 November 2011. Retrieved 2011-11-12.
  5. "2004 Rules". IOCCC. 2004. Archived from the original (plain text) on 16 November 2011. Retrieved 2011-11-12.
  6. "2011 Guidelines" (plain text). IOCCC. 2011. Retrieved 2011-11-12.
  7. 5th International Obfuscated C Code Contest 1988 بایگانی‌شده در ۲۲ اکتبر ۲۰۱۳ توسط Wayback Machine (westley.c). IOCCC.