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ň