Das Brettspiel
Im Brettspiel " Carcassonne " platzieren die Spieler Kacheln, indem sie ihre Kanten aufeinander abstimmen, und erzielen die höchsten Punktzahlen, indem sie große, zusammenhängende Geländeflächen erstellen. Das Folgende sind (ungefähr) die Arten und Mengen der im Spiel enthaltenen Kacheln:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
Die Aufgabe
Sie müssen eine Kachel durch Anpassen der Kanten platzieren und gleichzeitig versuchen, die größtmöglichen zusammenhängenden Geländeflächen beizubehalten.
Platzierung
- Spielsteine können nur auf eine der (bis zu 4) freien Stellen neben einem vorhandenen Spielstein (oder vorhandenen Spielsteinen) im Spielbereich gelegt werden.
- Fliesen können um 90, 180 oder 270 Grad gedreht werden.
Kantenanpassung
- Die Kanten einer platzierten Kachel müssen mit den Berührungskanten der (bis zu 4) benachbarten Kacheln übereinstimmen, dh berührende Pixel haben dieselbe Farbe.
Angrenzendes Gelände
- "Schließen eines Geländebereichs" bezieht sich auf das Platzieren einer Kachel, sodass ein zusammenhängender Farbbereich nicht mit weiteren Kachelplatzierungen fortgesetzt werden kann.
- Wenn eine alternative Platzierung möglich ist, muss sie über jeder Platzierung von Kacheln ausgewählt werden, die einen Geländebereich schließen würde.
- Wenn Sie zwischen mehreren Abschlussplatzierungen wählen müssen, wählen Sie eine beliebige. Wenn Sie zwischen mehreren nicht abschließenden Placements wählen müssen, wählen Sie eines aus.
- Ignorieren Sie # ff00ff (die Eckpixel), wenn Sie zusammenhängende Bereiche berechnen. Ignorieren Sie auch Gebäude, dh Farbbereiche, die bereits vollständig von einer Fliese umschlossen sind.
Eingang
Die Eingabe besteht aus zwei Bildern:
Der Spielbereich.
- Der anfängliche Spielbereich besteht aus einem Plättchen
#11
(einem einzelnen Plättchen). - Der als Ausgabe erstellte erweiterte Wiedergabebereich muss auch als Eingabe unterstützt werden.
- Der anfängliche Spielbereich besteht aus einem Plättchen
Die zu platzierende Kachel.
- Alle Beispielkacheln müssen als Eingabe unterstützt werden.
Bestimmen Sie übereinstimmende Kanten / zusammenhängendes Gelände nur anhand dieser Bilddaten. Keine Hardcodierung.
Ausgabe
- Die Ausgabe ist ein Bild, das den resultierenden Spielbereich nach dem Platzieren der Kachel zeigt.
- Das Bild muss mit Ihrem eigenen Programm kompatibel sein, dh es kann als Spielbereichseingang verwendet werden.
- Wenn es nicht möglich ist, eine Kachel zu platzieren, wird ein Fehler zurückgegeben.
Das können Sie annehmen
- Fliesen haben immer eine Größe von 55 x 55 Pixel
- In Kacheln werden immer nur die Farben angezeigt, die derzeit in den Beispielkacheln verwendet werden.
Anmerkungen
- Ihre Antwort muss nach mindestens 2 Durchgängen eine Beispielausgabe enthalten (mehr wird empfohlen).
- Dies ist eine teilweise und ungenaue Wiedergabe des ursprünglichen Brettspiels. Sie müssen keine der hier nicht genannten Regeln oder Taktiken anwenden.
Ergebnis
- Ihre Punktzahl ist die Byteanzahl Ihrer Übermittlung.
- Bilddaten sind in Ihrer Partitur nicht enthalten.
- Die niedrigste Punktzahl gewinnt.
Ein vollständiges Spiel spielen
Möglicherweise möchten Sie ein Skript schreiben, das Ihre Vorlage verwendet, um ein vollständiges Spiel zu spielen, das aus folgenden Elementen bestehen kann:
- Platzieren einer Kachel, die pseudozufällig aus dem vollständigen Satz von 85 ausgewählt wurde.
- Bringen Sie das Plättchen zum Set zurück, wenn es nicht platziert werden kann.
- Wiederholen, bis alle Kacheln platziert wurden - oder bis zwei Kacheln in einer Reihe nicht mehr platziert werden können.
Es wird nicht in Ihre Byteanzahl einbezogen oder Ihre Punktzahl verbessert, aber ich werde wahrscheinlich eine Prämie für diese Art von Antwort anbieten.
Antworten:
Perl 5 mit PerlMagick:
875 789763Ich habe die Zeile beginnend mit nicht gezählt, mit
sub w
der Positionen auf dem Abstand zum Zentrum sortiert werden, um kompakte Lösungen zu bevorzugen (die jetzt ordnungsgemäß funktionieren). In dieser Version wird das Schließen wie gewünscht vermieden, aber ich finde das Gegenteil interessanter und spielerischer. Um dies zu erreichen, ändern Sie die Zeile$s=$t if!grep...
in$s=$t if grep...
.Verbrauch:
perl car.pl board.png tile.png
. Ergebnis gespeichert incar.png
. Der Beendigungsstatus ist 1, wenn die Kachel nicht platziert werden konnte.Skript zum Ausführen eines vollständigen Spiels. Es wird davon ausgegangen, dass sich der obige Code in der Datei befindet
car.pl
und die Kacheln imtiles
Verzeichnis mit dem Namen "01.png
to" gespeichert sind25.png
.Das läuft jetzt ziemlich langsam. 8-12 Minuten auf meiner Maschine. Beim Schließen bevorzugt: Beim Schließen vermieden (beachten Sie, dass nichts geschlossen ist).
quelle
Common Lisp,
26502221199211861111 BytesUpdate: "Leichtes" Golfen jetzt erledigt, weitere Gewinne erfordern größere Änderungen.Update 2: Da die Konkurrenz immer härter wird, werden in der neuen Version keine Positionen im aktuellen Spielfeldrechteck mehr bevorzugt (das wären 57 Byte mehr). Diese Option sowie eine einfache Geschwindigkeitsoptimierung sind in der herunterladbaren Version mit dem Simulator standardmäßig aktiviert, in der folgenden offiziellen Antwort jedoch nicht.Update 3: Kleinere Änderungen an der Benutzeroberfläche, um die Anzahl der Hauptbytes zu erhöhen.
Ich habe auch eine einfache Web-Benutzeroberfläche erstellt. Das Gesamtpaket (eine einzelne LISP-Datei und die Kachelbilder) kann sein heruntergeladen werden . Um zu versuchen, installieren
hunchentoot
,zpng
undpng-read
mit quiclisp, Last incarcassonne.lisp
, und eine Verbindung zulocalhost:8080
. Der Code wurde unter CCL / Windows und SBCL / Linux getestet. Die oben genannten Bibliotheken werden nur für den UI / Simulator-Teil benötigt; Die Lösung selbst ist ANSI Common Lisp.Alle Zeilenvorschübe und Zeilenabstände sind nur für kosmetische Zwecke gedacht, um die Lesbarkeit zu gewährleisten, und werden nicht in die Gesamtsumme eingerechnet.
Sie sollten die Funktion
c
mit zwei Argumenten aufrufen : dem aktuellen Spielfeld und dem zu platzierenden Plättchen. Beide sollten 2D-Arrays sein. die Kachel 55x55 und das Feld ein Vielfaches davon. Zusätzlich muss das Feldarray einstellbar sein. Die Funktion gibt eine Liste mit zwei Elementen mit dem neuen Feld als erstem Argument zurück. Das zweite Element ist,NIL
wenn die Kachel nicht platziert werden kann, oder eine Liste, die die Koordinaten oben links und die Drehung der neuesten Kachel in diesem Array sowie die Punktzahl für diese Kachel enthält. Diese Informationen können zu Visualisierungszwecken verwendet werden.Beachten Sie, dass Sie in weiteren Aufrufen das neue Feld verwenden müssen, das von zurückgegeben wird,
c
auch wenn das zweite Listenelement istNIL
(das ursprüngliche Array wurde möglicherweiseadjust-array
bearbeitet und damit ungültig gemacht).Der Code ist jetzt etwas langsam, die Optimierung der Bytezahl führt zu redundanten Berechnungen. Das folgende Beispiel wurde in ungefähr drei Minuten auf meinem System ausgeführt.
Beispiellauf für alle 85 Kacheln:
Screenshot der Weboberfläche:
quelle
DarkBASIC Pro:
207819321744 BytesUPDATE: Nur mehr Golfaufwand
UPDATE: Entspricht jetzt vollständig der Spezifikation, einschließlich der Bevorzugung nicht abschließender Auswahlmöglichkeiten.
Ich habe mich für DarkBASIC entschieden, weil es zwar ziemlich ausführlich ist, aber einen äußerst unkomplizierten und einfachen Befehlssatz für die Bearbeitung von Bildern bietet.
Ich habe eine EXE-Datei für Personen hochgeladen, die nicht über den DarkBASIC-Compiler verfügen ( Windows ) .
quelle