to see the ACM logo, enable the display of images

International Collegiate Programming Contest

Erste Runde: University of Ulm Local Contest

Freitag, 2009.07.17, Linux-Pool O27

1. Überblick

Die Association for Computing Machinery (ACM), die größte Informatikervereinigung der Welt, veranstaltet jährlich eine Programmierweltmeisterschaft für Studenten. Hierzu werden zunächst lokale, dann regionale Wettbewerbe ausgetragen. Die besten der Welt treffen schließlich bei den World Finals im Frühjahr 2010 in Harbin, China aufeinander.

Im November 2009 findet in Nürnberg der ACM Northwestern European Regional Programming Contest statt, an dem Universitäten aus Belgien, Dänemark, Deutschland, Finnland, Großbritannien, Irland, Island, Luxemburg, den Niederlanden, Norwegen und Schweden teilnehmen werden. Die Uni Ulm, die sich 1996-2004 neunmal hintereinander für die WM qualifizierte, sucht auch dieses Jahr wieder 12 Top-Programmierer, aus denen dann unsere drei Teams für den Regional Contest gebildet werden. Deswegen wird am Freitag, den 17. Juli 2009 ein universitätsinterner Programmierwettbewerb stattfinden.

Teilnehmen können alle Studenten der Universität Ulm, die das Diplom noch nicht abgeschlossen haben und bis Ende 2009 in Ulm bleiben werden. Insbesondere sind Studenten der ersten beiden Semester eingeladen, am Wettbewerb teilzunehmen (es kostet nichts - ist aber nicht umsonst, traut Euch :-)

Hier folgt eine Zusammenfassung der wichtigsten Rahmenbedingungen:

AustragungsortO 27, Linux-Pool
Datum und UhrzeitFreitag, 17. Juli 2009, 13:00 Uhr
Wettbewerbsdauer5 Stunden
Umfang8 Aufgaben
BetriebssystemLinux
erlaubte ProgrammiersprachenANSI C, C++, Java, (Free) Pascal, Haskell
eingesetzte Compilergcc, g++, javac, ppc386, ghc
verwendbare Texteditorenvi, emacs, xemacs, nedit, joe, ...
erlaubte HilfsmittelBücher, Skripte, Referenzen, Listings, man-pages
verbotene Hilfsmittelelektronische Geräte, Datenträger, (Netzwerk-)Kommunikation

Im Prinzip simulieren wir damit den Regional Contest so genau wie möglich. Der Hauptunterschied ist, daß der Ulmer Wettbewerb ein Einzelwettbewerb ist. Für den Regionalwettbewerb werden wir aus den Bestplazierten drei Teams bilden, wobei Team 3 grundsätzlich für Studenten aus dem 1.-3. Semester reserviert ist.

2. Aufgaben

Es wird 8 Aufgaben aus verschiedenen Bereichen der Informatik geben. Bereiche, die möglicherweise dabei sein werden, sind:

Bereich Beispielprobleme
Backtracking 8-Damen-Problem
Springertour auf Schachbrett
Graphenprobleme Kürzeste Route zwischen 2 Städten finden, wobei eine Landkarte gegeben ist
Testen, ob ein gegebener gerichteter Graph einen Zyklus enthält
Computational Geometry Bestimmen, ob sich zwei gegebene Strecken schneiden oder nicht
Konvexe Hülle eines Polygons bestimmen
Dynamisches Programmieren Optimale Klammerung einer Kette von Matrixmultiplikationen A1 * A2 * ... * An, so daß die Anzahl der elementaren Multiplikationen minimiert wird
Zahlentheorie Summe aller echten Teiler einer gegebenen Zahl berechnen
Alle Primzahlen p mit a <= p <= b ausgeben
Parser/Compilerbau Auswertung eines arithmetischen Ausdrucks, z.B. Eingabe: "4+3*(7-2)", Ausgabe: 19

Schaut Euch am besten mal die Aufgaben vom letzten Jahr an. Die Aufgabenstellung erfolgt in englischer Sprache. Alle sind nach dem folgenden Muster zu lösen:

Die Aufgaben sind nicht nach Länge oder Schwierigkeitsgrad geordnet. Wir empfehlen: lest Euch am Anfang alle Aufgaben durch (oder zumindest bis Ihr denkt, Ihr habt eine hinreichend einfache gefunden) und werft gelegentlich einen Blick auf die aktuellen Ranglisten (wurde eine Aufgabe bereits von vielen gelöst, ist sie vielleicht einfach).

