Vierter freiesMagazin-Programmierwettbewerb gestartet

Nach einem Jahr Pause heißt es wieder einmal: Die Spiele sind eröffnet, denn der vierte freiesMagazin-Programmierwettbewerb steht an.

Wir haben uns die Kritik des letzten Wettbewerbs zu Herzen genommen und sowohl die Aufgabe als auch die Kommunikation mit dem Server vereinfacht, sodass nun vermutlich jeder Programmierwillige teilnehmen kann.

Kurz zusammengefasst geht es darum, über mehrere Runden hinweg mit einem abwechselnden Angebot von Punkten das bestmögliche Ergebnis für sich selbst zu erzielen. Dummerweise hat der Gegner auch immer ein Mitspracherecht, ob die Punkte so aufgeteilt werden, wie man es selbst vorschlägt. Und wenn es schlimm kommt, gehen alle leer aus.

Die Umsetzung ist sicherlich einfach, eine gute Taktik zu entwerfen, erfordert aber etwas Gehirnschmalz. Wir hoffen, mit der Aufgabe zahlreiche Teilnehmer zu gewinnen.

Webseite mit Regeln und Quellcode zur Teilnahme

Zu gewinnen gibt es Amazon-Gutscheine im Wert von variablen Anteilen. Das heißt, je mehr Punkte man im Spiel sammelt, desto höher fällt der Gewinn aus – zumindest für die ersten drei Besten. Der Wettbewerb endet am 30. November 2011, 23:59 Uhr.

Wir wünschen allen Teilnehmern viel Erfolg und freuen uns auf eine rege Beteiligung.

Ihr freiesMagazin-Team

Pingback

[...] eben wurde auf freiesMagazin der vierte Programmierwettbewerb eingeläutet. Nach der Kritik aus dem letzten Spiel, dass die Regeln und auch die Implementierung [...]

Pingback

[...] - Amazon-Gutscheine - ESS: 30.11.2011 Vierter freiesMagazin-Programmierwettbewerb gestartet | freiesMagazin "Nach einem Jahr Pause hei

Pingback

[...] startet den vierten Programmierwettbewerb – es geht um ein Spiel: Am Anfang waren es bunte Glitzersteinchen, danach blecherne Roboter, [...]

Pingback

[...] stellt die Ausgabe den mittlerweile vierten Programmierwettbewerb vor, der am 1. Oktober gestartet wurde. Die Aufgabe ist dieses Mal weniger anspruchsvoll als die bisherigen. Es geht darum, einen [...]

Wenn ich das Packet zum

Wenn ich das Packet zum runterladen wie vorgeschrieben kompiliere und laufen lasse, läuft der Rechner ewig und hört nicht auf!
Sogar bei einer einzigen Runde! Ist das ein Fehler, oder mache ich da was falsch?

Re: Wenn ich das Packet zum

Bitte etwas mehr Infos, was Du genau eingeben hast. Wenn es keine Rückmeldung bzw. Fortschritt vom Server gibt, dann wartet dieser in der Regel darauf, dass ein Bot ihm etwas sendet. Bei den bisherigen Problemen lag es immer daran, dass stdin nicht korrekt eingelesen wurde bzw. das Flushen nach dem Schreiben auf stdout vergessen wurde.

Du kannst uns Deinen Bot auch per E-Mail zukommen lassen, sodass wir ihn bei uns testen.

Nachdem ich euer Packet

Nachdem ich euer Packet runtergeladen und wie in der README beschrieben kompiliert hatte, habe ich folgendes ausgeführt:
$ ./start_contest.sh 2500
daraufhin erscheinen zuerst folgende Zeilen:
(II) BOT1: bots/dummybot/bot simple BOT2: bots/dummybot/bot simple
(II) START Wed Oct 5 12:51:37 2011

und das ist das letzte was ich zu sehen bekommen habe. Danach bleibt die CPU-Auslstung zwar auf ~99%, es tut sich aber nichts mehr.

Schade eigentlich, so ein schönes spielchen. Hoffentlich könnt ihr mir weiterhelfen!

Drei Ideen: 1. Was passiert

Drei Ideen:

1. Was passiert bei "./start_contest.sh 1" (also nur ein Spiel)?

2. Wenn er immer noch nicht reagiert, was passiert bei

./start.sh 1 "bots/dummybot/bot simple" "bots/dummybot/bot simple"

