Würfel können aus sechs Quadraten als Seiten bestehen. Sie können aber auch drei 2x1-Rechtecke in zwei Hälften falten und zu einem Würfel zusammenkleben. In dieser Herausforderung erhalten Sie eine Reihe von Teilen, die jeweils aus Quadraten bestehen, und Sie müssen bestimmen, ob Sie Teile auswählen können, um einen Einheitswürfel zu bilden. Es müssen nicht alle Teile verwendet werden, möglicherweise sind noch einige übrig.
Einzelheiten
Die Stücke werden als Zeichenfolge mit zwei verschiedenen Zeichen oder als Schwarzweißbild oder in einem beliebigen geeigneten 2D-Rasterformat ausgegeben. Im Folgenden gehe ich davon aus, dass die Pixel, aus denen die Teile bestehen, schwarz und der Hintergrund weiß sind.
Zwei Pixel, die sich eine Seite teilen, gehören zum selben Objekt. Die Teile können nur entlang der Gitterlinien gefaltet werden, die die Pixel trennen, und sie können nicht geschnitten werden. Jede Seite des Würfels hat die Größe eines Pixels, und jede Seite des Würfels kann nur aus einer einzelnen Schicht bestehen.
Die Ausgabe muss ein wahrer oder falscher Wert sein.
Testfälle
Im Folgenden sind die Leerzeichen Hintergrund- und Raute-Symbole
#
repräsentieren die Teile.
(mehr hinzugefügt werden)
Gültig
##
##
##
#
####
#
# # # # # # #
# ##
## #
Ungültig
###
###
# #
####
### ## ####
Führen Sie das folgende Snippet aus, um weitere Testfälle zu erhalten.
PS: Dies ist eine Verallgemeinerung dieser Herausforderung
Antworten:
C
824803 BytesProbieren Sie es online!
... und bevor Sie dies im Detail erläutern, lohnt sich ein Überblick auf hoher Ebene.
Grundlegende Übersicht
Dieser Algorithmus wendet einen Mustervergleicher an, um jedes gefundene Polyomino mit einem bestimmten Muster als Teilmenge zu klassifizieren. Wenn Polyominoes abgeglichen werden, werden sie "nicht markiert", wodurch sie vom erneuten Mustervergleich ausgeschlossen werden. Die vom Matcher angegebene anfängliche Klassifizierung ist einfach eine Zählung der Anzahl der Kacheln im Polyomino.
Der Matcher wird zuerst angewendet, um alle Polyominoes zu entfernen, die nicht auf einen Würfel gefaltet werden können. Die Klassifizierung dieser Polyominos wird verworfen. Das Match ist erfolgreich, wenn diese Polyomino in höheren Levels erscheinen. Daher kümmern wir uns nur um die kleinste Teilmenge von "entfaltbar" für jede Klasse. Zusammen mit den gepolsterten Codierungen sind hier alle derartigen Polyominoe (mit Ausnahme ihrer vertikalen Reflexionen) gezeigt. Die Codierung verwendet die Bits 4-0 jedes Zeichens, um Quadrate in jeder Zeile darzustellen:
Sobald diese Polyominoes ausgesondert sind, kategorisieren wir die verbleibenden Polyominoes in relevante Kategorien. Es ist erwähnenswert, dass man in fast allen Fällen nur noch verbleibende Polyominoes (die auf Würfel faltbar sind) finden und einfach nach sechs suchen kann. Es gibt zwei Ausnahmen:
Um dieser Einschränkung gerecht zu werden, bilden wir 8 Kategorien, von AH: A für Monominoes (Einzelplättchen), B für Dominoes, C für Ecktrominoes, D für Linientrominoes, E für Linientetrominoes, F für andere Tetrominoes, G für Pentominos und H für Hexominos. Alles, was nicht in eine dieser Kategorien fällt, wird einfach ignoriert. Es reicht aus, Polyominoes zu zählen, die in jede Kategorie fallen.
Am Ende geben wir nur Wahrhaftigkeit oder Falschheit zurück, basierend auf einer riesigen Gleichung und diesen Tabellen.
Ungolfed mit Kommentaren
quelle