Pređi na sadržaj

IOCCC

S Vikipedije, slobodne enciklopedije

IOCCC (engl. International Obfuscated C Code Contest) je takmičenje na polju programiranja, na kome je cilj napisati što kreativniji nejasan C kod. Suština je u pisanju nerazumnog i neshvatljivog izvornog koda sa svim mogućim zloupotrebama pravila pisanja u nameri da se u što manje koda smesti što kompleksniji program. Osnivači takmičenja su Landon Curt Noll i Larry Bassel, a takmičenje se od godine 1984. održava redovno, sa izuzetkom godina 1997, 1999, 2002, 2003. Ideja potiče od veoma nejasnog koda koji su ova dva programera u to vreme održavali. Odlučili su da naprave takmičenje za najgori mogući C kod, i zaista: u okviru ograničenja od nekoliko kilobajta, takmičari ostvaruju razne stvari - pobednički kod na takmičenju 2004. godine je postao operativni sistem.

Brojni primeri se mogu videti na IOCCC sajtu.

Pravila 2004 godine[uredi | uredi izvor]

Da bi nam pomogli oko širine posla, molimo vas da pratite sledeća pravila:

  1. Vaš kod mora biti kompletan program.
  2. Veličina vašeg programa mora biti <= 4096 kilobajta. Broj simbola, isključujući praznine (tabulator, razmak, novu liniju, formfeed, return (carriage return)), svaki ; { ili } praćen sa prazninom ili krajem fajla mora biti <= 2048 kilobajta.
  3. Prijave treba da budu izvršene prema uputstvima na: http://www.ioccc.org/2004/submit[mrtva veza]. Napomena: Mehanizam za prijavljivanje će biti dostupan nakon 26. Januara 2004, 00:00 UTC. Pogledajte link iznad za više informacija.
  4. Ako je vaša prijava selektovana kao pobednička, biće modifikovana prema sledećem:
    1. Vaše instrukcije za kompajliranje fajla će biti smeštene u makefile. Ako su vaše instrukcije jedan makefile trebalo bi da on bude portabilan i upotrebljiv unutar jednog glavnog makefile.
    2. Vašem kodu će biti promenjeno ime prema našem izboru (obično vaše prezime ili anonymus) eventualno praćeno sa nekim brojem i ".c".
    3. Vaša prijava će biti kompajlirana u fajl sa gore navedenim imenom bez ".c". Ako vaša prijava zahteva da build file postoji, navedite to u napomenama. Vaš makefile će biti tako napravljen da sadrži potrebne informacije o ovome. Ime ovog fajla će biti ime vašeg programa, eventualno praćeno sa nekoliko cifara i završno sa ".sh".
      U slučaju potrebe dostavljene napomene uz prijavu treba da sadrže objašnjenje o tome kako vaš kod treba da bude izmenjen da bi radio sa novim imenima fajlova.
  5. Sva tri fajla: build file, vaš kod i izvršna verzija će biti tretirani kao fajlovi koji se mogu samo čitati (read only). Ako vašoj prijavi treba da menja ove fajlove, to treba da bude urađeno pravljenjem kopije fajlova i njihovim menjanjem. Ako je ovo slučaj, navedite to u vašim napomenama.
  6. Vaš kod bi trebalo bez problema da se kompajlira sa jednim ANSI C kompajlerom, a ako su očekivane ikakve greške prilikom kompajliranja, one moraju biti dokumentovane među vanjim napomenama.
  7. Program mora biti originalan rad. Svi programi će biti postavljeni u javni domen. Svi programi koji su eksplicitno zaštićeni autorskim pravima će biti odbijeni.
  8. Prijave moraju biti dostavljene do 29. februara 2004. 23:59:59 UTC. (UTC je ekvivalent Greenwich Mean Time). Putem e-ponjte će vam biti poslata jedna potvrda pre zatvaranja takmičenja.
  9. Svaki učesnik može da pošalje do 8 prijava po takmičarskoj godini. Svaka prijava mora biti zasebno poslata.
  10. Prijave koje zahtevaju čovečiju pomoć da bi bile kompajlirane nisu dozvoljene.
  11. Programi koji zahtevaju specijalne privilegije (setuid, setgid, super-user,special owner or group) nisu dozvoljene.
  12. Donekle vas ohravrujemo zalLegalnu zloupotrebu pravila. Prijava koja, po mišljenju sudija, krši pravila će biti diskvalifikovana. Prijave koje pokušavaju da zloupotrebe pravila moraju u napomenama sadržati pokušaj objašnjenja zašto su njihove zloupotrebe pravila legalne.
  13. Vaš kod ne sme da sadrži oktalne vrednosti visokog bit-seta bez escape-simbola. Na primer, vaš kod ne sme da sadrži oktalne vrednosti imeđu 128 i 255.
  14. Svaki program koji ne može da bude kompajliran zbog linija sa završnom kontrolom M (\r \015) će biti odbijen.
  15. Kada šaljete prijavu, morate navesti ispravu adresu e-pošte koja je u stanju da šalje i prima poštu. Slanje prijava putem e-pošte ima dve faze koje uključuju potrebu korišćena koda za potvrdu. Ovaj kod će vam biti poslat na e-poštu u toku prve faze. Prijave poslate bez aktivne i validne adrese e-pošte će biti diskvalifikovane. Sudije nisu odgovorne za kašnjenje e-pošte. Molimo vas planirajte dovoljno vrmena za automatizovanu razmenu e-pošte kao dela vaše prijave.
  16. Veoma vas ohrabeujemo da pošaljete originalne prijave. Više sličnih prijava nije preporučljivo.

