web-dev-qa-db-fra.com

Plus petite représentation de l'état du cube de Rubik

J'essaie de déterminer quel est le plus petit nombre de bits dont j'ai besoin pour représenter l'état d'un cube Rubik. (EDIT: Je suppose que le cube est un cube Rubik valide qui n'a pas été modifié et que seules des rotations valides ont été effectuées. Je suppose également que les faces sont de couleurs solides et uniformes. Je ne suis pas préoccupé par les rotations des cubelots centraux.)

Pour les coins, j'ai besoin de savoir lequel des 8 coins (3 bits) c'est, c'est la rotation (3 options -> 2 bits) et l'emplacement (6 côtés -> 3 bits).

Pour les bords, j'ai besoin de savoir lequel des 12 (4 bits), rotation (2 options -> 1 bit) et emplacement (6 côtés -> 3 bits).

Si je spécifie l'emplacement en fonction de la couleur du milieu, je n'ai pas du tout à suivre les pièces du milieu, je ne pense pas, car tout sera relatif aux centres.

Coins: 8 x (3b + 2b + 3b) = 64 bits
Bords: 12 x (3b + 1b + 3b) = 84 bits
Total: 148 bits

Une autre façon serait d'avoir un ordre prédéterminé dans un tableau de 20 (les 8 premiers sont des coins, les 12 derniers sont des bords). Chacun devrait savoir quelle pièce (5 bits) et rotation (2 bits pour les coins, 1 bit pour les bords).

Coins: 8 x (3b + 2b) = 40 bits
Bords: 12 x (4b + 1b) = 60 bits
Total: 100 bits

Si vous connaissez 7 des 8 coins, vous pouvez en déduire le dernier. Pareil pour les bords ...

Coins: 7 x (3b + 2b) = 35 bits
Bords: 11 x (4b + 1b) = 55 bits
Total: 90 bits

Existe-t-il un moyen de réduire davantage cela?

EDITED: J'ai trouvé un site Web qui montre comment représenter un état de cube, mais je ne sais pas combien de bits il faudrait pour utiliser cette méthode. Le site Web réel semble être en panne, mais les archives Internet l'ont ici: https://web.archive.org/web/20190706141807/http://kociemba.org/cube.htm

7
J Price

Vous pouvez encoder le 8! permutations possibles des coins en 16 bits, et les 12! permutations possibles en 29 bits, en numérotant les permutations de 1 à 8! (ou 1 à 12!), et mémoriser le numéro. J'ai trouvé une description de la façon de rendre cet encodage efficace ici , en utilisant un code Lehmer .

De manière analogue, vous pouvez regrouper les 3 ^ 8 = 6561 orientations des coins en 13 bits (je suppose que l'on veut pouvoir stocker des cubes "invalides"). Les 2 ^ 12 orientations des bords nécessiteront 12 bits, il n'y a aucun moyen de réduire cela. Au total, cela donne

 16 + 29 + 13 + 12 = 70 bits

Ce n'est qu'un bit de plus que théoriquement possible: le principe du trou de pidgeon montre que vous ne pouvez pas réduire le nombre total de bits ci-dessous

log_2(8! * 12! * 3^8 * 2^12) = 68.814 ... 

ce qui signifie que 69 bits est la valeur théoriquement la plus petite, qui peut être obtenue en codant les quatre groupes de permutations en une seule valeur de 69 bits.

Remarque: si l'on veut stocker uniquement des permutations "valides" du cube, il y a 3 ^ 7 orientations de coin valides, 2 ^ 11 orientations de bord valides et seulement 8!/2 permutations de coin valides, ce qui donne

log_2(8!/2 * 12! * 3^7 * 2^11) = 65.22 ... 

Donc, dans ce cas, 66 bits est la plus petite valeur possible.

8
Doc Brown