Das Taubenschlagprinzip besagt das
Wenn N Artikel in M Felder mit N > M gestellt werden , muss mindestens ein Feld mehr als einen Artikel enthalten.
Für viele hat dieses Prinzip einen besonderen Stellenwert im Vergleich zu anderen mathematischen Aussagen. Wie EW Dijkstra schrieb ,
Es ist von Mystik umgeben. Proofs, die es verwenden, werden oft als etwas Besonderes, als etwas besonders Geniales angesehen.
Die Herausforderung
Der Zweck dieser Herausforderung ist die Veranschaulichung des Pigeonhole-Prinzips anhand von ASCII-Darstellungen. Speziell:
- Nehmen Sie als Eingabe
N
(Anzahl der Elemente) undM
(Anzahl der Felder), mitN
nicht-negativen undM
positiven.N
kann kleiner sein alsM
(auch wenn der Grundsatz in diesem Fall nicht gilt). - Wählen Sie zufällig eine der möglichen Zuordnungen von Elementen zu Feldern aus. Jede Aufgabe sollte mit einer Wahrscheinlichkeit ungleich Null ausgewählt werden.
Erstellen Sie eine ASCII-Grafikdarstellung der Zuweisung wie folgt:
- Es gibt
M
Linien, die jeweils einem Kästchen entsprechen. - Jede Zeile beginnt mit einem Nicht-Leerzeichen wie z
|
. - Nach diesem Zeichen folgt ein anderes Nicht-Leerzeichen, das z. B.
#
so oft wiederholt wird, wie sich Elemente in diesem Feld befinden.
- Es gibt
Betrachten Sie zum Beispiel N = 8
, M = 5
. Wenn die ausgewählte Zuordnung von Elementen zu Feldern " 4
," 1
, " 0
ist 3
, 0
ist die Darstellung"
|####
|#
|
|###
|
Ein anderer Lauf (der zu einer anderen Zuweisung führt) desselben Programms könnte ergeben
|#
|##
|#
|#
|###
Es gibt eine gewisse Flexibilität in Bezug auf die Darstellung; siehe unten.
Spezifische Regeln
Der Code sollte theoretisch für alle Werte von N
und ausgeführt werden M
. In der Praxis kann es durch Einschränkungen der Speichergröße oder des Datentyps eingeschränkt sein.
Da das Beobachten der Ausgabe nicht ausreicht, um zu bestimmen, ob alle Zuweisungen eine Wahrscheinlichkeit ungleich Null haben , sollte jede Einreichung erläutern, wie der Code dies erreicht, wenn nicht offensichtlich.
Folgende Darstellungsvarianten sind zulässig:
- Es kann ein beliebiges Paar verschiedener Zeichen ohne Leerzeichen ausgewählt werden. Sie müssen über die Programmausführungen hinweg konsistent sein.
- 90-Grad-Drehungen der Darstellung sind zulässig. Auch hier muss die Auswahl konsistent sein.
- Nachgestellte oder führende Leerzeichen sind zulässig.
Als ein Beispiel mit einem anderen Darstellungsformat, für N = 15
, M = 6
könnten die Ergebnisse von zwei Ausführungen des Programms sein
VVVVVV
@@@@@@
@@ @@@
@ @@
@
oder
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Ebenso N = 5
, M = 7
könnte geben, eine andere Variation der Darstellung verwendet wird ,
*
* * * *
UUUUUUU
oder
*** **
UUUUUUU
oder
*
* *
* *
UUUUUUU
Beachten Sie, wie das Prinzip in diesem Fall nicht anwendbar ist, weil N
< M
.
Allgemeine Regeln
Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten.
Die Eingabe kann auf jede vernünftige Weise erfolgen . und mit jedem Format, z. B. einem Array aus zwei Zahlen oder zwei verschiedenen Zeichenfolgen.
Ausgabemittel und Format sind ebenfalls flexibel. Die Ausgabe kann beispielsweise eine Liste von Zeichenfolgen oder eine Zeichenfolge mit Zeilenumbrüchen sein. wird als Funktionsausgabeargument zurückgegeben oder in STDOUT angezeigt. Im letzteren Fall ist es nicht erforderlich, sich um Zeilenumbrüche zu kümmern, die durch eine begrenzte Anzeigebreite verursacht werden.
Kürzester Code in Bytes gewinnt.