3. Und wenn auch das nicht hilft, könntest Du gemäß der FAQ den Debug-Modus einschalten und die Ausgabe nach "./start.sh 1 ..." posten ?

Ich vermute einfach, dass Dein Rechner für den Wettbewerb mit den drei Beispielbots (das sind 6 Matches a 2500 Spielen) einige Zeit braucht.

Viele Grüße
Dominik

3. Idee

Als auch das nichts half, habe ich das ganze im debugging modus kompiliert und erhalte seitdem folgende ausgabe nach
"$ ./start_contest.sh 1" :

(II) BOT1: bots/dummybot/bot simple BOT2: bots/dummybot/bot simple
(II) START Thu Oct 6 22:53:49 2011
(DD) main Arg 0: ./game.bin
(DD) main Arg 1: 1
(DD) main Arg 2: /dev/fd/63
(DD) main Arg 3: pipe1
(DD) main Arg 4: /dev/fd/62
(DD) main Arg 5: pipe2
(DD) main Anzahl Runde: 1 Anzahl Clients: 2
(DD) Server::createAndAddClient Neuer Client /dev/fd/63 pipe1
(DD) Server::createAndAddClient Client /dev/fd/63 pipe1 ist bereit!
(DD) Server::createAndAddClient Neuer Client /dev/fd/62 pipe2
(DD) Server::createAndAddClient Client /dev/fd/62 pipe2 ist bereit!
(DD) Server::send Sende 'RUNDEN 1' an Client 0

Dann habe ich bisher ungefähr 7 Minuten bei wiedermal ~99% Prozessorauslastung gewrtet - ohne Ergebnis.
Liegt es also an eurem Test-Bot?

Re: 3. Idee

Okay, zuerst ein Hinweis: Wenn man einen Wettbewerb oder ein Match mittendrin abbricht (z.B. mit Strg+C), werden die Bots nicht automatisch gestoppt. Diese sollte man dann mit killall bot abschießen.

Was mir bei der Aufzeichnung fehlt, ist ein "(DD) Server::send 1". Sprich, der Server will "RUNDEN 1" an Client 0 senden, aber die Pipe scheint belegt, sodass der Text nicht gesendet werden kann.

Wir könnten noch schauen, was der Bot in der Zeit macht. Schalte aus dem Grund auch bei den Bots im Makefile den Debug-Modus ein und kompiliere mit make clean && make neu.

Die Ausgabe solltest Du dann mit ./start_contest.sh 1 > ausgabe.txt 2>&1 in die Datei ausgabe.txt umleiten und posten oder, falls sie zu groß ist, per E-Mail zusenden.

Ich überlege derweil, woran das Problem liegen könnte.

PS: Ach, und poste bitte mal Deine Systemdaten. Sprich, Distribution, Kernel, welche Shell etc.

Cygwin

Im Moment muss ich leider auf Windows arbeiten und benutze cygwin mit der dort voreingestellten bash, trotzdem sollte das doch eigentlich auch hier funktionieren.
Unmittelbar nach dem kompilieren kommt er jetzt bis:
"send START
send 1" ("send 1" auch bei allen vorherigen Kommandos),
bricht dann aber wieder ab (d.h. macht wieder endlos nichts sichtbares).
Danach ist es wieder wie am Anfang.

Re: Cygwin

Hm, es könnte ggf. an Cygwin liegen. Bin aber nicht sicher ...

Schalter daher wie oben beschrieben das Debugging für den Bot ein und poste das Ergebnis am besten bei http://paste.pocoo.org oder woanders.

#496407

Re:

Okay, da das "Server::send 1" fehlt, bedeutet das, dass der Client wohl in der Zeile 118 in client.cpp hängt. Das ist aber die Ausgabe auf dem System (in dem Fall Cygwin), sprich, ich kann nichts daran ändern, wenn die Pipe aus welchen Gründen auch immer belegt ist.

Was wir noch testen können: Lade bitte die aktuelle Version der Spielengine herunter und starte wieder im Debug-Modus. Ich habe mehr Debug-Ausgaben eingefügt und zusätzlich die Ausgabe in die Pipe noch extra geflusht, auch wenn das nicht notwendig sein sollte.

Ausgabe dann wieder posten, sollte es hängen. Dann haben wir Gewissheit, aber leider immer noch keine Lösung.

#499494

und bitte: http://paste.pocoo.org/show/499494/
mit neuer engine und -DDEBUG in allen Makefiles

