Commit ff720219 authored by Tom MARRUCCI's avatar Tom MARRUCCI
Browse files

Merge branch 'master' into stats_courbe

Conflicts:
	algo.py
	stats.py
parents 4e8b0b2b cdd1eeae
[submodule "tests/samples/cubejs"]
path = tests/samples/cubejs
url = git@github.com:akheron/cubejs.git
......@@ -100,7 +100,7 @@ class Cube():
Blue (B) = 1
Red (R) = 2
Green (G) = 3
Orange (0) = 4
Orange (O) = 4
Yellow (Y) = 5
Convention des couleurs des faces :
......@@ -188,16 +188,19 @@ class Cube():
return '\n'.join(''.join(l) for l in result) #on convertit la liste en chaîne
def to_line(self):
def to_line(self, colors=True):
"""
to_line
:Args:
colors {Boolean} Afficher la chaîne en couleur. Defaut True.
:Returns:
{String} la représentation du cube format one line
ex: OGRBWYBGBGYYOYOWOWGRYOOOBGBRRYRBWWWRBWYGROWGRYBRGYWBOG
"""
up, left, front, right, back, down = build_faces(self, colors=True)
up, left, front, right, back, down = build_faces(self, colors=colors)
lines = [[]]*5
lines[0] = ''.join(sum(up, []))
......@@ -234,13 +237,15 @@ class Cube():
correct
'''
if not cube in PETITS_CUBES:
return False
raise ValueError(str(cube) + " n'est pas un petit cube")
elif not len(cube) == len(val):
raise ValueError("La taille du cube ne correspond pas")
else:
groupes = [0] * 3
for c in val:
i = codeToGroup(c)
if i == None:
return False
raise ValueError(str(c) + " n'est pas une couleur")
else:
groupes[i] += 1
......@@ -253,7 +258,7 @@ class Cube():
self.cubes[cube] = Array(val)
return True
else:
return False
raise ValueError("Un même groupe de couleur est présent 2 fois")
def rot_L(self):
"""
......@@ -820,6 +825,9 @@ class Cube():
:Args:
petit_cube {String} Le petit cube qu'il faut regarder
c1 {int}
c2 {int}
c3 {int} Defaut à None pour le cas d'un cube arrête
:Returns:
{Boolean|None} True si les couleurs sont présentes
......@@ -837,7 +845,6 @@ class Cube():
else:
return None
def scramble(self, str):
'''
scramble
......@@ -892,9 +899,9 @@ class Cube():
return True
def face_resolu(self,face):
def face_resolue(self, face):
"""
face_resolu
face_resolue
Fonction qui dit si une face du cube (passé en paramètre) est résolu ou non
......@@ -902,7 +909,7 @@ class Cube():
face {Sting} une face du cube
:Example:
c.face_resolu(('U')
c.face_resolue(('U')
:Returns:
{Boolean} True toute la face correspond à sa couleur
......@@ -919,7 +926,6 @@ class Cube():
self.get_facette('FRU',2),
self.get_facette('RBU',2),
self.get_facette('BLU',2),
)
return faceJaune == (5,5,5,5,5,5,5,5) # Test si toute les facettes sont jaune
elif face == 'D': # Si la face Down du cube
......@@ -988,7 +994,7 @@ class Cube():
)
return faceOrange == (4,4,4,4,4,4,4,4) # Test si toute les facettes sont orange
else:
return "Erreur dans les paramètres de la fonction"
raise ValueError(str(face) + "n'est pas une face")
def resolu(self):
"""
......@@ -1052,13 +1058,13 @@ if __name__ == '__main__':
# Exemple d'utilisation du Cube
c = Cube() #par défaut, ce cube est résolu
print(c)
#Test fonction face_resolu
print(c.face_resolu("U"))
print(c.face_resolu("D"))
print(c.face_resolu("B"))
print(c.face_resolu("F"))
print(c.face_resolu("L"))
print(c.face_resolu("R"))
#Test fonction face_resolue
print(c.face_resolue("U"))
print(c.face_resolue("D"))
print(c.face_resolue("B"))
print(c.face_resolue("F"))
print(c.face_resolue("L"))
print(c.face_resolue("R"))
print(c.to_line())
print('Couleur facette BLD/indice 0 : ' + str(c.get_facette('BLD',0))) #test du getter
......
......@@ -5,8 +5,6 @@ Ragnulf
Résolution d'un Rubik's Cube par la méthode CFOP.
Projet d'Algorithmique et Programmation INFO3 Polytech Nantes.
# TL;DR
```bash
python poqb.y --cube OGRBWYBGBGYYOYOWOWGRYOOOBGBRRYRBWWWRBWYGROWGRYBRGYWBOG
......@@ -59,6 +57,19 @@ print(poqb.solve('OGRBWYBGBGYYOYOWOWGRYOOOBGBRRYRBWWWRBWYGROWGRYBRGYWBOG'))
# En savoir plus
[:link: Wiki Gitlab](https://gitlab.univ-nantes.fr/E132397K/Ragnulf/wikis/home)
# Tests
Pour lancer les tests unitaires :
```python
python -m unittest discover -v
```
Ou, avec `green` (`pip3 install green`), pour avoir un peu de couleurs :
```python
green -vvv
#ou
green -vvv -r #avec coverage d'installé sur la machine
```
# Membres :
- CLOCHARD Guillaume
- LANGELIER Arnaud
......
......@@ -26,12 +26,17 @@ http://ruwix.com/puzzle-mouvements-generator/
'''
import json
import re
from sys import argv
from Cube import Cube
from lire_entree import lecture_cube
from utils import croix_valide, ftl_valide, cfop_valide
from test import tableaux_test
from stats import moyenne,ecart_type
from utils import croix_valide, ftl_valide, cfop_valide, replace_sublist
SHORTCUTS = "shortcuts.json"
def algo_cfop(c):
'''
......@@ -50,7 +55,7 @@ def algo_cfop(c):
différents mouvements à effectuer pour résoudre le cube
'''
face_resolue = lambda x: x.face_resolu('U')
face_resolue = lambda x: x.face_resolue('U')
resolu = lambda x: x.resolu()
noop = lambda x: (x, ())
......@@ -70,7 +75,24 @@ def algo_cfop(c):
else:
return "Le cube est insolvable", None
return None, mouv
mouv = list(mouv)
#Détection des pattern qui peuvent être raccourcis
with open(SHORTCUTS) as dataFile:
shortcuts = json.load(dataFile)
#on tri par la taille des chaînes de mouvements
shortcuts = sorted(
shortcuts.items(),
key=lambda l: len(l[0]),
reverse=True
)
#On remplace chaque pattern dont on connait un raccourcis
for (sublist, remplacement) in shortcuts:
replace_sublist(mouv, sublist.split(), remplacement)
return None, mouv
def cross_facile(c):
'''
......@@ -111,172 +133,182 @@ def cross_facile(c):
Liste des mouvements à faire
'''
mouvements1 = () #liste des mouvements à effectués part1
mouvements2 = () #part2
mouvements3 = () #part3
mouvements4 = () #part4
mouvementsTemp = () #liste des mouvements à effectués pour avancer dans l'algo
mouvementsTotal = ()
#On veut mettre l'arrête bleue-blanche à côté de la pièce centrale blanche
#ie. la placer en FB jsute en dessous la pièce centrale bleue
#On cherche l'arête bleue blanche
if c.cube_contient_couleur('FU', 0, 1): #Si elle est sur la première couronne
mouvements1 = ('F2',)
mouvementsTemp = ('F2',)
elif c.cube_contient_couleur('RU', 0, 1):
mouvements1 = ('U', 'F2')
mouvementsTemp = ('U', 'F2')
elif c.cube_contient_couleur('BU', 0, 1):
mouvements1 = ('U2', 'F2')
mouvementsTemp = ('U2', 'F2')
elif c.cube_contient_couleur('LU', 0, 1):
mouvements1 = ('Ui', 'F2')
mouvementsTemp = ('Ui', 'F2')
elif c.cube_contient_couleur('FR', 0, 1): #Deuxième couronne
mouvements1 = ('R', 'U', 'F2')
mouvementsTemp = ('R', 'U', 'F2')
elif c.cube_contient_couleur('BR', 0, 1):
mouvements1 = ('Ri', 'U', 'F2')
mouvementsTemp = ('Ri', 'U', 'F2')
elif c.cube_contient_couleur('BL', 0, 1):
mouvements1 = ('Bi', 'U2', 'F2')
mouvementsTemp = ('Bi', 'U2', 'F2')
elif c.cube_contient_couleur('FL', 0, 1):
mouvements1 = ('Fi',)
mouvementsTemp = ('Fi',)
elif c.cube_contient_couleur('LD', 0, 1): #Troisième couronne, autour du blanc
mouvements1 = ('L2', 'Ui', 'F2')
mouvementsTemp = ('L2', 'Ui', 'F2')
elif c.cube_contient_couleur('RD', 0, 1):
mouvements1 = ('R2', 'U', 'F2')
mouvementsTemp = ('R2', 'U', 'F2')
elif c.cube_contient_couleur('BD', 0, 1):
mouvements1 = ('B2', 'U2', 'F2')
mouvementsTemp = ('B2', 'U2', 'F2')
if len(mouvements1) > 0:
c.mouvements(mouvements1) #on effectue les mouvements
if len(mouvementsTemp) > 0:
c.mouvements(mouvementsTemp) #on effectue les mouvements
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#À ce niveau là, l'arrête bleue-blanche est au niveau de la troisième couronne
#à l'endroit où il faut mais pas forcément paramétré comme il le faut: WWBB et pas WBWB
if c.get_facette('FD', 0) != 1 : #Si pas bien paramétré,
#il y a une suite de mouvements à effectuer
mvtsFix = ('Fi', 'B', 'Ri', 'Di')
c.mouvements(mvtsFix)
mouvements1 += mvtsFix
if c.get_facette('FD', 0) != 1 : #Si pas bien paramétré, il y a une suite de mouvements à effectuer
mouvementsTemp = ('Fi', 'B', 'Ri', 'Di')
c.mouvements(mouvementsTemp)
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#La partie blanc-bleue est complétée
#On fait pareil pour la partie orange
if c.cube_contient_couleur('FU', 0, 4): #Si elle est sur la première couronne
mouvements2 = ('U', 'L2')
mouvementsTemp = ('U', 'L2')
elif c.cube_contient_couleur('RU', 0, 4):
mouvements2 = ('U2', 'L2')
mouvementsTemp = ('U2', 'L2')
elif c.cube_contient_couleur('BU', 0, 4):
mouvements2 = ('Ui', 'L2')
mouvementsTemp = ('Ui', 'L2')
elif c.cube_contient_couleur('LU', 0, 4):
mouvements2 = ('L2',)
mouvementsTemp = ('L2',)
elif c.cube_contient_couleur('FR', 0, 4): #Deuxième couronne
mouvements2 = ('R', 'U2', 'L2')
mouvementsTemp = ('R', 'U2', 'L2')
elif c.cube_contient_couleur('BR', 0, 4):
mouvements2 = ('B', 'Ui', 'L2')
mouvementsTemp = ('B', 'Ui', 'L2')
elif c.cube_contient_couleur('BL', 0, 4):
mouvements2 = ('Li',)
mouvementsTemp = ('Li',)
elif c.cube_contient_couleur('FL', 0, 4):
mouvements2 = ('L',)
mouvementsTemp = ('L',)
elif c.cube_contient_couleur('RD', 0, 4): #Troisième couronne, autour du blanc
mouvements2 = ('R2', 'U2', 'L2')
mouvementsTemp = ('R2', 'U2', 'L2')
elif c.cube_contient_couleur('BD', 0, 4):
mouvements2 = ('B2', 'Ui', 'L2')
mouvementsTemp = ('B2', 'Ui', 'L2')
if len(mouvements2) > 0:
c.mouvements(mouvements2) #on effectue les mouvements
if len(mouvementsTemp) > 0:
c.mouvements(mouvementsTemp) #on effectue les mouvements
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#A ce niveau là, l'arrête orange blanche est au niveau de la troisième couronne
#à l'endroit où il faut mais pas forcément paramétré comme il le faut : WWOO et pas WOWO
if c.get_facette('LD', 0) != 4 : #Si pas bien paramétré,
#il y a une suite de mouvements à effectuer
mvtsFix = ('Li', 'D', 'Fi', 'Di')
c.mouvements(mvtsFix)
mouvements2 += mvtsFix
mouvementsTemp = ('Li', 'D', 'Fi', 'Di')
c.mouvements(mouvementsTemp)
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#La partie orange est complétée
#On fait pareil pour la partie verte
if c.cube_contient_couleur('FU', 0 ,3): #Si elle est sur la première couronne
mouvements3 = ('U2', 'B2')
mouvementsTemp = ('U2', 'B2')
elif c.cube_contient_couleur('RU', 0 ,3):
mouvements3 = ('Ui', 'B2')
mouvementsTemp = ('Ui', 'B2')
elif c.cube_contient_couleur('BU', 0 ,3):
mouvements3 = ('B2',)
mouvementsTemp = ('B2',)
elif c.cube_contient_couleur('LU', 0 ,3):
mouvements3 = ('U', 'B2')
mouvementsTemp = ('U', 'B2')
elif c.cube_contient_couleur('FR', 0 ,3): #Deuxième couronne
mouvements3 = ('R', 'Ui', 'B2')
mouvementsTemp = ('R', 'Ui', 'B2')
elif c.cube_contient_couleur('BL', 0 ,3):
mouvements3 = ('B',)
mouvementsTemp = ('B',)
elif c.cube_contient_couleur('BR', 0 ,3):
mouvements3 = ('Bi',)
mouvementsTemp = ('Bi',)
elif c.cube_contient_couleur('FL', 0 ,3):
mouvements3 = (
mouvementsTemp = (
'Li', 'U',
'L', # Pour remettre la partie d'avant à sa place
'B2'
)
elif c.cube_contient_couleur('RD', 0 ,3): #Troisième couronne, autour du blanc
mouvements3 = ('R2', 'Ui', 'B2')
mouvementsTemp = ('R2', 'Ui', 'B2')
if len(mouvements3) > 0:
c.mouvements(mouvements3) #on effectue les mouvements
if len(mouvementsTemp) > 0:
c.mouvements(mouvementsTemp) #on effectue les mouvements
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#À ce niveau là, l'arrête verte blanche est au niveau de la troisième couronne
#à l'endroit où il faut mais pas forcément paramétré comme il le faut : WWGG et pas WGWG
if c.get_facette('BD', 0) != 3 : #Si pas bien paramétré,
#il y a une suite de mouvements à effectuer
mvtsFix = ('Bi', 'D', 'Li', 'Di')
c.mouvements(mvtsFix)
mouvements3 += mvtsFix
mouvementsTemp = ('Bi', 'D', 'Li', 'Di')
c.mouvements(mouvementsTemp)
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#La partie verte est complétée
#On fait pareil pour la partie rouge
if c.cube_contient_couleur('FU', 0 ,2): #Si elle est sur la première couronne
mouvements4 = ('Ui', 'R2')
mouvementsTemp = ('Ui', 'R2')
elif c.cube_contient_couleur('RU', 0 ,2):
mouvements4 = ('R2',)
mouvementsTemp = ('R2',)
elif c.cube_contient_couleur('BU', 0 ,2):
mouvements4 = ('U', 'R2')
mouvementsTemp = ('U', 'R2')
elif c.cube_contient_couleur('LU', 0 ,2):
mouvements4 = ('U2', 'R2')
mouvementsTemp = ('U2', 'R2')
elif c.cube_contient_couleur('FR', 0 ,2): #Deuxième couronne
mouvements4 = ('Ri',)
mouvementsTemp = ('Ri',)
elif c.cube_contient_couleur('BL', 0 ,2):
mouvements4 = (
mouvementsTemp = (
'Bi', 'U',
'B', # Pour remettre la partie d'avant à sa place
'R2'
)
elif c.cube_contient_couleur('BR', 0 ,2):
mouvements4 = ('R',)
mouvementsTemp = ('R',)
elif c.cube_contient_couleur('FL', 0 ,2):
mouvements4 = ('F', 'Ui', 'Fi', 'R2')
mouvementsTemp = ('F', 'Ui', 'Fi', 'R2')
if len(mouvements4) > 0:
c.mouvements(mouvements4) #on effectue les mouvements
if len(mouvementsTemp) > 0:
c.mouvements(mouvementsTemp) #on effectue les mouvements
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
#A ce niveau là, l'arrête rouge blanche est au niveau de la troisième couronne
#à l'endroit où il faut mais pas forcément paramétré comme il le faut : WWRR et pas WOWR
if c.get_facette('RD', 0) != 2 : #Si pas bien paramétré,
#il y a une suite de mouvements à effectuer
mvtsFix = ('Ri', 'D', 'Bi', 'Di')
c.mouvements(mvtsFix)
mouvements4 += mvtsFix
mouvementsTemp = ('Ri', 'D', 'Bi', 'Di')
c.mouvements(mouvementsTemp)
mouvementsTotal += mouvementsTemp
mouvementsTemp = ()
return c, mouvements1 + mouvements2 + mouvements3 + mouvements4
return c, mouvementsTotal
def ftl(c):
'''
......@@ -300,336 +332,832 @@ def ftl(c):
{Cube}, {String} L'objet cube avec les deux layers de faite
Liste des mouvements à faire
'''
c2 = Cube()
mouvements1 = () #liste des mouvements à effectués part1
mouvements2 = () #part2
mouvements3 = () #part3
mouvements4 = () #part4
mouvements5 = () #part5
mouvements6 = () #part6
mouvements7 = () #part7
mouvements8 = () #part8
mouvements9 = () #part9
mouvements10 = () #part10
mouvements11 = () #part11
mouvements12 = () #part12
mouvements13 = () #part13
mouvements14 = () #part14
mouvements15 = () #part15
mouvements16 = () #part16
mvtsFix = ()
# Cube Bleu Orange Blanche
# On le place d'abord en LFU
# cube bien placé
if c.cube_contient_couleur('LFD',0,1,4) and c.get_facette('LFD',0)==4:
pass
else:
# cube bien placé mais pas bien orienté
if c.cube_contient_couleur('LFD',0,1,4) and c.get_facette('LFD',0)!=4:
mouvements1 = ('Li','Ui','L','U')
elif c.cube_contient_couleur('LFU',0,1,4):
pass
elif c.cube_contient_couleur('FRD',0,1,4):
mouvements1 = ('R', 'U','Ri')
elif c.cube_contient_couleur('FRU',0,1,4):
mouvements1 = ('U',)
elif c.cube_contient_couleur('RBU',0,1,4):
mouvements1 = ('U2',)
elif c.cube_contient_couleur('RBD',0,1,4):
mouvements1 = ('Ri','U2','R')
elif c.cube_contient_couleur('BLD',0,1,4):
mouvements1 = ('L','U2','Li','U')
elif c.cube_contient_couleur('BLU',0,1,4):
mouvements1 = ('Ui',)
if len(mouvements1) > 0:
c.mouvements(mouvements1) #on effectue les mouvements
# Puis on place bien le cube
if c.get_facette('LFU',2)==0:
mvtsFix = ('Li','U2','L','U')
c.mouvements(mvtsFix)
mouvements1 += mvtsFix
if c.get_facette('LFU',0)==0:
mouvements2 = ('Fi','L','F','Li')
elif c.get_facette('LFU',0)==4:
mouvements2 = ('L','Fi','Li','F')
if len(mouvements2) > 0:
c.mouvements(mouvements2) #on effectue les mouvements
# Cube Bleu Rouge Blanche
# On cherche d'abord à mettre le cube en FRU
# cube bien placé et orienté
if c.cube_contient_couleur('FRD',0,1,2) and c.get_facette('FRD',0)==1:
pass
else:
# cube bien placé mais pas bien orienté
if c.cube_contient_couleur('FRD',0,1,2) :
mouvements3 = ('R','U','Ri','Ui')
elif c.cube_contient_couleur('FRU',0,1,2):
pass
elif c.cube_contient_couleur('LFU',0,1,2):
mouvements3 = ('Ui',)
elif c.cube_contient_couleur('RBU',0,1,2):
mouvements3 = ('U',)
elif c.cube_contient_couleur('RBD',0,1,2):
mouvements3 = ('Ri','U2','R','Ui')
elif c.cube_contient_couleur('BLD',0,1,2):
mouvements3 = ('L','U2','Li')
elif c.cube_contient_couleur('BLU',0,1,2):
mouvements3 = ('U2',)
if len(mouvements3) > 0:
c.mouvements(mouvements3) #on effectue les mouvements
# On place ensuite bien le cube en FRD
if c.get_facette('FRU',2)==0:
mvtsFix = ('Fi','U2','F','U')
c.mouvements(mvtsFix)
mouvements3 += mvtsFix
if c.get_facette('FRU',1)==0:
mouvements4 = ('F','Ri','Fi','R')
elif c.get_facette('FRU',1)==2:
mouvements4 = ('Ri','F','R','Fi')
if len(mouvements4) > 0:
c.mouvements(mouvements4) #on effectue les mouvements
# Vert orange
# On cherche à le mettre en BLU
if c.cube_contient_couleur('BLD',0,3,4) and c.get_facette('BLD',2)==0:
pass
else:
if c.cube_contient_couleur('BLD',0,3,4):
mouvements5 = ('L','U','Li','Ui')
elif c.cube_contient_couleur('FRU',0,3,4):
mouvements5 = ('U2',)
elif c.cube_contient_couleur('RBU',0,3,4):
mouvements5 = ('Ui',)
elif c.cube_contient_couleur('RBD',0,3,4):
mouvements5 = ('Ri','Ui','R')
elif c.cube_contient_couleur('BLU',0,3,4):
pass
elif c.cube_contient_couleur('LFU',0,3,4):
mouvements5 = ('U',)
if len(mouvements5) > 0:
c.mouvements(mouvements5) #on effectue les mouvements
# On place ensuite bien le cube en BLD
if c.get_facette('BLU',2)==0:
mvtsFix = ('Bi','U2','B','U')
c.mouvements(mvtsFix)
mouvements5 += mvtsFix
if c.get_facette('BLU',0)==0:
mouvements6 = ('Li','B','L','Bi')
elif c.get_facette('BLU',0)==3:
mouvements6 = ('B','Li','Bi','L')
if len(mouvements6) > 0:
c.mouvements(mouvements6) #on effectue les mouvements
# Vert rouge
# On cherche à le mettre en RBU
if c.cube_contient_couleur('RBD',0,2,3) and c.get_facette('RBD',2)==0:
pass
else:
if c.cube_contient_couleur('RBD',0,2,3):
mouvements7 = ('Ri','Ui','R','U')