Esse desafio é inspirado em um quebra-cabeça que eu joguei, consistindo de peças de espuma como estas:
que precisam ser montados em cubos 3D, como estes:
As peças do quebra-cabeça podem ser vistas como grades de 5 * 5 quadrados, cujos quadrados 3 * 3 do meio são sempre sólidos, enquanto os 16 quadrados nas bordas podem ser sólidos ou vazios.
Uma peça irá ser descrita utilizando uma cadeia de 16 caracteres ( 0
S e 1
s), que representa a configuração de um dos seus bordos ( 0
= esvaziar, 1
= sólido), a fim dos ponteiros do relógio, a partir do canto superior esquerdo,.
Por exemplo, a sequência:
0101001000101101
representa esta peça:
# #
####
####
####
# #
Para encaixar as peças para formar o cubo, cada peça pode ser girada em qualquer direção. Por exemplo, estas são as rotações válidas da peça mostrada acima:
# # # # # ## #
#### #### #### ####
#### #### #### ####
#### #### #### ####
# # # # ## # #
# # # # # ## #
#### #### #### ####
#### #### #### ####
#### #### #### ####
# # # # # # ##
Desafio
Escreva um programa ou função que tenha como entrada 6 peças do quebra-cabeça e imprima ou retorne uma representação 2D do cubo resolvido.
Entrada
A entrada será uma sequência de 6 linhas, em que cada linha consiste em 16 0
ou 1
caracteres, representando as arestas de uma peça (no formato descrito acima).
Pode-se assumir que existe uma solução para a entrada.
A nova linha à direita é opcional.
Resultado
O resultado será uma representação ASCII do cubo resolvido, desdobrado em 2D, como este (o diagrama usa a notação Cubo de Rubik para nomes laterais):
+---+
|BA |
|CK |
| |
+---+---+---+---+
|LE |DO |RI |UP |
|FT |WN |GHT| |
| | | | |
+---+---+---+---+
|FR |
|ONT|
| |
+---+
Para evitar a possibilidade de apresentar a solução de várias maneiras, a peça colocada PARA BAIXO será sempre a primeira peça presente na entrada, na mesma rotação especificada lá.
Cada peça será representada graficamente como uma matriz 5 * 5, usando espaços para indicar quadrados vazios. Para quadrados sólidos, você pode usar qualquer caractere não espacial que desejar, desde que:
- qualquer peça do quebra-cabeça terá seus quadrados sólidos representados usando o mesmo personagem
- quaisquer duas peças adjacentes usam caracteres diferentes
O preenchimento de espaço à direita e a nova linha à direita são opcionais.
Casos de teste
1
Entrada:
0010010101010101
0010001011011010
0101001001010010
0010110100101101
0010110110101101
0010001011010101
Resultado:
@ @
@@@
@@@@@
@@@
** **@#@** *# #
***#####***#####
*****###*****###
***#####***#####
* @#@#** ** # #
@@@@
@@@@
@@@@
@ @
2)
Entrada:
0001110110101101
1010010111011101
0101010101010010
1010001000100011
1010001001010001
0110010100100010
Resultado:
@
@@@@
@@@@
@@@@
** **@@## * *# #
****#####****###
****###*****####
****#####***####
** *#@#@# * # #
@@@@
@@@@
@@@@
@ @
3)
Entrada:
0101001011011010
0010001000100010
0101001011010010
0101010101011010
0101101001011101
1010001001011101
Resultado:
@ @@
@@@@@
@@@
@@@@@
* * @#@#* * #
*****###*****###
***#####***#####
*****###*****###
* ##@##* * #
@@@@
@@@@
@@@@
@@ @@
Este é um codegolf, então o programa mais curto em bytes vence.
Respostas:
Haskell,
1007Mil e Um Bytes923900830 bytesAconteceu que eu já fiz um solucionador de happycube, agora só preciso jogar golfe. Tomando uma penalidade de dez bytes pelo uso de elementos de bloco sofisticados:
Isso é um bocado. Uso:
Alguns dos exemplos têm mais de uma solução, é por isso que algumas das saídas parecem diferentes. Ungolfed:
fonte