Ich möchte hier eine neue Form des Codegolfs ausprobieren. Ähnlich wie bei Boni müssen nicht alle Teile der Herausforderung abgeschlossen sein, sondern jede Antwort muss eine Teilmenge einer bestimmten Größe implementieren (und es gibt einen Kern, den jede Antwort implementieren muss). Neben dem Golfspielen umfasst diese Herausforderung auch die Auswahl einer Reihe von Funktionen, die gut zusammenpassen.
Die Regeln
Kingdom Builder ist ein Brettspiel, das auf einem (spitzen) Hex-Gitter gespielt wird. Das Board besteht aus vier (randomisierten) Quadranten, von denen jeder 10x10 Hex-Zellen hat (ein Vollboard ist also 20x20). Für diese Herausforderung enthält jede Hex-Zelle entweder Wasser ( W
), einen Berg ( M
), eine Stadt ( T
), eine Burg ( C
) oder ist leer ( .
). So könnte ein Quadrant aussehen
. . W . . . . . . .
. M W W . . . . . .
. M . . W . . . T .
M M . W . . . . . .
. . M . W W . . . .
. . . . . W W W W W
. T . . . . . . . .
. . W . . C . . . .
. . W W . . . . M .
. . . . . . . M M .
Die zweite Reihe ist immer von der ersten Reihe nach rechts versetzt. Spieler 1
auf 4
bis zu 40 Siedlungen jeweils auf leere Zellen (nach einigen Regeln , die wir für diese Herausforderung ignorieren) platzieren. Ein möglicher Spielplan am Ende des Spiels ist der folgende:
3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
. 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
. . . . . W W W W W . 3 C 1 . . 2 2 2 2
. T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
4 . W 4 . C 4 4 . . . . . . 2 M M M M M
. 4 W W . . . 4 M . . W . W . 2 2 2 M M
. . . . . . . M M . . W W . . . . 2 M .
. . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
. . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
. . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
. 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
. . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
Wir werden die Quadranten wie beschriften
1 2
3 4
Ihre Aufgabe wird es sein, ein solches Brett zu punkten. Es gibt eine Kernbewertung, die immer verwendet wird, und 8 optionale Bewertungen, von denen 3 für jedes Spiel ausgewählt werden. † Im Folgenden beschreibe ich alle 9 Punkte und verwende das obige Setup als Beispiel dafür, wie viele Punkte jeder Spieler erhalten würde.
† Es gibt 10 Punkte im eigentlichen Spiel, aber ich lasse zwei weg, weil niemand Golf spielen möchte.
Die Kernbewertung. Ein Spieler erhält 3 Punkte für jeden C
Astle, neben dem er eine Siedlung hat. Beispielnoten: 18, 0, 15, 12.
Die optionalen Punkte.
Ein Spieler erhält 1 Punkt für jede horizontale Reihe, in der er mindestens eine Siedlung hat.
Beispielnoten: 14, 20, 12, 16.
Finden Sie für jeden Spieler die horizontale Reihe, in der sich die meisten seiner Siedlungen befinden (wählen Sie im Falle eines Gleichstands eine aus). Ein Spieler erhält 2 Punkte für jede Siedlung in dieser Reihe.
Beispielergebnisse: 14 (Zeile 16), 8 (Zeile 4, 5 oder 6), 28 (Zeile 11), 10 (Zeile 1).
Ein Spieler erhält 1 Punkt für jede Siedlung, die neben
W
ater gebaut wird.Beispielnoten: 13, 21, 10, 5.
Ein Spieler erhält 1 Punkt für jede Siedlung neben einem
M
Brunnen.Beispielnoten: 4, 12, 8, 4.
Zähle die Siedlungen jedes Spielers in jedem Quadranten. Pro Quadrant erhalten die Spieler mit der größten Anzahl von Siedlungen jeweils 12 Punkte , die Spieler mit der zweitgrößten Anzahl von Siedlungen jeweils 6 Punkte .
Beispielergebnisse: 18 (6 + 0 + 6 + 6), 36 (12 + 12 + 0 + 12), 12 (0 + 0 + 12 + 0), 18 (12 + 6 + 0 + 0).
Bestimmen Sie für jeden Spieler den Quadranten, in dem er die geringste Anzahl von Siedlungen hat. Ein Spieler erhält 3 Punkte für jede Siedlung in diesem Quadranten.
Beispielbewertungen: 18 (Quadrant 2), 0 (Quadrant 3), 15 (Quadrant 1 oder 2), 27 (Quadrant 3).
Ein Spieler erhält 1 Punkt für jede verbundene Siedlungsgruppe.
Beispielnoten: 7, 5, 6, 29.
Ein Spieler erhält 1 Punkt für jeweils 2 Siedlungen in der größten Gruppe zusammenhängender Siedlungen des Spielers.
Beispielnoten: 4, 10, 8, 2.
Die Herausforderung
Wie im Spiel werden Sie 3 der optionalen Punkte auswählen und ein bestimmtes Brett basierend auf dem Kernpunktestand und diesen drei Punkten bewerten. Ihr Code sollte eine Liste mit 4 Ergebnissen erstellen. Es gibt jedoch eine Einschränkung bei der Auswahl: Ich habe die Ergebnisse in drei Gruppen eingeteilt, und Sie müssen für jede Gruppe eine implementieren:
- Implementieren Sie eine von 1 und 2 .
- Implementiere eines von 3, 4, 5 und 6 .
- Implementieren Sie eine der 7 und 8 .
Sie können ein Programm oder eine Funktion schreiben und Eingaben über STDIN, ein Befehlszeilenargument, eine Eingabeaufforderung oder einen Funktionsparameter vornehmen. Sie können das Ergebnis zurückgeben oder an STDOUT drucken.
Sie können ein beliebiges praktisches 1D- oder 2D-Listen- / Zeichenfolgeformat für die Eingabe auswählen. Möglicherweise verwenden Sie kein Diagramm mit vollständigen Informationen zur Nachbarschaft. Hier finden Sie einige gute Informationen zu Hex-Gittern, wenn Sie Inspiration benötigen.
Ihre Ausgabe kann auch in einem beliebigen praktischen, eindeutigen Listen- oder Zeichenfolgenformat erfolgen.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Weitere Annahmen
Sie können davon ausgehen, dass ...
- ... jeder Spieler hat mindestens 1 Siedlung und es gibt nicht mehr als 40 Siedlungen von jedem Spieler.
- ... jeder Quadrant enthält entweder eine Stadt und zwei Burgen oder zwei Städte und eine Burg.
- ... Städte und Burgen sind weit genug voneinander entfernt, so dass keine Siedlung neben zwei von ihnen liegen kann.
Testfälle
Unter Verwendung der obigen Tabelle sind hier die Einzelbewertungen für alle möglichen Auswahlen von Bewertungsmechanismen:
Chosen Scores Total Player Scores
1 3 7 52 46 43 62
1 3 8 49 51 45 35
1 4 7 43 37 41 61
1 4 8 40 42 43 34
1 5 7 57 61 45 75
1 5 8 54 66 47 48
1 6 7 57 25 48 84
1 6 8 54 30 50 57
2 3 7 52 34 59 56
2 3 8 49 39 61 29
2 4 7 43 25 57 55
2 4 8 40 30 59 28
2 5 7 57 49 61 69
2 5 8 54 54 63 42
2 6 7 57 13 64 78
2 6 8 54 18 66 51
quelle
Antworten:
Python 2, 367 Bytes
Das Programm verwendet die Punkte 1, 3 und 7. Die Eingabe ist eine Liste von Zeichenlisten, die jede Zelle darstellen. Um das Beispielboard einfach zu testen, können wir Folgendes tun:
Umgang mit dem Hex-Gitter
Da wir uns in einem Hex-Raster befinden, müssen wir etwas anders mit den Nachbarn umgehen. Wenn wir ein traditionelles 2D-Gitter als Repräsentation verwenden, dann
(1, 1)
haben wir:Bei näherer Betrachtung stellen wir fest, dass die Offsets von der Parität der Zeile abhängen, in der Sie sich befinden. Das obige Beispiel gilt für ungerade Zeilen, aber in geraden Zeilen sind die Offsets
Das einzige, was sich geändert hat, ist, dass die zweite Koordinate des 1., 2., 5. und 6. Paares um 1 verringert wurde.
Die Lambda-Funktion
N
nimmt ein Koordinatenpaar(row, col)
und gibt alle Nachbarn der Zelle innerhalb des Gitters zurück. Das innere Verständnis erzeugt die obigen Offsets, indem es sie aus einer einfachen Basis-3-Codierung extrahiert, die zweite Koordinate inkrementiert, wenn die Zeile ungerade ist, und die Offsets der fraglichen Zelle hinzufügt, um die Nachbarn zu erhalten. Das äußere Verständnis filtert dann und lässt nur die Nachbarn übrig, die sich innerhalb der Grenzen des Gitters befinden.Ungolfed
quelle
def F
nicht eine separate Funktion sein, sondern eine interne Funktion? Kann nichtk
entfernt werdendef F:
?F
ist die Funktion zum Füllen von Fluten und muss aufgerufen werdenJ
, damit die ÜbergabeJ
als Parameter gespeichert werden kann. Du hast aber rechtk
, danke :) (der neue Code sieht jedoch etwas funky aus, da er auf Kurzschlüsse angewiesen ist)Antwortsatzprogrammierung, 629 Bytes
ASP gehört zur Familie der logischen Programmiersprachen, die hier vom Potassco-Framework verkörpert werden , insbesondere Clingo (Grounder Gringo + Solver Clasp). Aufgrund der Paradigmenbeschränkung kann ein gegebenes Board nicht direkt als Ausgabe verwendet werden, sodass eine Vorverarbeitung der Daten erforderlich ist (hier in Python ausgeführt). Diese Vorverarbeitung wird in der Gesamtbytebewertung nicht mitgezählt.
Es ist mein erster Code Golf, und das Ziel ist mehr, eine Sprache zu zeigen, die ich liebe, die ich noch nie zuvor im Golf gesehen habe, als das Spiel wirklich zu gewinnen. Außerdem bin ich kein ASP-Experte, daher können viele Code-Optimierungen mit Sicherheit durchgeführt werden, um Ergebnisse in weniger Bytes zu erzielen.
Wissensrepräsentation
Es gibt den Python-Code, der Board in Atome umwandelt:
Zum Beispiel sind die Atome b (für __b__board) für die erste Zeile des Beispielboards wie folgt:
Wobei b (0,0,3) ein Atom ist, das beschreibt, dass Spieler 3 eine Siedlung bei Koordinaten (0; 0) hat.
ASP-Lösung
Es gibt den ASP-Code mit vielen optionalen Punkten:
Dieses Programm kann mit dem folgenden Befehl gestartet werden:
Und wird nur eine Lösung finden (es ist ein Beweis, dass es nur einen Weg gibt, die Punkte zu verteilen):
Wobei s (7,3,6) besagt, dass Spieler 3 mit der optionalen Punktzahl 7 6 Punkte gewinnt, und s (t, 4,62) besagt, dass Spieler 4 insgesamt 62 Punkte gewinnt (Kern + 1 + 3 + 7).
Einfach zu analysieren, um einen schicken Tisch zu haben!
quelle