Diese Herausforderung ist inspiriert von einem Puzzle, das ich gespielt habe und das aus Schaumstoffstücken wie diesen besteht:
die wie folgt zu 3D-Würfeln zusammengesetzt werden müssen:
Die Puzzleteile können als Gitter aus 5 * 5 Quadraten betrachtet werden, deren mittlere 3 * 3 Quadrate immer durchgehend sind, während die 16 Quadrate an den Kanten durchgehend oder leer sein können.
Ein Stück wird mit einer Zeichenfolge aus 16 Zeichen ( 0
s und 1
s) beschrieben, die die Konfiguration seiner Kanten ( 0
= leer, 1
= durchgehend) im Uhrzeigersinn ab der oberen linken Ecke darstellt.
Zum Beispiel die Zeichenfolge:
0101001000101101
repräsentiert dieses Stück:
# #
####
####
####
# #
Um die Teile zu einem Würfel zusammenzufügen, kann jedes Teil in jede Richtung gedreht werden. Dies sind beispielsweise die gültigen Rotationen des oben gezeigten Stücks:
# # # # # ## #
#### #### #### ####
#### #### #### ####
#### #### #### ####
# # # # ## # #
# # # # # ## #
#### #### #### ####
#### #### #### ####
#### #### #### ####
# # # # # # ##
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die 6 Puzzleteile als Eingabe verwendet und eine 2D-Darstellung des gelösten Würfels druckt oder zurückgibt.
Eingang
Die Eingabe ist eine Zeichenfolge aus 6 Zeilen, wobei jede Zeile aus 16 0
oder 1
Zeichen besteht, die die Kanten eines Stücks darstellen (in dem oben beschriebenen Format).
Es kann davon ausgegangen werden, dass es eine Lösung für die Eingabe gibt.
Die nachfolgende Newline ist optional.
Ausgabe
Das Ergebnis ist eine ASCII-Darstellung des gelösten Würfels, die wie folgt in 2D entfaltet wird (das Diagramm verwendet die Rubik-Würfel-Notation für Seitennamen):
+---+
|BA |
|CK |
| |
+---+---+---+---+
|LE |DO |RI |UP |
|FT |WN |GHT| |
| | | | |
+---+---+---+---+
|FR |
|ONT|
| |
+---+
Um die Möglichkeit zu vermeiden, die Lösung auf mehrere Arten zu präsentieren, ist das nach unten platzierte Stück immer das erste in der Eingabe vorhandene Stück in derselben Drehung, wie es dort angegeben ist.
Jedes Stück wird grafisch als 5 * 5-Matrix dargestellt, wobei Leerzeichen zur Bezeichnung leerer Quadrate verwendet werden. Für durchgezogene Quadrate können Sie ein beliebiges Nicht-Leerzeichen verwenden, solange:
- Bei jedem Puzzleteil werden die ausgefüllten Quadrate mit demselben Zeichen dargestellt
- Zwei beliebige benachbarte Teile verwenden unterschiedliche Zeichen
Das Leerzeichen rechts und die nachfolgende neue Zeile sind optional.
Testfälle
1.
Eingang:
0010010101010101
0010001011011010
0101001001010010
0010110100101101
0010110110101101
0010001011010101
Ausgabe:
@ @
@@@
@@@@@
@@@
** **@#@** *# #
***#####***#####
*****###*****###
***#####***#####
* @#@#** ** # #
@@@@
@@@@
@@@@
@ @
2.
Eingang:
0001110110101101
1010010111011101
0101010101010010
1010001000100011
1010001001010001
0110010100100010
Ausgabe:
@
@@@@
@@@@
@@@@
** **@@## * *# #
****#####****###
****###*****####
****#####***####
** *#@#@# * # #
@@@@
@@@@
@@@@
@ @
3.
Eingang:
0101001011011010
0010001000100010
0101001011010010
0101010101011010
0101101001011101
1010001001011101
Ausgabe:
@ @@
@@@@@
@@@
@@@@@
* * @#@#* * #
*****###*****###
***#####***#####
*****###*****###
* ##@##* * #
@@@@
@@@@
@@@@
@@ @@
Dies ist Codegolf, also gewinnt das kürzeste Programm in Bytes.
Antworten:
Haskell,
1007Tausendundein Bytes923900830 BytesIch habe zufällig schon einen Happycube-Löser gemacht, jetzt muss ich nur noch Golf spielen. Eine 10-Byte-Strafe für die Verwendung ausgefallener Blockelemente:
Das ist ein Schluck. Verwendungszweck:
Einige der Beispiele haben mehr als eine Lösung, deshalb sehen einige der Ausgaben anders aus. Ungolfed:
quelle