Eine Gruppe von Dominosteinen besteht aus Kacheln mit zwei Zahlen, sodass jede Kombination von ganzen Zahlen von 0 bis N dargestellt wird. Die folgenden Beispiele beziehen sich der Einfachheit halber auf N = 6, aber auch N = 9 und N = 12 sind üblich. Die Ausrichtung der Fliesen spielt keine Rolle (sie sind in der Regel mit Punkten statt Ziffern gedruckt), so [1-6]
und [6-1]
bezieht sich auf die gleichen Fliesen, von denen nur eine in einem Satz ist.
Bei den meisten Spielen mit Dominosteinen fügen die Spieler abwechselnd Dominosteine zu einer Linie der bereits auf dem Tisch gespielten hinzu, sodass eine der Zahlen auf dem neuen Dominostein neben derselben Zahl an einem Ende der Linie auf dem Tisch platziert wird. Sie können also [2-5]
an jedem Ende einer vorhandenen Zeile ein [2-3][3-3][3-5]
, produzierendes [5-2][2-3][3-3][3-5]
oder ein hinzufügen[2-3][3-3][3-5][5-2]
.
Viele solcher Spiele erfordern "Doppel", Dominosteine mit zwei der gleichen Anzahl, um senkrecht zu den anderen mit ihnen verbundenen Dominosteinen platziert zu werden. Abgesehen von der Wertung, um die es uns hier nicht geht, hat dies keine Auswirkung, außer wenn ...
Viele dieser Spiele erlauben es dann der "Linie", einige oder alle Doppel zu teilen. Five Up ist ein solches Spiel, bei dem die Linie bei jedem Double in 3 neue Linien zerfallen kann, sodass an allen vier Seiten eines Double möglicherweise ein passender Domino angebracht ist.
Hier ist ein Beispiellayout von Dominosteinen aus einer "Doppel 6" in einem Five Up-Spiel (wobei A | B oder AB ein einzelner Dominostein ist):
4
-
0
3|0 0|0 0|2
0
-
1
4|1 1|1 1|6
3
1 -
- 6
5
6
6|5 5|5 5|0 0|6 - 6|2 2|1
6
5
- 6
4 -
4
Ihre Aufgabe ist es, eine Liste der Dominosteine in der Reihenfolge zu erstellen, in der sie der Tabelle hinzugefügt wurden, und festzustellen, ob diese Reihenfolge ein legales Spiel von Five Up darstellt oder nicht.
Sie können ein ganzes Programm schreiben, das Eingaben von stdin übernimmt, oder eine Funktion, die Eingaben als einen oder mehrere Parameter verwendet.
Kanonische Eingabe wäre eine Liste oder ein Array von zwei Tupeln von ganzen Zahlen. Eine Liste von Listen, ein Array von Arrays, ein Vektor von Tupeln usw. sind alle gültigen Formen, in denen Eingaben vorgenommen werden können, wie eine Zeichenfolge, die eine der oben genannten darstellt, oder mehrere Zeichenfolgen. Die Eingabe enthält nur Paare nicht negativer Ganzzahlen, gültige Dominosteine.
Die Ausgabe sollte für gültige bzw. ungültige Spiele ein wahrer oder falscher Wert sein.
Ihr Code sollte beliebig große Domino-Zahlen akzeptieren, die den maximalen Ganzzahlwerten Ihrer Sprache entsprechen.
Beispiele:
0-6
ist gültig, wie jedes andere einzelne Domino0-6 6-0
ist nicht gültig, es gibt nur einen0-6
Domino in einem Set6-6 6-5 5-3 3-0
ist gültig, eine einfache lineare Anordnung6-6 6-5 3-0 5-3
ist nicht gültig, es gibt kein3
oder0
im Spiel, mit dem sich der dritte Domino vor dem5-3
Spielen verbinden kann1-1 1-2 1-3 1-4 1-5 1-6
ist nicht gültig, alle vier offenen1
Enden sind aufgebraucht und lassen nirgendwo die Verbindung1-6
1-1 1-2 1-3 1-4 1-5 3-6 1-6
ist gültig, die 3-6 verbindet sich mit der 1-3, dann kann die 1-6 mit der 3-6 verbinden5-5 5-4 5-0 0-6 6-6 6-4 6-2 2-1 6-3 5-1 1-1 1-6 4-1 1-0 0-0 2-0 3-0 0-4
ist gültig, das oben abgebildete Beispiel12-12 12-1 3-12 3-1 1-2 3-3
ist gültig, verwendet größere Dominosteine und hat eine mehrdeutige Platzierung
HINWEIS: Die hier erforderliche Funktion ist keine perfekte Überprüfung für gültige Five Up-Spiele. Wir ignorieren hier die Regeln, nach denen Domino zuerst gespielt wird, was mehr Informationen über die Variante des Spiels und die Anzahl der Spieler erfordern und eine signifikante Minderheit der Eingaben disqualifizieren würde.
Antworten:
Haskell ,
188174168 BytesProbieren Sie es online aus! Anwendungsbeispiel:
f [[6,6],[6,5],[5,3],[3,0]]
AusbeutenTrue
.Ungolfed:
Probieren Sie es online aus!
quelle
R , 224 Bytes
Probieren Sie es online aus!
Der Code empfängt die Teile als geordnete Liste und gibt TRUE oder FALSE gemäß den Spezifikationen zurück. Die Funktion scannt rekursiv jedes Stück, fügt das Stück einem Index hinzu, um das Fehlen von Duplikaten zu überprüfen, und verfolgt die verfügbaren Einfügepunkte, um zu überprüfen, ob das Stück effektiv zum Stapel hinzugefügt werden kann. Die Handhabung von Stückverbindungen (z. B. Anbringen eines 1-2 durch das 1 oder durch das 2) erfolgt auf gierige Weise, so dass es nicht völlig unmöglich ist, dass einige seltsame Konfigurationen explodieren.
quelle
6-6 6-3 6-2 2-3
Sie, dass Sie in der Lage sein müssen, dies mit2-_
oder als3-_
nächstes zu handhaben, da das2-3
an beiden Enden platziert werden könnte.