In wenigen Wochen hat Santa Claus wieder Großeinsatz, und im Moment ist er dabei, die Geschenke herauszusuchen, die er den Kindern in aller Welt bringen will. Für seine nächste Tour möchte er 20 Geschenke zufällig auswählen.
Hierzu sitzt Santa Claus an einem Fließband, auf dem nacheinander die einzelnen Geschenke an ihm vorbeifahren. Santa Claus weiß nicht, wieviele Geschenke insgesamt auf dem Fließband ankommen. Er kann sich 20 Geschenke vom Band herunternehmen, und wenn danach eines kommt, das ihm vielleicht besser gefällt, als eines der 20 bereits ausgewählten, so kann er das schönere vom Band nehmen und das weniger schöne stattdessen zurücklegen.
Um aber nicht seinen persönlichen Geschmack über die Auswahl der Geschenke entscheiden zu lassen, sondern stattdessen eine zufällige und gleichverteilte Auswahl der Geschenke vom Fließband zu erreichen, obwohl die Gesamtzahl der zur Auswahl stehenden Geschenke unbekannt ist, verwendet er den Reservoir algorithm von Alan G. Waterman1. In einer für dieses Übungsblatt etwas angepassten und vereinfachten Form lautet dieser Algorithmus wie folgt:
Um Gegenstände zufällig aus einer Menge unbekannter Größe (wobei gelte) auszuwählen, verwenden wir ein Array der Größe (mit den Einträgen für ).
Und so lautet nun Ihre Aufgabe:
``Um Santa Claus noch rechtzeitig die Auslieferung der Geschenke zu ermöglichen, implementieren Sie doch bitte diesen Algorithmus in Oberon!''
perl -e 'print join(" ", (1..1000))'
Diese Ausgabe können Sie dann via Pipeline Ihrem Programm als Eingabe überreichen.
Aufgrund der positiven Resonanz auf die Logeleien vom letzten Übungsblatt gibt es auf diesem Blatt eine ``Zugabe''. Die Bearbeitung dieser Aufgabe ist freiwillig, wobei die erreichten Punkte natürlich Ihrem Punktekonto gutgeschrieben werden!
Schreiben Sie ein Oberon-Programm, das Ihnen die nachstehende Aufgabe löst:
``Der Page des Königs war frech und vorlaut gewesen, weshalb er bestraft werden sollte. Doch der König, der den Knaben gern hatte, wollte ihm eine Chance geben, sich mit Hilfe seiner Intelligenz aus der Affäre zu ziehen. ``Sieh her, du Bengel'', sagt der König zu dem Pagen, und dabei deutete er auf den Tisch, auf dem zwölf verschlossene Kästen standen, die einen Kreis bildeten, ``einer dieser Kästen ist leer, der diesem im Uhrzeigersinn benachbarte Kasten enthält eine Kugel, der Kasten daneben zwei Kugeln, der nächste drei Kugeln und so fort bis zu dem zwölften Kasten, in dem sich elf Kugeln befinden und neben dem wieder der leere Kasten steht. Du sollst auf einen dieser Kästen zeigen und wirst dann zur Strafe für deine Untat so viele Stockschläge erhalten, wie Kugeln in jenem Kasten sind.''
Der Knabe, der sich gerne Prügel ersparen wollte, entdeckte, dass die Kästen numeriert waren. Von dem Kasten mit der Nummer 0 angefangen, waren sie - wiederum im Uhrzeigersinn - der Reihe nach mit folgenden Zahlen gekennzeichnet:
0, 2, 7, 10, 1, 3, 6, 11, 8, 4, 5, 9
``Darf ich eine Frage stellen?'' begehrte der Page zu wissen. ``Gewiß'', antwortete der König, ``aber nur eine einzige.'' Darauf der Junge: ``Bei wie vielen dieser Kästen stimmt die Zahl der darin enthaltenen Kugeln mit der Nummer des betreffenden Kastens überein?'' Der König: ``Würde ich dir diese Frage beantworten, dann wüsstest du, welcher der leere Kasten ist.'' Nach einigem Überlegen deutete der Page auf den Kasten, in dem sich keine Kugel befand. Welcher war's?''
Ihr Programm sollte die in der Aufgabenstellung genannte Ziffernfolge von der Standardeingabe lesen. Auf diese Weise können Sie auch andere Permutationen ausprobieren. Aber Vorsicht: Nicht alle Permutationen führen zu einer (eindeutigen) Lösung!
Quelle: ``Logeleien von Zweistein'', dtv, 1984
Viel Erfolg!