Okay, wir haben Gewissheit,

Okay, wir haben Gewissheit, aber wie gesagt keine Lösung. In client.cpp, Zeile 138 steht das System bei

mOutStream << message << std::endl << std::flush;

Und ab hier verlässt mich mein Wissen. Die Ausgabe auf dem Stream scheint unter Cygwin nicht zu funktionieren. Wieso? Keine Ahnung.

Wenn nicht jemand anderes noch eine tolle Idee hat, weiß ich da nicht weiter.

Du könntest natürlich versuchen, einfach alles direkt unter Windows zu kompilieren und zu starten. Ich weiß aber nicht, ob das besser klappt. Die Alternative wäre eine Virtuelle Maschine.

Das einzige, was ich zu

Das einzige, was ich zu Cygwin und Pipes gefunden habe ist ein Thread in einer Mailing List aus dem Jahre 2005, wo Pipes unbegründet langsam waren. Als Test wurde da etwas der Art `time cat /etc/motd |cat` verwendet, was bei dem Problemfall bis zu 10 Sekunden dauerte. Ich bezweifel zwar, dass es wirklich daran liegt, aber einen Versuch ist es trotzdem wert.

Cygwin Problem

Hi zusammen,
da ich auch wenig Ahnung von Cygwin habe, aber Google(tm) beherrsche, könnte es ja vielleicht folgendes sein:
1) Problem mit Zeilenende: CR vs. LF?
2) Text-Mode vs. Binary Mode?
Deswegen bin ich auf die Idee gekommen:
http://www.cygwin.com/cygwin-ug-net/using-textbinary.html
Viele Grüße
Matthias

$BOT1 vs. $BOT1?

Die oben gepostete Begegnung (II) BOT1: bots/dummybot/bot simple BOT2: bots/dummybot/bot simple passt eigentlich nicht zum in der FAQ stehenden Absatz „Was ist mit Hin- und Rückrunde gemeint?“, wonach immer nur verschiedene Bots gegeneinander antreten, oder?

Demnach dürfte die Begegnung simple vs. simple gar nicht stattfinden. Dies lässt sich zwar über eine einfache if-Verzweigung
if [ "$BOT1" != "$BOT2" ]
then
    #foo
    #bar
fi

ausschließen, aber ich wollte euch doch mal drauf ansprechen.

Ansonten: Schöne Aufgabe! Schnell verständliche, nicht zu komplexe Regeln. Einfache Kommunikation über stdin/stdout. Bei den vorherigen Wettbewerben war ich irgendwie immer etwas abgeschreckt, aber hier wollte ich dann doch mal an die Aufgabe heranwagen.

Re: $BOT1 vs. $BOT1?

Ich habe das Skript entsprechend angepasst und eine neue Version hochgeladen. Es war in der Tat unnötig, da bei der Auswertung diese Ergebnisse eh herausgefiltert werden würden.

Mögliche Punktzahl

...Das Spielprinzip wurde in der Vorgeschichte schon exakt wiedergegeben. Von allen Teilnehmern treten immer zwei gegeneinander in einem Match an. In jedem Match gibt es 2500 Runden. Pro Runde muss der jeweilige Startspieler einen Wert zwischen 0 und 1000 anbieten. Der andere Spieler erfährt diesen Betrag und muss diesen annehmen oder ablehnen. Danach werden beide über den gewonnenen Betrag informiert und der Startspieler wechselt. Der Ablauf ist dann wie oben. Mit der erneuten Mitteilung des gewonnenen Betrages ist eine gesamte Runde zu Ende und es beginnt die nächste, wobei der Startspieler wieder wechselt. Insgesamt sind somit im Bestfall 5.000.000 Punkte unter den zwei Spielern aufzuteilen....

Habe ich das Spielprinzip nicht verstanden oder sind im Bestfall doch nur 2,5 Millionen Punkte möglich?

Gruß

apensiv

Re: Mögliche Punktzahl

> Habe ich das Spielprinzip nicht verstanden oder sind im Bestfall doch nur 2,5 Millionen Punkte möglich?

Ich fürchte das erste. Hier nochmal aufgeschlüsselt: 1 Match = 2500 Runden, 1 Runde = 2 Spiele (jeder Spieler darf einmal anfangen), 1 Spiel = 1000 Punkte. Das ergibt 2500*2*1000 = 5.000.000 Punkte pro Match.