CodeCup NIO 2017 - Een online programmeerwedstrijd.  

CodeCup NIO 2017 - Een online programmeerwedstrijd.

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 More 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 of Haskell. De tabel toont welke compiler en configuratie wij gebruiken.

Taal   Compiler   Opties
Pascal FreePascal 2.6.2   fpc -Sog -O2 -viwn -g -Cr-t-
C GNU GCC 4.8.4   gcc -Wall -O2 -g -lm
C++ GNU GCC 4.8.4   g++ -Wall -O2 -g -lm
C++11 GNU GCC 4.8.4   g++ -Wall -O2 -g -std=c++0x -lm
Java OpenJDK 1.7.0_111   javac -O
Python Python 2.7.6   python
Python 3 Python 3.4.3   python
Haskell GHC 7.6.3   ghc --make -O3

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 OpenJDK 1.7.

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.7 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.

Python 3
Programma's geschreven in Python 3 draaien in de Python 3 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('Debug info', file=sys.stderr).

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.

Over de competitiecomputer

Computer: Intel Xeon E5-2630, 2.30Ghz
Geheugen: 1 GB, Je programma mag 128 MB gebruiken
Besturingssyteem.: Linux 3.13.0 (Ubuntu 14.04 LTS)
Compileertijd: 5 minuten
Tijdslimiet: 30 seconden per spel

Je programma mag maximaal 30 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 29 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,3 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.

Voorbeeldspelers

Om je opweg te helpen met je eigen speler heeft het team van de CodeCup een voorbeeldspeler gemaakt in een paar van de meest gebruikte talen. Deze bevatten alle code voor de in en uitvoer, maar jij moet de code schrijven die daadwerkelijk het spel speelt.
C
Pascal