Erstellen Sie das kürzeste Programm, um zu überprüfen, wer in einem n d tic tac toe-Spiel gewonnen hat.
Ihr Programm sollte funktionieren, wenn n
(width) und d
(dimension number) in diesen Bereichen liegen:
n∈[3,6]∩ℕ ie a number from this list: 3,4,5,6
d∈[2,5]∩ℕ ie a number from this list: 2,3,4,5
n = 3; d = 2
(3 2, dh 3 mal 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3 dh 3 mal 3 mal 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2, dh 6 mal 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
Und so weiter.
Gewinnen (Wenn Sie genug mehrdimensionales Tic Tac Toe gespielt haben, ist dies dasselbe.)
Um zu gewinnen, muss ein Spieler alle angrenzenden Felder entlang einer Linie haben. Das heißt, dieser Spieler muss n
Züge auf einer Linie haben, um ein Gewinner zu sein.
Benachbart:
- jedes Plättchen ist ein Punkt; Zum Beispiel (0,0,0,0,0) ist ein Punkt in
d=5
- Benachbarte Kacheln sind solche Kacheln, die beide Punkte auf derselben Einheit d-Würfel sind. Mit anderen Worten beträgt der Chebyshev-Abstand zwischen den Kacheln 1.
- Mit anderen Worten, wenn ein Punkt
p
an einen Punkt angrenztq
, unterscheidet sich jede Koordinate in derp
entsprechenden Koordinateq
darin nicht mehr als um eins. Außerdem unterscheidet sich mindestens ein Koordinatenpaar um genau eins.
Linien:
- Linien werden durch Vektoren und eine Kachel definiert. Eine Linie ist jedes Plättchen, das von der folgenden Gleichung getroffen wird:
p0 + t
<
some vector with the same number of coordinates as p0>
Eingabe :
Die Eingabe erfolgt in STDIN. Die erste Zeile der Eingabe wird zwei Zahlen, sein n
und d
in der Form n,d
.
Danach wird eine Linie aus Koordinaten erstellt, die die durchgeführten Bewegungen angeben. Die Koordinaten werden in Form aufgeführt werden: 1,1;2,2;3,3
. Die obere linke Ecke ist der Ursprung (0,0 für 2D). Im allgemeinen Fall entspricht diese Liste der Stelle, 1,2,...,1,4;4,0,...,6,0;...
an der die erste Zahl die Links-Rechts-Position, die zweite Auf-Ab-Position, die dritte bis dritte Dimension usw. darstellt. Beachten Sie, dass die erste Koordinate die X
erste und die zweite Kurve ist ist O
s erste Runde, ....
Der Eingabe folgt eine neue Zeile.
Ausgabe :
Die Ausgabe erfolgt nach STDOUT. Geben Sie einfach an, wer gewonnen hat, wenn jemand gewonnen hat oder ob es ein Unentschieden ist. Wenn es weder ein Unentschieden noch ein Sieg ist, gib nichts aus.
Geben Sie außerdem an, ob es einen Zugkonflikt gibt, dh, ob sich mindestens zwei Züge an derselben Position befinden.
Wenn vor dem Ende der Eingabe ein Gewinn / Unentschieden stattgefunden hat, kann Ihr Programm tun, was es will.
Testfälle (will jemand noch mehr vorschlagen?):
Eingang:
4,3
0,0,0;1,1,1;1,0,1;2,0,2;0,0,1;2,0,0;2,0,1;3,0,2;3,0,1
Beispielausgabe:
X wins
Eine andere mögliche Ausgabe (Erklärung erforderlich):
1
quelle
n
Züge auf einer Linie erforderlich sind, um ein Gewinner zu sein. (Es tut mir leid, dass ich diese Bemerkungen nicht in der Sandbox gepostet habe, aber ich hatte nicht einmal Zeit, sie dort zu sehen, weil sie so bald nach dem Sandboxen gepostet wurden.)Antworten:
Python,
745578 ZeichenIch habe ein paar Änderungen vorgenommen und es ziemlich verkleinert. Beachten Sie, dass eine Rückgabe von True bedeutet, dass x gewonnen hat, False bedeutet, dass y gewonnen hat, und bedeutet, dass ein ungültiger Zug ausgeführt wurde.
quelle
import *
zuimport*
. Verwenden Sie1
für True und0
für False (EntfernenT
undF
).return -1
kann seinreturn-1
(siehe Leerzeichen entfernen). Benennen Sie Ihre Methoden in einzelne Zeichenmethoden um. Lesen Sie die Tipps für weitere Optimierungen.if l<>q:
stattif not l==q:
.Keine Antwort - Java
Ich war neugierig, wie viele verschiedene Möglichkeiten es gibt, um für ein bestimmtes n zu gewinnen, und schrieb diesen Code, um sie alle aufzulisten.
Ich habe es von Hand auf n getestet, d = 2..3.2..3 und es scheint zu funktionieren ... danach wächst die Anzahl der möglichen Gewinnmöglichkeiten schnell, wie unten gezeigt:
Nachdem ich alle Gewinnsätze generiert hatte, konnte ich das Programm erweitern, um die angegebenen Eingaben mit Gewinnsätzen zu vergleichen, aber natürlich würde diese Methode niemals den Golf gewinnen. Also war ich damit zufrieden, hier anzuhalten - außer es sah so aus, als ob ich eine geschlossene Lösung für die Anzahl der Gewinnmöglichkeiten in Abhängigkeit von n und d finden könnte… Es ist Anzahl der Gewinnmöglichkeiten = 0,5 ((n + 2) ^ d - n ^ d).
quelle
C ++ 794
849ZeichenAusgabe ist: "X" (X gewinnt), "O" (O gewinnt) oder "!" (illegaler Zugversuch).
Dies ordnet nur die Punkte in einem linearen Array zu und überprüft alle möglichen Teilmengen der Größe n, um zuerst bei X oder O konstant zu sein und dann um in einer Linie zu sein. Um zu überprüfen, ob eine Linie vorliegt, werden die Koordinaten der Punkte in jeder Teilmenge einzeln überprüft. Sie müssen entweder von 0 auf n-1 ansteigen, von n-1 auf 0 abfallen oder konstant sein. Die Punkte sind natürlich in der linearen Anordnung angeordnet, daher ist es sinnvoll, eine Koordinate für eine gegebene Menge von Punkten zu erhöhen oder zu verringern.
Vielen Dank an Howard für den Hinweis auf einen schwerwiegenden Fehler in der ersten Version.
Aus Solidarität mit Quincunx muss ich darauf hinweisen, dass es eine Farce wäre, wenn eine C ++ - Antwort gewinnt
quelle
X wins
oderO wins
. Die Ausgabe von1
oder2
(oder einer anderen Variation) ist vollkommen legitim, solange Sie in Ihrer Antwort erklären, wofür sie stehen. Wie gesagt (Hervorhebung hinzugefügt): " Geben Sie an, wer gewonnen hat".