3. Lösung der Aufgaben

Zu jeder Aufgabe (bzw. zu so vielen wie in 5 Stunden eben möglich) soll ein Programm geschrieben werden, das diese Aufgabe löst. Bevor Ihr eine vermeintliche Lösung an die Jury einsendet, solltet Ihr sie mit dem Sample-Input testen und Eure Ausgabe mit dem Sample-Output vergleichen. Der Befehl compile dateiname übersetzt Euer Programm indem es anhand der Dateiendung den passenden Compiler aufruft:

Dateiname Compiler Version
*.c gcc -Wall -g -lm -O3gcc 4.3.3
*.cc *.cpp *.Cg++ -Wall -g -lm -O3g++ 4.3.3
*.java javac Sun JDK 1.6
*.p *.pas ppc386 -vew -g -O2 Free Pascal 2.2.2
*.hs ghc -Wall -O ghc 6.8.2

Das compile-Skript erstellt eine ausführbare Datei mit demselben Namen wie das Programm ohne Endung bzw. im Falle von Java eine Datei name.class, die mit dem Befehl java name ausgeführt werden kann. Die Jury verwendet dasselbe compile-Skript wie Ihr. Ihr solltet den Compiler nicht manuell aufrufen sondern nur mit dem compile-Skript, da nur dann garantiert ist, daß dasselbe passiert wie später bei der Jury (die z.B. das Skript kurzfristig ändern kann).

Wer glaubt, sein Programm sei korrekt, der schickt es an die Jury. Die Jury compiliert das Programm, testet es dann mit (geheimen) Beispieleingaben und schickt schließlich eine der folgenden Meldungen zurück:

Meldung Bedeutung
CTE (Compile-Time Error) Die Übersetzung mit dem compile-Skript war nicht erfolgreich. Sollte eigentlich nicht vorkommen...
TLE (Time-Limit Exceeded) Das Programm wurde ausgeführt, terminierte aber nicht innerhalb der vorgegebenen Zeitschranke, die standardmäßig 10 Sekunden beträgt. Die Jury wird mit der 10-Sekunden-Schranke großzügig umgehen (vor allem bei Java- und Haskell-Programmen). Wenn dies vorkommt, heißt es, daß Euer Programm in eine Endlosschleife geraten ist, oder daß Euer Algorithmus eine zu hohe Komplexität hat.
RTE (Runtime Error) Das Programm terminierte nicht mit Rückgabewert 0. Dies ist normalerweise ein Laufzeitfehler. Es ist möglich, künstliche Laufzeitfehler zu erzeugen, z.B. in C mit return 1 oder assert(...). Division durch 0 oder ähnliches erzeugt nicht unbedingt Laufzeitfehler (wir übernehmen keine Garantie).
WRA (Wrong Answer) Die Ausgabe des Programms für die Eingabedatei der Jury ist fehlerhaft. Die Eingabedatei der Jury ist größer als der Sample-Input und überprüft auch Fälle, die der Spezifikation entsprechen, an die Ihr vielleicht nicht gedacht habt. D.h. eine korrekte Abarbeitung des Sample-Input ist notwendig, aber nicht hinreichend für eine korrekte Lösung.
PRE (Presentation Error) Die Ausgabe des Programms für die Eingabedatei der Jury ist inhaltlich richtig, genügt jedoch Forderungen der Problemstellung nach spezieller Formatierung nicht (zuviele/zuwenige Leerzeichen/-zeilen, falsche Texte, Groß-/kleinschreibung nicht beachtet, etc). Wenn Ihr Eure Ausgabe so erzeugt, wie der Sample-Output auf der Problemstellung, sollte es keine Probleme geben. Erzeugt keine unnötigen Leerzeilen und Leerzeichen, es sei denn sie sind explizit verlangt.
ACC (Accepted) Problem gilt als gelöst, Gratulation! Für jedes gelöste Problem bekommt Ihr einen Luftballon an den Monitor geklebt. Jede Aufgabe hat ihre eigene Farbe. Wenn sich also die Luftballons in Eurer Umgebung häufen, solltet Ihr zusätzlich motiviert sein...
CRV (Contest-Rule Violation)Ein Verstoß gegen die Regeln des Wettbewerbs kann mehr oder weniger harmlos sein. Die eingereichten Programme müssen u.a. den folgenden Kriterien genügen:
  • Euer Programm muß den Namen haben, der in der Aufgabenstellung spezifiziert ist.
  • Genau 1 Datei, deren Name in der Aufgabenstellung genannt ist, darf zum Lesen geöffnet werden.
  • Keine Datei darf zum Schreiben geöffnet werden.
  • Alle Ausgabe muß nach stdout gehen, Ausgabe nach stderr führt unter Umständen zu RTE.
  • Nur bestimmte Funktionen der Laufzeit-Bibliothek dürfen verwendet werden. Beispielsweise sind in C nur diejenigen aus den folgenden Headerdateien erlaubt: assert.h, ctype.h, math.h, stdio.h, stdlib.h, string.h. In C++ kommen zusätzlich die Headerdateien der STL hinzu.
  • Keine sonstige Kommunikation mit dem Dateisystem, dem Rechner oder dem Netzwerk ist erlaubt (z.B. Aufruf fremder Programme, Multithreading oder Versenden von Mails aus dem Programm heraus).
