J’ai également fait une version visuelle dans le cas du cube 2x2x2
Le programme calcule l’ordre d’un mouvement, c’est-à-dire combien de fois il faut le répéter pour revenir au point de départ. Il est suffisamment général pour pouvoir s’appliquer au Rubik’s cube classique, au pocket ou à d’autres jeux comme les anneaux Hongrois.
>> ordre("FR")
donnera 15 (Le mouvement est face avant + droite)
Utilisez des minuscules pour tourner une face en sens inverse.
Pour passer d’un objet à un autre, faire un copier-coller des constantes ci-dessous.
U=[(8,9,11,10),(2,12,17,7),(3,14,16,5)] R=[(12,13,15,14),(23,19,11,3),(21,17,9,1)] L=[(4,5,7,6),(0,8,16,20),(2,10,18,22)] F=[(16,17,19,18),(6,10,14,21),(7,11,15,20)] D=[(20,21,23,22),(18,15,1,4),(19,13,0,6)] B=[(3,2,0,1),(13,9,5,22),(12,8,4,23)] CUBES=4 COUL="RBWVOJ"
F=[(0,6,8,2),(1,3,7,5),(9,45,44,35),(29,11,51,38),(10,48,41,32)] B=[(18,24,26,20),(19,21,25,23),(15,33,42,47),(27,36,53,17),(16,30,39,50)] U=[(9,15,17,11),(10,12,16,14),(6,27,20,45),(29,18,47,8),(28,19,46,7)] D=[(42,36,38,44),(43,39,37,41),(0,51,20,33),(35,2,53,24),(1,52,25,34)] R=[(45,47,53,51),(46,50,52,48),(2,11,20,42),(44,8,17,26),(5,14,23,43)] L=[(27,29,35,33),(28,32,34,30),(0,36,18,9),(38,24,15,6),(12,3,37,21)] CUBES=9 COUL="RBWVOJ"
L=[(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 23)] R=[(19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 4)] COUL="RBNJ" cube="R"*10+"B"*9+"N"*10+"J"*9
F=[(0,6,8,2),(1,3,7,5),(9,45,44,35),(29,11,51,38),(10,48,41,32)] B=[(18,24,26,20),(19,21,25,23),(15,33,42,47),(27,36,53,17),(16,30,39,50)] U=[(9,15,17,11),(10,12,16,14),(6,27,20,45),(29,18,47,8),(28,19,46,7)] D=[(42,36,38,44),(43,39,37,41),(0,51,20,33),(35,2,53,24),(1,52,25,34)] R=[(45,47,53,51),(46,50,52,48),(2,11,20,42),(44,8,17,26),(5,14,23,43)] L=[(27,29,35,33),(28,32,34,30),(0,36,18,9),(38,24,15,6),(12,3,37,21)] CUBES=9 COUL="RBWVOJ" def inv(l): return [tuple(reversed(t)) for t in reversed(l)] def permu(c, pos): suiv = list(pos) mvt = inv(eval(c.upper())) if c==c.lower() else eval(c) for t in mvt: u = (t[-1],)+t for i,v in enumerate(t): suiv[v] = pos[u[i]] return suiv def fin(pos): c, nb = pos[0], 1 for v in pos: if v != c: c = v nb += 1 return nb == len(COUL) def rubik(): cube = "" for c in COUL: cube += c*CUBES return cube def ano(): return "R"*10+"B"*9+"N"*10+"J"*9 def ordre(m, obj=rubik): pos = obj() nb = 1 while True: for k,c in enumerate(m): pos = permu(c,pos) if fin(pos): return nb nb += 1