Um quebra-cabeça da parte superior da frente é um quebra-cabeça em que você é obrigado a construir uma forma tridimensional de blocos (geralmente cúbicos), com três vistas ortogonais: uma vista superior, uma vista frontal e uma vista lateral.
Por exemplo, com uma vista superior, frontal e lateral da seguinte maneira:
Top: Front: Side:
. . . . . . . . . . . .
. x x . . x x . . x x .
. x x . . x x . . x x .
. . . . . . . . . . . .
In this problem, the side view is taken from the right.
Um cubo 2x2x2 (com volume 8) satisfaria essa solução, mas é factível no volume 4, se tivermos a seguinte estrutura de camada:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
Existem também alguns acordos insolúveis. Considere por exemplo:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Se a vista superior diz que o bloco é o segundo da esquerda, não há como corresponder à vista frontal que diz que o bloco deve ser o terceiro da esquerda. Portanto, esse arranjo é impossível.
Sua tarefa é criar um programa que, dado um quebra-cabeça arbitrário 4x4 na parte superior da frente, tente resolvê-lo no menor número de cubos ou o declare insolúvel.
Seu programa terá como entrada uma série de 48 bits, representando as vistas superior, frontal e lateral. Eles podem estar no formato que você desejar (uma sequência de 6 bytes, uma sequência de 0 e 1, um número hexadecimal de 12 dígitos etc.), mas a ordem dos bits deve ser mapeada da seguinte forma:
Top: 0x00 Front: 0x10 Side: 0x20
0 1 2 3 0 1 2 3 0 1 2 3
4 5 6 7 4 5 6 7 4 5 6 7
8 9 a b 8 9 a b 8 9 a b
c d e f c d e f c d e f
Em outras palavras, os bits vão na ordem da esquerda para a direita, de cima para baixo, na vista superior, depois frontal e lateral.
Seu programa produzirá uma série de 64 bits, indicando os cubos na grade 4x4x4 preenchidos ou indicará que a grade é insolúvel.
Seu programa será pontuado executando uma bateria de 1.000.000 de casos de teste.
Os dados de teste serão gerados usando os hashes MD5 dos números inteiros "000000" a "999999" como seqüências de caracteres, extraindo os primeiros 48 bits (12 hexágonos) de cada um desses hashes e usando-os como entrada para a parte superior frontal. quebra-cabeça lateral. Como exemplo, aqui estão algumas das entradas de teste e os quebra-cabeças que elas geram:
Puzzle seed: 000000 hash: 670b14728ad9
Top: Front: Side:
. x x . . . . x x . . .
x x x x . x . x x . x .
. . . . . x x x x x . x
x . x x . . x . x . . x
Puzzle seed: 000001 hash: 04fc711301f3
Top: Front: Side:
. . . . . x x x . . . .
. x . . . . . x . . . x
x x x x . . . x x x x x
x x . . . . x x . . x x
Puzzle seed: 000157 hash: fe88e8f9b499
Top: Front: Side:
x x x x x x x . x . x x
x x x . x . . . . x . .
x . . . x x x x x . . x
x . . . x . . x x . . x
Os dois primeiros são insolúveis, enquanto o último tem uma solução com as seguintes camadas, da frente para trás:
x . . . . . . . x x x . x x x .
. . . . x . . . . . . . . . . .
x . . . . . . . . . . . x x x x
x . . . . . . . . . . . x . . x
There are a total of 16 blocks here, but it can probably be done in less.
A pontuação do seu programa será determinada pelos seguintes critérios, em ordem decrescente de prioridade:
- O maior número de casos resolvidos.
- O menor número de blocos necessários para resolver esses casos.
- O código mais curto em bytes.
Você deve enviar e calcular a pontuação sozinho, o que exige que seu programa seja capaz de executar todos os 1.000.000 de casos de teste.