Este desafío está inspirado en un rompecabezas que jugué, que consiste en piezas de espuma como estas:
que deben ensamblarse en cubos 3D, como estos:
Las piezas del rompecabezas se pueden ver como cuadrículas de 5 * 5 cuadrados, cuyos cuadrados 3 * 3 centrales siempre son sólidos, mientras que los 16 cuadrados en los bordes pueden ser sólidos o vacíos.
Se describirá una pieza utilizando una cadena de 16 caracteres ( 0
sys 1
), que representa la configuración de sus bordes ( 0
= vacío, 1
= sólido), en el sentido de las agujas del reloj, comenzando desde la esquina superior izquierda.
Por ejemplo, la cadena:
0101001000101101
representa esta pieza:
# #
####
####
####
# #
Para unir las piezas para formar el cubo, cada pieza se puede girar en cualquier dirección. Por ejemplo, estas son las rotaciones válidas de la pieza que se muestra arriba:
# # # # # ## #
#### #### #### ####
#### #### #### ####
#### #### #### ####
# # # # ## # #
# # # # # ## #
#### #### #### ####
#### #### #### ####
#### #### #### ####
# # # # # # ##
Desafío
Escriba un programa o función que tome como entrada 6 piezas del rompecabezas e imprima o devuelva una representación 2D del cubo resuelto.
Entrada
La entrada será una cadena de 6 filas, donde cada fila consta de 16 0
o 1
caracteres, que representan los bordes de una pieza (en el formato descrito anteriormente).
Se puede suponer que hay una solución para la entrada.
La nueva línea final es opcional.
Salida
El resultado será una representación ASCII del cubo resuelto, desplegado en 2D, de esta manera (el diagrama usa la notación Cubo de Rubik para los nombres laterales):
+---+
|BA |
|CK |
| |
+---+---+---+---+
|LE |DO |RI |UP |
|FT |WN |GHT| |
| | | | |
+---+---+---+---+
|FR |
|ONT|
| |
+---+
Para evitar la posibilidad de presentar la solución de múltiples maneras, la pieza colocada ABAJO siempre será la primera pieza presente en la entrada, en la misma rotación que se especifica allí.
Cada pieza se representará gráficamente como una matriz de 5 * 5, utilizando espacios para denotar cuadrados vacíos. Para cuadrados sólidos puede usar cualquier carácter que no sea espacio que desee, siempre que:
- cualquier pieza del rompecabezas tendrá sus cuadrados sólidos representados usando el mismo personaje
- dos piezas adyacentes usan caracteres diferentes
El relleno de espacio a la derecha y la nueva línea final son opcionales.
Casos de prueba
1)
Entrada:
0010010101010101
0010001011011010
0101001001010010
0010110100101101
0010110110101101
0010001011010101
Salida:
@ @
@@@
@@@@@
@@@
** **@#@** *# #
***#####***#####
*****###*****###
***#####***#####
* @#@#** ** # #
@@@@
@@@@
@@@@
@ @
2)
Entrada:
0001110110101101
1010010111011101
0101010101010010
1010001000100011
1010001001010001
0110010100100010
Salida:
@
@@@@
@@@@
@@@@
** **@@## * *# #
****#####****###
****###*****####
****#####***####
** *#@#@# * # #
@@@@
@@@@
@@@@
@ @
3)
Entrada:
0101001011011010
0010001000100010
0101001011010010
0101010101011010
0101101001011101
1010001001011101
Salida:
@ @@
@@@@@
@@@
@@@@@
* * @#@#* * #
*****###*****###
***#####***#####
*****###*****###
* ##@##* * #
@@@@
@@@@
@@@@
@@ @@
Este es codegolf, por lo que gana el programa más corto en bytes.
Respuestas:
Haskell,
1007mil y un bytes923900830 bytesPor casualidad ya había hecho un solucionador de happycube, ahora solo necesito jugar golf. Tomar una penalización de diez bytes por usar elementos de bloque elegantes:
Eso es un bocado. Uso:
Algunos de los ejemplos tienen más de una solución, por eso algunos de los resultados se ven diferentes. Sin golf:
fuente