Un casse-tête sur le dessus est un casse-tête dans lequel vous devez construire une forme 3D de blocs (généralement cubiques) avec trois vues orthogonales: une vue de dessus, une vue de face et une vue latérale.
Par exemple, étant donné une vue de dessus, de face et de côté comme suit:
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 cube 2x2x2 (avec le volume 8) satisferait cette solution, mais c'est faisable dans le volume 4, si nous avons la structure de couche suivante:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
Il existe également des arrangements insolubles. Prends pour exemple:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Si la vue de dessus indique que le bloc est le deuxième à partir de la gauche, il n'y a aucun moyen qui puisse correspondre à la vue de face qui dit que le bloc doit être le troisième à partir de la gauche. Cet arrangement est donc impossible.
Votre tâche consiste à créer un programme qui, étant donné un casse-tête 4x4 arbitraire, tente de le résoudre dans le moins de cubes ou le déclare insoluble.
Votre programme prendra en entrée une série de 48 bits, représentant les vues de dessus, de face et de côté. Ils peuvent être dans le format de votre choix (une chaîne de 6 octets, une chaîne de 0 et de 1, un nombre hexadécimal à 12 chiffres, etc.), mais l'ordre des bits doit correspondre comme tel:
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 d'autres termes, les bits vont dans un ordre de gauche à droite, de haut en bas, en haut, puis de face, puis de côté.
Votre programme affichera alors soit une série de 64 bits indiquant les cubes de la grille 4x4x4 qui sont remplis, soit indiquer que la grille est insoluble.
Votre programme sera noté en exécutant une batterie de 1 000 000 de cas de test.
Les données de test seront générées en prenant les hachages MD5 des entiers "000000" à "999999" en tant que chaînes, en extrayant les 48 premiers bits (12 hexits) de chacun de ces hachages et en les utilisant comme entrée pour la partie supérieure avant. puzzle latéral. À titre d'exemple, voici quelques entrées de test et les puzzles qu'elles génèrent:
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
Les deux premiers sont insolubles, tandis que le dernier a une solution avec les couches suivantes, d'avant en arrière:
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.
Le score de votre programme sera déterminé par les critères suivants, par ordre décroissant de priorité:
- Le plus grand nombre de cas résolus.
- Le plus petit nombre de blocs requis pour résoudre ces cas.
- Le code le plus court en octets.
Vous devez soumettre et calculer le score par vous-même, ce qui nécessite que votre programme soit capable de parcourir les 1 000 000 cas de test.