Für Beispiele von Programmen, die nicht zu CRV führen, schaut Euch die Musterlösungen zu den Aufgaben der vergangenen Jahre an. Alle Aufgaben dieses Jahr werden ähnlich zu lösen sein. Wenn Ihr Zweifel habt, ob irgendeine Funktion verwendet werden darf, fragt die Jury. Die Jury entscheidet über die Konsequenzen einer CRV.

Die Jury bewertet nach dem Kriterium, das ihr als erstes auffällt. Der Unterschied zwischen TLE, WRA und PRE ist leider etwas fließend. Fehlerhafte Submissions, d.h. alle außer ACC, bringen 20 Minuten Zeitstrafe (aber nur, wenn das Problem letztendlich gelöst wurde). Um ein ACC zu erreichen könnt Ihr soviele Submissions machen, wie Ihr wollt. Wir empfehlen spätestens nach der 10. fehlerhaften Submission zur selben Aufgabe ein neues Problem anzufangen.

Neben dem Abschicken einer Lösung könnt Ihr während des Wettbewerbs per e-mail Fragen in englischer Sprache an die Jury stellen. Wir werden Fragen wie "Is the algorithm XYZ correct for problem Q?" oder "Does the jury-input contain such-and-such test-cases?" nicht sinnvoll beantworten. D.h. fragt nur, wenn Ihr denkt, daß Ihr einen Fehler in der Aufgabenstellung gefunden habt. Im Zweifelsfall gilt: Macht keine Annahmen, die in der Aufgabenstellung nicht spezifiziert sind. Fragen von allgemeinem Interesse werden mit einer Antwort an alle bedacht. Kommunikation unter den Teilnehmern ist nicht erlaubt (und das meinen wir ernst).

4. Hilfsmittel

Erlaubte Hilfsmittel sind im wesentlichen alles nicht-elektronische. Insbesondere sind Taschenrechner nicht erlaubt (Ihr habt ja einen großen). Wir können die folgenden Hilfsmittel empfehlen: Im Zweifelsfall bitte vorher uns fragen. Es wird während des Wettbewerbs keinen Internet-Zugang geben und Ihr könnt auch nicht auf Eure üblichen Accounts zugreifen. Jedoch sind während des Wettbewerbs einige Referenzen, Ranglisten und Statistiken online verfügbar. Aus der Rangliste kann man (nach einiger Zeit) Aussagen über den Schwierigkeitsgrad der Aufgaben treffen.

5. Zeitlicher Ablauf am 17. Juli 2009

Ab 9:45 Uhr wird der Linux-Pool für die Practice-Session geöffnet. Hier könnt Ihr Euch schon mal mit der Umgebung vertraut machen, die Rechner ausprobieren und ein paar (kleinere) Aufgaben lösen. Die Jury wird da sein, Eure Programme bewerten und Fragen beantworten. Schaut bitte auf jeden Fall kurz vorbei, damit wir Euch einen Platz zuordnen können und damit es beim Wettbewerb keine Überraschungen gibt. Apropos Überraschungen: Ein ernsthafter Blick auf die Aufgaben und Lösungen vom letzten Jahr schadet auch nicht.

