-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinitStates.py
More file actions
114 lines (88 loc) · 1.79 KB
/
Copy pathinitStates.py
File metadata and controls
114 lines (88 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
def init_states(n, k):
cl = eliminate_rotations(generate(n,k),n)
return to_view(cl)
def sp4(n):
cl = keep_sp4(eliminate_rotations(generate(n,4),n))
return to_view(cl)
def to_view(cl):
ret = []
for el in cl :
ret.append(config_from_view(el))
return ret
def config_from_view(v):
"""à tester, je la trouve marante et débile"""
ret =[0]
for i in v:
ret = ret+[0]*i
ret[-1]+=1
return ret
def is_rotation(c):
cur = c
for i in range(len(c)-1):
cur = next(cur)
if cur== c :
return True
return False
def is_edge_edge(c, n ):
if n %2 ==0:
cur = c
for i in range(len(c)):
cur = next(cur)
if (reverse(cur)== c and i %2 ==1):
return True
return False
def eliminate_rotations(cl,n):
ret = []
for c in cl:
if not is_rotation(c) and not is_edge_edge(c,n):
ret.append(c)
return ret
def in_sp4(v):
if (v[0]==v[2]):
if v[1]%2==1 and v[3]%2 ==0 and v[1]>v[3]:
return True
if v[3]%2==1 and v[1]%2 ==0 and v[1]<v[3]:
return True
if (v[1]== v[3]):
if v[0]%2==1 and v[2]%2 ==0 and v[0]>v[2]:
return True
if v[2]%2==1 and v[0]%2 ==0 and v[0]<v[2]:
return True
return False
def keep_sp4(cl):
ret =[]
for el in cl :
if in_sp4(el):
ret.append(el)
return ret
def generate(n, k):
ret =list()
if k==1 :
return [[n]]
for i in range(n):
c = generate(n-i, k-1)
for j in c :
t = j
t.append(i)
ret.append(t)
return ret
def equivalence(config):
S=[]
cur = config
rcur = reverse(cur)
for i in range(len(config)) :
cur = next(cur)
rcur = reverse(cur)
p =(min(cur,rcur), min(cur,rcur))
S.append(p)
return (min(S),S)
def get_clases(configs):
dic = dict()
for c in configs:
k = equivalence(c)[0]
dic[str(k)]=k[0]
return dic.values()
def reverse(config):
return config[::-1]
def next(config):
return config[1::]+config[0:1]