Un puzzle nella parte anteriore superiore è un puzzle in cui è necessario costruire una forma tridimensionale di blocchi (solitamente cubici) con tre viste ortogonali: una vista dall'alto, una vista frontale e una vista laterale.
Ad esempio, vista dall'alto, anteriore e laterale come segue:
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 2x2x2 (con volume 8) soddisferebbe questa soluzione, ma è realizzabile nel volume 4, se abbiamo la seguente struttura di layer:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
Ci sono anche alcune disposizioni irrisolvibili. Prendi ad esempio:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Se la vista dall'alto dice che il blocco è il secondo da sinistra, non c'è modo che possa corrispondere alla vista frontale che dice che il blocco deve essere il terzo da sinistra. Quindi questa disposizione è impossibile.
Il tuo compito è costruire un programma che, dato un arbitrario puzzle 4x4 nella parte frontale, tenta di risolverlo nel minor numero di cubi o lo dichiara irrisolvibile.
Il tuo programma prenderà come input una serie di 48 bit, che rappresentano le viste superiore, frontale e laterale. Possono essere in qualsiasi formato desiderato (una stringa di 6 byte, una stringa di 0 e 1, un numero esadecimale di 12 cifre, ecc.), Ma l'ordine dei bit deve essere mappato come tale:
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
In altre parole, i bit vanno nell'ordine da sinistra a destra, dall'alto verso il basso, nella vista dall'alto, quindi anteriore, quindi laterale.
Il programma produrrà quindi una serie di 64 bit che indicano i cubi nella griglia 4x4x4 che sono stati compilati o indicano che la griglia è irrisolvibile.
Il tuo programma verrà valutato eseguendo una batteria di 1.000.000 di casi di test.
I dati di test verranno generati prendendo gli hash MD5 degli interi da "000000" a "999999" come stringhe, estraendo i primi 48 bit (12 esadecimali) di ciascuno di questi hash e utilizzandoli come input per la parte superiore-anteriore- puzzle laterale. Ad esempio, ecco alcuni degli input di test e i puzzle che generano:
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
I primi due sono irrisolvibili, mentre l'ultimo ha una soluzione con i seguenti strati, da davanti a dietro:
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.
Il punteggio del tuo programma sarà determinato dai seguenti criteri, in ordine decrescente di priorità:
- Il maggior numero di casi risolti.
- Il numero più basso di blocchi richiesti per risolvere questi casi.
- Il codice più breve in byte.
È necessario inviare e calcolare il punteggio da soli, il che richiede che il programma sia in grado di eseguire tutti i 1.000.000 di casi di test.