Um 12:15 Uhr wird der Linux-Pool geschlossen. Die Rechner werden für den Wettbewerb initialisiert, d.h. Eure Verzeichnisse werden gelöscht. Anschließend, etwa um 13:00 Uhr (aber nicht früher) geht es los.

Der Wettbewerb dauert dann genau 5 Stunden. Kurz vor Ende des Wettbewerbs kann es sein, daß die Jury viel zu tun hat und Ihr deswegen nicht mehr während des Wettbewerbs Antworten auf Eure Submissions bekommt. Es gilt:

Wenn die Jury also verkündet "Der Wettbewerb ist zu Ende!", macht es keinen Sinn noch irgendwas am Rechner zu machen. Laßt die Jury in Ruhe zu Ende bewerten, Eure Programme gehen nicht verloren und alles wird archiviert.

6. Rangliste

Die Rangliste wird wie folgt ermittelt. Erstes Kriterium ist die Anzahl gelöster Aufgaben. Haben mehrere Teilnehmer gleichviele Aufgaben gelöst, wird für jeden eine akkumulierte Zeit berechnet. Für jedes gelöste Problem wird die Submission-Zeit der korrekten Lösung genommen + Anzahl fehlerhafter Submissions * 20 Minuten. Diese Zeiten werden aufaddiert und ergeben die akkumulierte Zeit. Kürzere akkumulierte Zeit ist besser (aber denkt daran: mehr Aufgaben ist noch besser). Hieraus ergibt sich sofort, daß es geschickter ist, mit den leichteren Aufgaben zu beginnen.

Erfolgreiche Teilnehmer erhalten eine Urkunde und für die drei Bestplazierten gibt es Medaillen. Der Sieger erhält außerdem einen Pokal.

Die endgültige Rangliste ist ein Anhaltspunkt für die Team-Zuordnung für unsere Teilnahme am südwesteuropäischen Regionalwettbewerb im November in Nürnberg. Wir planen zwar damit, daß wir auch diesmal mit 3 Teams teilnehmen können, wissen das aber noch nicht genau (das hängt davon ab, wieviele Plätze dort zur Verfügung stehen und wieviele Teams von anderen Unis dort teilnehmen werden). Ein Team besteht aus drei Programmierern und einer Reserve. Das Team 3 ist grundsätzlich für Studenten aus dem 1.-3. Semester reserviert, während die Teams 1 und 2 für Studenten bis zum 9. Semester offen sind. (Letzteres ist eine Vorgabe für den Regionalwettbewerb - hier in Ulm dürfen auch Studenten aus höheren Semestern teilnehmen.) Der Coach stellt die Teams im Einvernehmen mit den Bestplazieren des Lokalwettbewerbs auf. Bis auf die eben erwähnten Beschränkungen sieht das üblicherweise so aus:

Diese Zuordnung ist lediglich ein erster Anhaltspunkt für die mögliche Teamzusammensetzung. Es kann jeder bei unserem Training zum Regional Contest mitmachen und bei der Aufstellung der Teams werden eigener Einsatz und Fortschritte berücksichtigt.

7. Tips zur Vorbereitung

Die beste Vorbereitung besteht darin, Probleme vergangener ACM-Wettbewerbe zu lösen, um eine Vorstellung von der Art der Aufgaben zu bekommen. Die Aufgaben aller Ulmer Local Contests sind verfügbar. Für angehende Teilnehmer, die bereits etwas mehr üben wollen, können Valladolid Programming Contest Problem Archive and Online Judge und Sphere Online Judge empfohlen werden.

Hier sind ein paar Seiten, die Euch als Implementation für häufig vorkommende Algorithmen dienen können:

Um Einfluß auf die Wahl der Programmiersprache zu nehmen, hier einige Kommentare zu den erlaubten Sprachen: Grundsätzlich sind alle gestellten Aufgaben in allen Sprachen lösbar - schließlich geht es ja um die Algorithmen und nicht um die Programmiersprachen. Bei manchen Problemen macht man sich das Programmieren durch die Wahl einer geeigneten Sprache leichter.

Empfohlene Literatur zur Vorbereitung und im Wettbewerb:

Fragen aller Art (Contestablauf, Programmiersprachen, Aufgaben) könnt Ihr jederzeit an Simon Gog schicken. Oder löchert einfach jemanden den Ihr kennt und der schon mal teilgenommen hat.

Viel Erfolg!


Letzte Änderung 2009.06.02, Walter Guttmann