International Obfuscated C Code Contest -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Thus spake the master programmer: "A well-written program is its own heaven; a poorly-written program is its own hell." -- Geoffrey James, "The Tao of Programming" Zde bych rád přiblížil, jak vypadá mistrovské zvládnutí jazyka C. Ten je zajímavý zejména tím, že není úplně čistě strukturovaný, má operátory s vedlejším účinkem a mnoho dalších zajímavých vlastností, které lze mistrovsky využít. Takto krásně a jednodušše může být implementována funkce strcpy: while (*d++=*s++); Tato implementace je přímo od autorů jazyka C. Jiný krásný příklad je zoptimalizovaná vnitřní smyčka: register n = (count + 7) / 8; /* count > 0 assumed */ switch (count % 8) { case 0: do { *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while (--n > 0); } - Duff's device (korektní kód v C) Věřte nebo ne, tento kód je naprosto korektní a znám pod jménem "Duff's device". Je to jeden z mála příkladů dvojrozměrného kódu. Zajímavé také je, že je možné smazat vnější pár složených závorek. Další oblíbený trik, kterým šokuji "znalce jazyka C" je konstrukce: putc("abcd"[i],stdout) Která je nejenom hezká, ale i velice často praktická. Například jsem na ni založil generátor smajlíků pro hru koules (pokud hra běží v síti, na obrazovce serveru se zobrazují odhadované výrazy jednotlivých hráčů podle různých parametrů ze hry): #define A(c) (*s=c,s++) void edisplay (int e, int l, int t) { A ("(<|]<["[l?(e>>4)%7:0]),A((l?(t?"8b8d8|":":;:|:8"):"||||||")[(e >>2)%6]),A(e>40&&l?'=':"-^"[l?(e>>3)%2:0]),A((l?(!t?")>D)]|(<[|": ">OQ><(C(P|"):"|""||||||||")[(e>>1)%10]),A(' '); } #undef A Díky této bizardnosti jazyka C vznikla dokonce celá soutěž jménem International Obfuscated C Code Contest (IOCCC) - http://reality.sgi.com/csp/ioccc, která každoročně hledá autoroa toho nejzamotanějšího a nejnápaditějšího programu v C. Mezi ty kratší příspěvky patří například následující program pro výpočet PI, který počítá svoji vlastní velikost. Pokud chcete větší přesnost, napíšete větší program: /* * Program to compute an approximation of pi * by Brian Westley, 1988 */ #define _ -F<00||--F-OO--; int F=00,OO=00; main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ } Toto je Hello Word jak by opravdu neměl vypadat: /* * HELLO WORLD program * by Jack Applin and Robert Heckendorn, 1985 */ main(v,c)char**c;{for(v[c++]="Hello, world!\n)"; (!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+!!c,!c)); **c=!c)write(!!*c,*c,!!**c);} A toto je program na zobrazování času ve výpise procesů: #include <stdio.h> /*MLSPXPMPVPOQN POPJLVMMQNQNPSPYPXLRP XMTJMLSPXPMPVPOQNPOPJLVMN QSPWPOPXLRPXMTJMLNPOPPPSPXPOP JLYPRLTPVLUPVLWPVLXPVLVPSLJLUQP PJQLQSPXPNQPPRLTPVL*/main(){int K/* PUOUPWOV*/,L/*WPVLXPVLKPUOVPWOSLU*/,M /*PPPPVPOQMQRPR*/=0;FILE/*TPSLUMWQT*/ * J/*MPRPKPLQ*/; J= fopen(__FILE__ /*T*/,"r");for (;( L/*KPUOWOWMUQ LLOLMPULWLWL WLW LWLWLWLWLWLW LWLWLULVOXP LLV LLLOLMPULOL MMNP*/=getc (J) )!= -1;L/* OLWLRMMQUL VOX PLLVLLLMQO PMPYPXPNP MQL LVLLLWPSP XPOQNQOPMQ LLV LTj*/>='J' &&L/*LRPYP OQL QMQLLVLLL OLMQVOXPL LVL LLVOe*/<= 'J'+15&&( (M= !M/*MMMQMV OJMMMMMU OOL NPU MPMOM UMRNOLMQV OJM MMMMRMLLW QUMTJSPX PNQ JLLPUOWO WMUQJMVL JMV L*/)?K/* MQMV*/=L: putchar (K/*deMN MaVbcLKM KMV Le*/-'J' /*MWQUMTJ WPK PSPXPR*/ |(L/*PQV LMPSLSPXPNQ*/- 'J'<<4)) ));exit( 0);}/*LPQUMMPR PKPLQJLT LTLJLMPU MTJUQMPRPKPLQ JLNPUONM JMWOVLTL OPVLPPWM PMUMTJNQ SPWPOPYO NQJLQPUM TJPNSNVN ONJLTLRP VLTLSPUM TJQQRPSP VPOPJLRL WLWLPPJLP LPLJLKLJQ SPJQOPRL NPSLJLPL PLJLKLPPY PLQUPRLSL SLUMTJRPW MPPNPYPJQ OPXPRLPMW LPPVMVMKM VLLLKPLLSL UMSPWMPPNP YPJQOPXPR LRLPMWLPP VMVMKMSLUL KMVLLLLQLL SLUMTJPPYP LQRLUMUMSL UQSPPPRLPPS LUQPPQPOPNQ MQRLNPVLNMJM VLSPSLUMNPUO MQNQLQVPOPXPR LNPSLWLKMWOWM QLVOJMQLUMTJSP PPRLTLNPWMWMQL JMQLULPPSLUQMQJQLQSPXPNQPPRLTLMPVLLLOLM QVOXPLLVLNPULKMSLUMYPRLMQNQNPYPOQNQVL PMVLPMWLPPVLNPULKMVLJMSLWQTJSPPPRLT LNPXMQLJMQLULPPSLYPRLRPVLOMVLNP VLJMVLJMSLWQOPVPMQOPUQNQSPWPO PRLPLQPSLUMOPWMKPMQMPNQSP WPOPRLVPYPMPKPVPNQSPW POPRLPLQPSLSLUM TJPPYPLQRLPQWMKMUMPQVMPMUMPQULULSLYPRLRPVLPQKLWMKMPLPLPQKLWMPMWLKMVLPQ ULQLJMQLVLKPNQYPSPRLOPULLPUOPQWOSLVLPQSLMQVPOPOPJQRLKMSLUMWQWQWQTJTJ*/ výheň