Technische regels
Deze regels beschrijvn hoe je je programma moet schrijven. Aangezien de competitie automatisch wordt gehouden door computerprogramma's moet je programma exact werken volgens deze regels.
Je programma insturen
Om mee te doen aan de competitie, moet je een programma schrijven dat het spel Bao kan spelen. Je kan de broncode van je programma via deze website opsturen. De broncode van het programma mag maar uit een bestand bestaan, daarnaast mag hij ook niet groter zijn dan 1.474.560 bytes (de grootte van een floppy, oftewel ongeveer 1.4MB). Je programma wordt gecompileerd en uitgevoerd onder Linux. De compilatie van je programma mag niet langer duren dan 5 minuten (dat zou ruim genoeg moeten zijn, normale programma's compileren in minder dan 2 seconden).
Invoer en Uitvoer
Je programma moet invoer uitlezen van de standard input (normaal het toetsenbord) en uitvoer schrijven naar standard output (normaal het beeldscherm). Je programma wordt een keer opgestart aan het begin van het spel en blijft draaien tot het einde van het spel.
Je moet je precies houden aan het protocol zoals dat is gegeven in de regels van het spel. Elke zet staat op een regel. Je mag er van uitgaan dat alle invoer die aan je programma wordt voorgeled correct is.
Om fouten in je programma op te sporen mag je programma berichten wegschrijven naar de standard error. Deze berichten worden alleen aan jou bekend gemaakt.
Programmeertalen
Je mag je programma schrijven in Pascal, C, C++, Java, Python, Haskell of Javascript. De tabel toont welke compiler en configuratie wij gebruiken.
Taal |
Compiler |
Opties |
Pascal |
FreePascal 2.0.4 |
fpc -Sogh -O2 -viwn -g -Cr-t- |
C |
GNU GCC 4.3.2 |
gcc -Wall -O2 -g -lm |
C++ |
GNU GCC 4.3.2 |
g++ -Wall -O2 -g -lm |
Java |
Sun JDK 1.5.0_04 |
javac -O |
Python |
Python 2.5.2 |
python |
Haskell |
GHC 6.8.2 |
ghc --make -O3 |
Javascript |
Spidermonkey 1.8-rc1 |
js |
Pascal
Programma's die geschreven zijn in Pascal worden gecompileerd met FreePascal in "TurboPascal mode". FreePascal lijkt zeer op Turbo Pascal, maar is veel krachtiger. Je kunt gemakkelijk een array van enkele megabytes maken in FreePascal. Let erop dat de types Integer en Cardinal geen grotere getallen dan 32767 respectievelijk 65536 kunnen opslaan. Het is gemakkelijker het type LongInt te gebruiken.
Je kunt Read en ReadLn gebruiken om te lezen van de standard input, en WriteLn om te schrijven naar de standard output. Nadat je een zet hebt weggeschreven moet je programma nog Flush(Output); aanroepen om zeker ervan te zijn dat je programma direct naar de uitvoer schrijft. Je kunt naar de standard error schrijven met WriteLn(StdErr, 'debug info'); .
Het gebruik van units wordt afgeraden. Ze zullen je niet erg veel helpen en kunnen er voor zorgen dat je programma fouten oplevert tijdens de competitie. Het is niet mogelijk units te gebruiken die je zelf hebt geschreven, aangezien je broncode maar uit een bestand mag bestaan.
Gebruik in ieder geval niet de CRT unit, want die zorgt voor erg veel fouten tijdens de competitie.
C en C++
Programma's die geschreven zijn in C of C++ worden gecompileerd met GCC, en gelinked met de standaard math bibliotheek (libmath).
Je kunt scanf() gebruiken om te lezen van de standard input, en printf() om te schrijven naar standard output. Na iedere zet die je programma heeft weggeschreven, moet je ook nog een aanroep dan naar fflush(stdout); om er zeker van te zijn dat je zet naar het CodeCupsysteem is gestuurd. Je kunt naar de standard error schrijven met fprintf(stderr, "debug info\n"); .
In C++ is het ook mogelijk om cin en cout te gebruiken. Gebruik dan cout.flush() na iedere zet die je hebt weggeschreven.
Java
Programma's geschreven in Java worden gecompileerd en uitgevoerd met Java JDK 1.5.
Je kunt het object System.in gebruiken om invoer te lezen en System.out om uitvoer weg te schrijven. Na iedere zet die je hebt weggeschreven, moet je programma nog een aanroep doen naar System.out.flush() om er zeker van te zijn dat de zet bij het CodeCupsysteem is aangekomen. Om naar de standard error te schrijven gebruik je System.err.println("Debug info");
Het is mogelijk meerdere classes te gebruiken in je programma, maar je moet ze wel in een bestand zetten. Als je dit doet, maak je classes dan niet public , anders zal de compiler ze misschien niet accepteren.
Als je een Java-programma opstuurt, vergeet dan niet als naam de naam van je class die main bevat in te voeren.
Python
Programma's geschreven in Python draaien in de Python 2.5 interpreter.
Je kunt sys.stdin.readline gebruiken om te lezen van de standard input en print om naar de standard output te schrijven. Na iedere zet die je hebt weggeschreven, moet je programma nog een aanroep doen naar sys.stdout.flush() om zeker te weten dat de zet naar het CodeCup systeem is verzonden. Je kunt berichten naar de standard error schrijven met print >>sys.stderr, 'Debug info' .
Je kunt de standaar Python modules(sys , re , time , etc) gebruiken in je programma. Je eigen code moet in een bestand staan. Let erop dat Python programma's normaal trager zijn dan programma's geschreven in C, Pascal of Java.
Javascript
Programma's geschreven in Javascript worden uitgevoerd met Spidermonkey 1.9.
Je kunt var input=readline() gebruiken om te lezen van de standard input en print('output') om te schrijven naar de standard output.
Helaas is er geen manier om naar de standard error te schrijven met Javascript.
Let erop dat scripts geschreven in Javascript langzamer zijn dan programma's in C, Pascal of Java.
Over de competitiecomputer
Computer: | Pentium IV, 2.8 Ghz |
Geheugen: | 1 GB, Je programma mag 64 MB gebruiken |
Besturingssyteem.: | Linux 2.6.24 (Debian 5.0.2) |
Compileertijd: | 5 minuten |
Tijdslimiet: | 5 seconden per spel |
Je programma mag maximaal 5 seconds per spel gebruiken. We meten alleen de tijd die je programma gebruikt om een zet te selecteren, zonder de tijd die je tegenspeler nodig heeft. Als je programma de tijdslimiet overschrijdt, verliest hij het spel.
Er is geen tijdlimiet per zet, alleen een tijdlimiet per spel. Dus je programma mag 4 seconden gebruiken voor de eerste zet, maar dan heeft hij nog maar 1 seconden over voor de rest van het spel.
Onthoud dat het systeem een 2,8 GHz processor heeft. Als je eigen computer thuis sneller of langzamer is, dan moet je opletten. Het is een goed idee het spel thuis op precies dezelfde manier te spelen als het wordt gespeeld op ons systeem. Je kunt zien hoeveel tijd je programma gebruikt per spel.
Om de competitie eerlijk te houden, mogen een aantal dingen niet:
- Je programma mag geen bestanden wegschrijven of inlezen
- Het is niet toegestaan een netwerkverbinding van welke soort dan ook te maken.
- Je mag niet het besturingssyteem aanroepen door andere programma's te starten of extra processen aan te maken (bijvoorbeeld door te forken);
- Het is niet mogelijk om berekeningen te doen terwijl je tegenstander aan de beurt is. Oftewel, je mag niet nadenken wanneer het je beurt niet is.
|