Primer i analiza[uredi | uredi izvor]

Svaki OCC program može biti objašnjen njegovom formalnom analizom. Najčešće je potrebno izraziti ga zamenjivanjem nejasnih delova koda ekvivalentnim ali jasnijim.

Ovde će biti objašnjen jedan program koji štampa kartu Indije.

#include<stdio.h>
main()
{
int a,b,c;
for (b=c=10;a=
"- LLLLLL?, LMKC,XYZHELLO FOLKS,\
TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
Hq!WFs XDt!" [b+++21];)

for(; a-- > 64 ; )
putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
}

Ovaj program se da napisati i ovako. Ponašanje je ekvivalentno.

#include <stdio.h>

const char *p = "                               TFy!QJu ROo TNn(\
ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnAL\
VlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn T\
Nn ULo0ULo#ULo-WHq!WFs XDt!";

main()
{
   int   a, // одређује када се итерације прекидају
         b, // одређује да ли ће бити штампани узвичници или размаци
         c; // одређује када се прелази у следећу линију

   for(b=c=10;a=p[b+21];) // пролази са офсетом кроз стринг
   {
      b++;
      while( a > 64 ) // штампање низа узвичника или размака
      {
         a--;
         c++;

         if(c==90) // замена за c=='Z', време је за нови ред
         {
            c = 10;
            putchar('\n');
         }
         else
         {
            if(b%2) putchar(' '); // (не)парност b одлучује шта ће бити штампано
            else putchar('!');
         }
      }
   }

   return 0;
}

Komentari u kodu već govore ponešto. Prva stvar koja se da primetiti jeste da prvih 31 simbola stringa neće biti upotrebljeni u programu, te se na njihovom mestu sme ostaviti bilo šta. Konkretno ovde su stavljeni znaci razmaka. Od 32. simbola pa nadalje počinje se sa čitanjem simbola redom pomoću vrednosti b+21. Taj deo stringa je u stvari komprimovana karta koja određuje koliko i kada će kojih simbola biti ispisano, u sekvenci. Na primer kada se promenljivoj a dodeli prvo slovo korišćenog dela niza, T, ista će biti dekrementirana do vrednosti 64 (ili će se preći na sledeću, ukoliko je u startu manja od 65) i za to vreme će biti štampano 'T'-64 = 84 - 64 = 20 simbola. Zavisno od parnosti b ovi simboli mogu biti uzvičnici (neparno) ili razmaci (parno). Znači na početku izlaza bi se trebalo naći 20 razmaka kao što i jeste slučaj. Sledi 'F' 'F'-64 = 70-64 = 6, što uz inkrementiranje b znači da sledi šest uzvičnika itd.

Promenljiva c određuje kada će biti štampan znak za novu liniju. U početku je ona 10, a uvećava se za jedan prilikom štampanja svakog znaka uzvika ili razmaka, dok se nova linija štampa svaki put kada ista dostigne vrednost 90 (ASCII kod za 'Z'). Nakon štampanja znaka za novu liniju vrednost c biva vraćena na 10 i tako dalje.

Kada se dođe do kraja stringa, promenljiva a će u uslovu for petlje dobiti vrednost nula što znači završavanje ove petlje, a sa njom i programa.

Spoljašnje veze[uredi | uredi izvor]