Einführung
Nine Mens's Morris (auch Mills genannt) ist ein Brettspiel für zwei Spieler, das auf dem folgenden Brett gespielt wird (Bild von der verlinkten Wikipedia-Seite):
Jeder Spieler hat 9 Männer, schwarz und weiß gefärbt. Die konkreten Regeln sind für diese Herausforderung nicht wichtig, aber schauen Sie bei Interesse auf der Wikipedia-Seite nach.
Die Herausforderung
Bei einem Gitter als Eingabe, das einen bestimmten Boardstatus darstellt, wird die Gesamtanzahl der Mühlen m
mit ausgegeben 0<=m<=8
.
Drei gleichfarbige Männer bilden eine Mühle, wenn sie sich in einer geraden Reihe miteinander verbundener Punkte befinden. b2
to f2
ist keine Mühle, da die Männer von unterschiedlicher Farbe sind. Auch d2
auf d5
nicht eine Mühle bilden , da die drei Punkte miteinander verbunden werden müssen.
Die Tafel im Bild oben enthält zum Beispiel zwei Mühlen. Eins von f2
bis f6
und eins von e3
bis e5
.
Eingang
Die Tafel wird als 2D-Gitter mit 24 Punkten dargestellt, die wie im obigen Beispielbild dargestellt verbunden sind. In diesem Beispiel werden a-g
für die Spalten die Buchstaben von und 1-7
für die Zeilen die Zahlen von verwendet. Sie können jedoch jedes sinnvolle Eingabeformat auswählen, sofern 24 eindeutige Koordinaten einem der folgenden Zustände zugeordnet werden:
- Leeren
- Aufgenommen von Schwarz
- Aufgenommen von Weiß
Die konkrete Darstellung liegt bei Ihnen. Sie sind nicht auf "b" oder "w" für die Farben beschränkt.
Außerdem enthält Ihre Eingabe möglicherweise keine zusätzlichen Informationen.
Zusätzliche Bemerkungen
- Sie müssen die Punkte nicht durch irgendwelche Werte abbilden. Wenn Sie die Eingabe als 2D-Array verwenden möchten, ist dies ebenfalls in Ordnung. Bedenken Sie jedoch, dass nicht alle darin enthaltenen Punkte verwendet werden und dass Sie die Verbindungen zwischen ihnen berücksichtigen müssen.
- Die Eingabe ist möglicherweise leer. In diesem Fall müssen Sie Null ausgeben (leere Karte -> keine Mühlen).
- Da jeder Spieler 9 Männer hat, enthält die Eingabe niemals mehr als 18 genommene Punkte.
- Sie können leere Punkte in der Eingabe auslassen und daher nur Eingabepunkte, die verwendet werden.
- Der Eingang kann beliebig bestellt werden. Sie können sich nicht auf eine bestimmte Bestellung verlassen.
- Sie können davon ausgehen, dass die Eingabe immer gültig ist. Dies bedeutet, dass es nicht mehr als 9 Männer in jeder Farbe gibt und dass jeder Punkt einzigartig ist.
Regeln
- Stellen Sie klar, welches Eingabeformat Sie in Ihrer Lösung verwenden. Das Bereitstellen eines Beispiellaufs Ihres Programms wird dringend empfohlen.
- Funktion oder Vollprogramm erlaubt.
- Standardregeln für die Eingabe / Ausgabe.
- Es gelten Standardlücken .
- Dies ist Code-Golf , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Vorlage.
Testfälle
Das Eingabeformat ist hier eine Liste von Tupeln mit den Koordinaten wie im obigen Beispiel als erstes Element und dem Zustand des zweiten Punktelements. Ein von Weiß aufgenommener Punkt wird als "w" und ein von Schwarz aufgenommener Punkt als "b" markiert. Alle anderen Punkte werden ausgelassen und sind leer.
[("a4", "w"), ("b2", "b"), ("b4", "b"), ("c4", "b"), ("d1", "w") , ("d2", "w"), ("e3", "w"), ("e4", "w"), ("e5", "w"), ("f2", "b") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b4", "b"), ("c4", "b") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3 [] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8
Viel Spaß beim Codieren!
quelle
d3
undd5
nicht verbunden sind. Die Regeln sagen:Three men of the same color form a mill when they are in a straight row of connected points.
. Ich habe in diesem Abschnitt einige Beispiele hinzugefügt, um dies zu verdeutlichen, danke für den Kommentar!Antworten:
APL (Dyalog Classic) ,
26 bis25 Byte-1 danke an FrownyFrog
Probieren Sie es online!
Das Argument ist ein 3x3x3-Array aus
1
(schwarz),¯1
(weiß) und0
(leer). Die erste Dimension ist die Verschachtelungstiefe der konzentrischen Quadrate. Die anderen beiden Dimensionen liegen entlang der vertikalen und horizontalen Achse.Wir haben eine Mühle, wenn die Summierung entlang einer Achse a
3
oder ergibt¯3
, außer wir müssen die vier Ecken verwerfen, wenn wir entlang der ersten Achse summieren.{}
ist eine Funktion mit implizitem Argument⍵
↓⍵
ist aufgeteilt - in unserem Fall wird ein 3x3x3-Würfel in eine 3x3-Matrix verschachtelter Länge-3-Vektoren umgewandelt⍵⍪↓⍵
Nimmt man den Originalwürfel und klebt die 3x3-Matrix von 3-Vektoren darunter, so erhält man ein 4x3x3-gemischtes Array von Skalaren und Vektoren+/
Summen entlang der letzten Achse; Dies hat den kombinierten Effekt, dass der ursprüngliche Würfel entlang der letzten Achse+/⍵
summiert wird ( ) und entlang der Mittelachse summiert wird, da wir eine Teilung vorgenommen haben (+/↓⍵
).Jetzt müssen wir uns um den Spezialfall für die erste Achse kümmern.
+⌿⍵
summiert entlang der ersten Achse und gibt eine 3x3-Matrix zurück4 2⍴
Aber wir dürfen die Ecken nicht zählen, also formen wir sie in eine 4x2-Matrix wie diese um:Jetzt interessieren wir uns nur für die letzte Spalte (
BDFH
), also verwenden wir das Idiom⊢/
,
verkettet sichBDFH
mit der Matrix, die wir zuvor für die 2. und 3. Achse erhalten haben (BDFH
und die Matrix hat beide zufällig eine führende Dimension von 4)∊
fasst alles, was wir bisher erhalten haben, zu einem einzigen Vektor zusammen|
nimmt die absoluten Werte{ }∩≢
filtert nur die drei - die Länge (≢) der Eingabe ist immer 3≢
zählt siequelle
≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢
ist eine kürzer :)JavaScript (ES6),
276228125117105 Bytes(Das obige enthält einige nicht druckbare ASCII-Zeichen, die hier nicht angezeigt werden. Daher ist hier eine Version ohne die
btoa
, die kopiert und ausgeführt werden kann.)Teilt eine Referenzzeichenfolge in Buchstabentriolen, die mit den Mühlengruppenschlüsseln übereinstimmen. Die Eingabe erfolgt in Form eines Objekts, wobei die Tasten die Buchstaben sind
a-x
, die von links unten bis rechts oben beginnen und sich zuerst von links nach rechts bewegen. Die Werte gelten1
für Weiß,-1
Schwarz und0
Leer.Beispiel
Diese Beispiele stammen aus den Beispielen von OP, die in das Objekt Buchstabenschlüssel und Zahlenwert konvertiert wurden. Die erste stammt aus dem Beispielbild, während die anderen aus dem Beispielsatz stammen.
quelle
atob
.btoa
. Fand auch einige andere Verbesserungen, die es noch mehr nach unten bringen.Mathematica,
217131 BytesIch bin mir zwar sicher, dass dies nicht besonders wettbewerbsfähig ist, aber hier ist ein Eintrag für Sie.
Eingabebeispiel:
Das Zulassen von Koordinatennamen mit einem Zeichen spart trivial 51 Zeichen, was dies zu einer 166-Byte-Lösung macht. Das Benennen der Spieler 1 und 2 anstelle von "w" und "b" spart 17 weitere Charaktere.
So bekommen wir
quelle
1
und aufnehmen können2
. das verwendete Beispielw
undb
, aber ich bin mir ziemlich sicher, dass wir nicht darauf beschränkt sind.APL (Dyalog Unicode) , 50 Byte
"Die Lösung der Objekte"
Sie ist zwar länger (29 Zeichen) als die Lösung von @ ngn , verwendet jedoch einen völlig anderen Ansatz: Die Eingabe hat die gleiche Gesamtstruktur wie diese Lösung, jedoch werden alle Slots als Objekte dargestellt. Leere Slots (einschließlich der nicht vorhandenen mittleren Spalte) müssen leere Objekte sein. Alle schwarzen Männer müssen sich auf das Objekt "Schwarzer Mann" beziehen, und alle weißen Männer müssen sich auf das Objekt "Weißer Mann" beziehen. Alle Objekte können optional schön haben D isplay F orm s Lesbarkeit zu verbessern, so dass die Mittelsäule optional unsichtbar gemacht werden können.
Probieren Sie es online!
+/
die Summe von1=(
...)
diejenigen in≢¨(
…)
Die Zahlen von,
das Gewirbelte∪/
einzigartige Sets über,
verkettet an∪⌿⍤2
einzigartige setzt,(
…)
Verkettet an⊢/
die rechte Spalte von4 2⍴
die, in vier Zeilen und zwei Spalten umgeformt,∪⌿
einzigartige SäulensätzeEin atop- Operator, wie er mit AGL (
ä
) geliefert wird , würde die Länge auf 27 Zeichen reduzieren .quelle