Bei dieser Herausforderung musst du "Kreaturen" im Kachelspiel Palago zählen.
Eine Kreatur ist jede geschlossene Form, die durch farblich passende Palago-Kacheln in einem sechseckigen Raster geformt werden kann.
Das Spiel Palago besteht aus folgenden Teilen:
Diese Kacheln können um , oder gar nicht gedreht und an einer beliebigen Stelle in einem sechseckigen Raster platziert werden. Zum Beispiel ist hier eine (rote) Kreatur, die 12 Steine benötigt.
Herausforderung
Ziel dieser Herausforderung ist es, ein Programm zu schreiben, das eine Ganzzahl n
als Eingabe verwendet und die Anzahl der Kreaturen (bis zur Drehung und Reflexion) berechnet, für die n
Kacheln erforderlich sind. Das Programm sollte in der Lage sein zu handhaben bis zu n=10
auf TIO . Das ist Code-Golf , also gewinnen die wenigsten Bytes.
Beispieldaten
Die Werte sollten mit den Daten im Abschnitt "Creature Counts and Estimates" auf der Website des Erstellers übereinstimmen . Nämlich
n | output
---+-------
1 | 0
2 | 0
3 | 1
4 | 0
5 | 1
6 | 1
7 | 2
8 | 2
9 | 9
10 | 13
11 | 37
12 | 81
quelle
n=10
TIO unterstützen." - Wenn dies eine Anforderung für die Ausführungsgeschwindigkeit ist, verwenden Sie bitte Code-Challenge anstelle von Code-Golf . Letzteres bezieht sich auf eine reine Byte-Optimierungsaufgabe.Antworten:
JavaScript (Node.js) ,
480417 Byte-63 Bytes dank @Arnauld. Beeindruckend.
Probieren Sie es online!
Erstens ein Dank an Arnauld, dessen Antwort mir die Inspiration gab, tiefer zu graben. Ich habe mich sehr bemüht, mit meinen Algorithmen originell zu sein, obwohl ich absichtlich einen Teil meines Codes geändert habe, um dieselben Variablen wie Arnauld zu verwenden, damit der Code einfacher verglichen werden kann.
Suche nach leeren Feldern
Die Suche nach Kreaturen ist:
Die Suche nach leeren Feldern ergab eine interessante Symmetrie. Arnauld entdeckte, dass eine der sechs Richtungen ignoriert werden kann, aber tatsächlich können drei von sechs ignoriert werden!
Hier ist Arnauld's ursprüngliche Richtung und der Kachelschlüssel:
Stellen Sie sich vor, wir beginnen bei Kachel A vom Typ 1 am blauen Punkt. Es scheint, dass wir in d = 0 und d = 5 rekursieren müssen. Unabhängig davon, welches Plättchen in d = 0 platziert ist, wird es mit Sicherheit einen Ausgang in d = 4 haben, der dasselbe Feld wie der Ausgang in A in d = 5 aufsucht. Das ist Arnauld's Entdeckung und es hat mich zum Nachdenken gebracht.
Beachte das:
Jedes Plättchen mit einem Ausgang in d = 4 hat einen Ausgang in d = 3
Jede Kachel, die von d = 0 eingegeben werden kann, hat einen Ausgang in d = 4
Dies bedeutet, dass wir nur die Richtungen 0,2,4 berücksichtigen müssen. Alle Ausgänge in den Richtungen 1,3,5 können ignoriert werden, da die in den Richtungen 1,3,5 erreichbaren Felder stattdessen von einem benachbarten Feld aus mit den Richtungen 0,2 oder 4 erreicht werden können.
Wie cool ist das!?
Relabelled Richtungen
Also beschrifte ich die Richtungen und Kacheln wie folgt neu (Arnauld's Bild bearbeitet):
Jetzt haben wir die folgende Beziehung zwischen Kacheln, Ein- und Ausgängen:
Ausgänge sind also: d + t == 2? (4-t)% 3: 2-t und 2 * t% 3
Sechseckige Rotationen und Reflexionen
Für Rotationen und Reflexionen habe ich mich entschieden, die hexagonalen Achsenkoordinaten x, y anstelle der Würfelkoordinaten x, y, z zu verwenden.
In diesem System waren die Rotation und Reflektion einfacher als ich erwartet hatte:
Um alle Kombinationen zu erhalten, die ich durchgeführt habe: rot, rot, rot, reflektieren, rot, rot
Code (ursprünglich 480 Byte)
Code (Arnauld 417 Byte)
Arnauld übermittelte freundlicherweise eine 63-Byte-Speicherung, die Tricks verwendete, die mich einige Zeit gekostet haben, um meinen Kopf herumzuwickeln. Da es viele interessante Änderungen gibt, dachte ich, ich würde seinen Code unten einfügen (ich habe meine Kommentare hinzugefügt), damit er meiner Version gegenübergestellt werden kann.
quelle
JavaScript (Node.js) ,
578 ... 433431 ByteProbieren Sie es online! (n = 1 n = 13
Wie?
Richtungen und Fliesen
Wir verwenden die folgenden Codes für den 6-Richtungs-Kompass und die Kacheln:
Wir nehmen an, dass die Kreatur blau ist.
Anschlüsse
Wir brauchen eine Tabelle, um zu wissen, welche Teile der Kreatur mit anderen Plättchen verbunden werden müssen, wenn wir ein bestimmtes Plättchen in eine bestimmte Richtung betreten:
Beispiel:
Wenn wir ein Plättchen vom Typ1 mit der Richtung 5 eingeben , müssen wir in den Richtungen 1 , 3 und 4 :
Aber so wie die Fliesen gestaltet sind, kann es unmöglich eine einzige fehlende Verbindung in einer einzigen Richtung geben. Dies hat zur Folge, dass wir eine Richtung vollständig ignorieren und trotzdem erkennen können, ob der Pfad geschlossen ist oder nicht. Konventionell werden wir die Richtung ignorieren5
Diese aktualisierten Richtungssätze werden zuerst als 5-Bit-Ganzzahlen und dann als ASCII-Zeichen mit einem festen Versatz von + neu codiert+ 32
Einmal abgeflacht, ergibt dies:
Koordinaten
Credits: www.redblobgames.com
Dies erleichtert die Verarbeitung von Rotationen und Reflexionen im letzten Schritt des Algorithmus.
Kachelkodierung
Die Kacheln werden in einer Liste ohne bestimmte Reihenfolge gespeichert. Dies bedeutet, dass wir uns nicht um eine dynamische 2D-Zuordnung kümmern müssen und die vorhandenen Kacheln problemlos iterieren können. Der Nachteil ist, dass wir bei bestimmten Koordinaten dies tun müssen
find()
die entsprechende Kachel in der Liste .Algorithmus
Daher wird diese Kachel als codiert
[0,0,0,1,1]
.Bei jeder Iteration suchen wir nach:
Fliesen mit fehlenden Verbindungen: In diesem Fall versuchen wir nacheinander, die Verbindung für jeden Fliesentyp herzustellen.
Kacheln, die bereits verbunden sind, für die jedoch neue Verbindungen hinzugefügt werden müssen, weil sie in einer anderen Richtung erreicht wurden: In diesem Fall aktualisieren wir die Richtungsmaske (mit einem bitweisen ODER) und erzwingen eine neue Iteration.
Wenn alle Verbindungen gültig sind und wir die angeforderte Anzahl von Kacheln erreicht haben, müssen wir noch testen, ob es sich um eine neue Kreatur oder nur um eine modifizierte Version einer vorhandenen handelt:
Wir wenden folgende Transformationen an:
Wir sortieren die Kacheln nach ihren Koordinaten und Typen. (Diese Sortierung wird in lexikografischer Reihenfolge verarbeitet, was in Ordnung ist.)
Wir zwingen schließlich die resultierende Liste zu einer Schlüsselkette, die mit den anderen Tasten verglichen werden können.
Wir brechen ab, sobald ein bekannter Schlüssel gefunden wurde, oder speichern den neuen Schlüssel und erhöhen das Endergebnis, wenn keine der Transformationen zu einem bekannten Schlüssel führt.
Kommentiert
quelle