Un rompecabezas de la parte superior frontal es un rompecabezas en el que se requiere que construyas una forma tridimensional de bloques (generalmente cúbicos) con tres vistas ortogonales: una vista superior, una vista frontal y una vista lateral.
Por ejemplo, dada una vista superior, frontal y lateral de la siguiente manera:
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.
Un cubo de 2x2x2 (con volumen 8) satisfaría esta solución, pero es factible en el volumen 4, si tenemos la siguiente estructura de capas:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
También hay algunos arreglos sin solución. Tomar como ejemplo:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Si la vista superior dice que el bloque es el segundo desde la izquierda, no hay forma de que coincida con la vista frontal que dice que el bloque debe ser el tercero desde la izquierda. Entonces este arreglo es imposible.
Su tarea es construir un programa que, dado un rompecabezas arbitrario de 4x4 en la parte superior frontal, intente resolverlo en la menor cantidad de cubos, o lo declare insoluble.
Su programa tomará como entrada una serie de 48 bits, que representan las vistas superior, frontal y lateral. Pueden estar en el formato que desee (una cadena de 6 bytes, una cadena de 0 y 1, un número hexadecimal de 12 dígitos, etc.), pero el orden de los bits debe mapearse como tal:
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
En otras palabras, los bits van en un orden de izquierda a derecha, de arriba a abajo, en la parte superior, luego frontal y luego lateral.
Luego, su programa generará una serie de 64 bits que indica los cubos en la cuadrícula de 4x4x4 que están rellenados, o indica que la cuadrícula no tiene solución.
Su programa se puntuará ejecutando una batería de 1,000,000 de casos de prueba.
Los datos de prueba se generarán tomando los hashes MD5 de los enteros "000000" a "999999" como cadenas, extrayendo los primeros 48 bits (12 hexits) de cada uno de estos hashes y usándolos como entrada para el frente superior rompecabezas lateral. A modo de ejemplo, estas son algunas de las entradas de prueba y los acertijos que generan:
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
Los dos primeros no tienen solución, mientras que el último tiene una solución con las siguientes capas, de adelante hacia atrá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.
La puntuación de su programa estará determinada por los siguientes criterios, en orden descendente de prioridad:
- El mayor número de casos resueltos.
- El menor número de bloques necesarios para resolver esos casos.
- El código más corto en bytes.
Debe enviar y calcular el puntaje usted mismo, lo que requiere que su programa pueda ejecutar todos los 1,000,000 de casos de prueba.