NIO CodeCup 2025 - Een online programmeerwedstrijd.  

NIO CodeCup 2025 - 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 Squares kan spelen. Je kan de broncode van je programma via deze website opsturen. De broncode van het programma mag maar uit één bestand bestaan. Het bestand met de broncode mag 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.

Belangrijk:als je naar standard output schrijft moet je ervoor zorgen dat je je uitvoer ook flusht zodat de referee niet wacht op je zet. Hieronder wordt uitgelegd hoe je een flush kunt uitvoeren in een van de ondersteunde programmeertalen.

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. Er wordt maar een maximaal aantal karakters (ongeveer 10.000 karakters) via standard error doorgegeven dus gebruik het verstandig.

Programmeertalen

Je mag je programma schrijven in C/C++, Python, Java, Pascal, JavaScript, Haskell, OCaml, Go of Rust. De tabel toont welke compiler en configuratie wij gebruiken.

TaalCompilerVersieCommando
CGNU GCC 13.2.0 gcc -Wall -pipe -O2 -march=native -g --std=c99 -lm
C#Mono 6.8.0.105 mcs -optimize+ ; mono
C++GNU GCC 13.2.0 g++ -Wall -pipe -O2 -march=native -g --std=c++20 -lm
Go  1.22.2 go build
HaskellGHC 9.4.7 ghc --make -O3
JavaOpenJDK 21.0.4 javac ; java -Xmx2000m -Xms2000m -XX:+UseSerialGC
JavaScriptV8 7.1.0 d8 --single-threaded
OCaml  4.14.1 ocamlopt -o
PascalFreePascal 3.2.2 fpc -Sog -O2 -viwn -g -Cr-t-
Python  3.12.3 python3
Rust  1.75.0 rustc -O --edition=2021 -C target-cpu=native

 

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

C#

Programma's geschreven in C# draaien in de Mono compiler.

Je kunt Console.ReadLine gebruiken om te lezen van de standard input en Console.WriteLine om naar de standard output te schrijven. Na iedere zet die je hebt weggeschreven, moet je ook nog een aanroep doen naar Console.Out.Flush() om zeker te weten dat de zet naar het CodeCup systeem is verzonden. Je kunt berichten naar de standard error schrijven met Console.Error.WriteLine("Debug info");.

Python

Programma's geschreven in Python draaien in de Python 3 interpreter.

Je kunt input() 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 óf flush=True meegeven aan print óf 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 programma mag de Python module numpy en alle standaard modules gebruiken zoals sys, re, time. Je eigen code moet in één bestand staan.

Let erop dat Python programma's normaal trager zijn dan programma's geschreven in C, Pascal of Java. Ook wordt Python 2 niet meer ondersteund.

Java

Programma's geschreven in Java worden gecompileerd en uitgevoerd met OpenJDK.

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.

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.

JavaScript

Programma's in JavaScript worden met de V8 JavaScript engine uitgevoerd.

Je kunt readline gebruiken om vanaf standard input te lezen, en write of print om te schrijven naar standard output. Goed om te weten is dat print hetzelfde werkt als write behalve dat print er een nieuwe regel achter plakt. Schrijf debugbericht naar standard error door gebruik te maken van de functie printErr of console.error.

 

Over de competitiecomputer

Computer: Intel(R) Xeon(R) CPU E5-2620 0 @ 2,00GHz
Geheugen: 8 GB, Je programma mag 2 GB gebruiken
Besturingssysteem: Ubuntu 24.04.1 LTS
Tijdslimiet: 30 seconden per spel
Compileertijd: 5 minuten

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,00GHz 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.