FAQ zum siebten freiesMagazin-Programmierwettbewerb

Seit dem Start des siebten freiesMagazin-Programmierwettbewerbs Anfang Oktober gab es einige Fragen von den Teilnehmern, die hier kurz für alle beantwortet werden sollen.

-> Welcher Computer ist der Maßstab für die Beschränkung von einer Sekunde Rechenzeit?

<- Auch wenn man es sicherlich schaffen kann, durch diverse Vorausberechnungen die eine Sekunde zu erreichen, sollte sich nicht zu sehr auf diese Zeit versteift werden. Kein Bot wird disqualifiziert, weil er diese Grenze leicht überschreitet. Falls aber unbedingt eine grobe Richtlinie gewünscht ist: Es handelt sich um einen Intel Core2 Duo CPU E8400@3.00GHz mit 4 GB RAM. Hiervon steht jedem Bot 1 GB RAM zur Verfügung.

-> Was ist die maximal zulässige bzw. minimal Spielfeldgröße für den Wettbewerb?

<- Die maximale Größe wird aus Zeitgründen 100x100 Felder umfassen, weil die Berechnung sonst zu lange dauert. Bei einer Sekunde als Beschränkung für eine Berechnung wären das maximal 10000 Sekunden, also etwas mehr als zwei Stunden.

Die minimale Größe sollte so gewählt sein, dass die Bots auch noch etwas sinnvolles tun können. Ein Feld der Größe 4x4 wäre daher sehr langweilig. Sinnvoll wäre also wahrscheinlich 10x10.

Die Spielfelder müssen dabei im Übrigen nicht quadratisch sein!

-> Gibt es ein Auswerteskript für die Ergebnisse?

<- Ja, im aktuellen Quellcodearchiv befindet sich eine Analyseskript. Wenn man den Wettbewerb über

$ ./start_contest.sh 1

startet und dort vorher seinen eigenen Bot einbringt, werden die Ergebnisse
des Spiels im Ordner results gespeichert. Diese kann man mit

$ ./analyse_results.sh results/*

analysieren, sodass die Punkte der einzelnen Teilnehmer addiert werden.

-> Unter Python wird mein Bot-Kommando zwar übertragen, kommt aber nicht beim Server an.

<- Das liegt vermutlich daran, dass das Flushen der Ausgabe vergessen wurde. Die einfache Lösung für das Problem ist beispielsweise die Ausgabe per

sys.stdout.write('AHEAD').flush()

-> Die GUI lässt sich unter mit einem Linker-Fehler nicht erstellen:

CommandHandler.cpp:(.text+0x12f): undefined reference to `QArrayData::deallocate(QArrayData*, unsigned int, unsigned int)'
CommandHandler.cpp:(.text+0x776): undefined reference to `QArrayData::deallocate(QArrayData*, unsigned int, unsigned int)'

<- Die GUI nutzt noch Qt4, in vielen neueren Betriebssystemen ist aber Qt5 der Standard. Dort bitte Qt4 nachinstallieren und die GUI per

$ qmake-qt4 && make

übersetzen.

-> Wann wird der Quellcode eines Bots veröffentlicht?

<- Der Quellcode wird erst nach dem Wettbewerbsende und zusammen mit den Ergebnissen auf der Webseite veröffentlicht. Es gibt also keine Möglichkeit, dass ein Teilnehmer die Strategien der anderen Teilnehmer vorab einsehen kann.

-> Ist der Wettbewerb auf bestimmte Programmiersprachen eingeschränkt?

<- Nein, man kann jede Sprache nehmen, wenn sie auf einem aktuellen Linux-Betriebssystem lauffähig ist und für „exotische“ Sprachen eine Übersetzungsanleitung beigelegt wird. In der Vergangenheit wurden Programme in folgenden Sprachen eingereicht: C/C++, Python, Java, Haskell, Mono/C#, Groovy, Ruby, Scala, Perl und Pascal.

-> Könntet ihr Kompilate des Servers für die unterschiedlichen Betriebssysteme bereitstellen?

<- Nein, das wird schwer bis unmöglich. Es gibt viel zu viele Linux-Betriebssysteme mit unterschiedlichen Bibliotheken und Abhängigkeiten. Auch Windows und MacOS X befinden sich nicht in unserem Besitz, sodass wir hier keine Binärpakete bereitstellen können.

Unter Windows gibt es dabei ggf. ein Problem, weil das System Pipes für die Kommunikation unterstützen muss. Bei einem der letzten Wettbewerbe hat das bei einem Benutzer mit Cygwin auf Windows nicht funktioniert.

-> Kann ich meinen Bot manuell steuern bzw. wie kann ich ihn debuggen?

<- Da STDIN und STDOUT als Kommunikationskanal verwendet wird, gestaltet es sich ziemlich einfach. Am Beispiel des Dummybots, der dem Wettbewerb beiliegt, kann man dies leicht zeigen. Alle Eingaben müssen in der Konsole eingegeben werden:

$ ./bot
GAMEBOARDSTART 2,2
..
..
GAMEBOARDEND
SET 1
POS 1 1,1 S
POS 2 2,2 N
ROUND 1

Darauf antwortet der Bot dann mit AHEAD. Man simuliert also nur die Server-Befehle, die der Bot normalerweise empfängt.

Dies kann man auch nutzen, in dem man die Eingabe oben in eine Datei schreibt und damit den Bot füttert:

$ ./bot < serverbefehle.txt

Da der Eingabestrom hier aber am Ende der Datei abbricht, sollte die letzte Zeile immer END sein.

Möchte man eine gelaufenes Spiel analysieren, weil der eigene Bot ggf. eine falsche bzw. ungünstige Entscheidung getroffen hat, kann man das Logfile nutzen:

$ ./start.sh fields/simple.txt bots/dummybot/bot bots/dummybot/bot --log > bot.log 2>&1

Aus der Datei bot.log muss man noch die falsche SET-Zeile entfernen (je nachdem, ob der Bot die Nummer 1 oder 2 hat), sowie alle Zeilen mit (II) am Anfang:

$ egrep -v "(II)|SET 2" bot.log > eingabe.txt

Danach kann der Bot diese Daten verarbeiten und man kann mit gdb oder Ähnlichem debuggen:

$ ./bot < eingabe.txt