Created
March 8, 2025 16:56
-
-
Save kusano/b636e7f2a116a6c5b7bc6d59f46a7ed7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from itertools import permutations | |
def normalize(s): | |
C = [] | |
for ud in range(2): | |
if ud==0: | |
ud = {"U": "U", "D": "D"} | |
else: | |
ud = {"U": "D", "D": "U"} | |
for xy in range(2): | |
if xy==0: | |
xy = {"X": "X", "Y": "Y"} | |
else: | |
xy = {"X": "Y", "Y": "X"} | |
for p in permutations(range(4)): | |
C += [tuple([ud[s[i//4*4+p[i%4]][0]]+xy[s[i//4*4+p[i%4]][1]] for i in range(8)])] | |
C.sort() | |
return C[0] | |
def analyse(s): | |
n = 0 | |
for i in range(4): | |
if (s[i][0]=="U"): | |
n += 1 | |
if n==0 or n==4: | |
ud = "Slashes" | |
elif n==1 or n==3: | |
ud = "Bar/Slash" | |
else: | |
same = False | |
diff = False | |
for i in range(4): | |
if s[i][0]==s[i+4][0]: | |
same = True | |
else: | |
diff = True | |
if same and diff: | |
ud = "Bars" | |
else: | |
ud = "Solved" | |
n = 0 | |
for i in range(4): | |
if (s[i][1]=="X"): | |
n += 1 | |
if n==0 or n==4: | |
fb = "Solved" | |
elif n==1 or n==3: | |
fb = "OneBar" | |
else: | |
same = False | |
diff = False | |
for i in range(4): | |
if s[i][1]==s[i+4][1]: | |
same = True | |
else: | |
diff = True | |
if same and diff: | |
fb = "Bars" | |
else: | |
fb = "OneFace" | |
return f"{ud}+{fb}" | |
""" | |
S = set() | |
for p in permutations(("UX", "UX", "DX", "DX", "UY", "UY", "DY", "DY")): | |
S.add(normalize(p)) | |
print(S) | |
""" | |
S = { | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UX', 'UY', 'DY'), | |
('DX', 'DY', 'UX', 'UY', 'UY', 'UX', 'DY', 'DX'), | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UX', 'DY', 'UY'), | |
('DX', 'DX', 'DY', 'UX', 'UY', 'UY', 'UX', 'DY'), | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UX', 'UY', 'UX'), | |
('DX', 'DY', 'UX', 'UY', 'UX', 'UY', 'DY', 'DX'), | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UY', 'UX', 'UY'), | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UX', 'UX', 'UY'), | |
('DX', 'DX', 'DY', 'UX', 'UX', 'UY', 'DY', 'UY'), | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UY', 'UX', 'DY'), | |
('DX', 'DX', 'UX', 'UY', 'DY', 'DY', 'UY', 'UX'), | |
('DX', 'DX', 'UX', 'UY', 'DY', 'DY', 'UX', 'UY'), | |
('DX', 'DX', 'UX', 'UY', 'UX', 'UY', 'DY', 'DY'), | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UX', 'UY', 'UY'), | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UY', 'DY', 'UX'), | |
('DX', 'DY', 'UX', 'UY', 'DY', 'DX', 'UY', 'UX'), | |
('DX', 'DX', 'UY', 'UY', 'DY', 'UX', 'DY', 'UX'), | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UX', 'UY', 'DY'), | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UY', 'UX', 'UX'), | |
('DX', 'DX', 'DY', 'DY', 'UX', 'UY', 'UX', 'UY'), | |
('DX', 'DX', 'UY', 'UY', 'DY', 'DY', 'UX', 'UX'), | |
('DX', 'DY', 'UX', 'UY', 'DY', 'UY', 'DX', 'UX'), | |
('DX', 'DX', 'UX', 'UX', 'DY', 'UY', 'DY', 'UY'), | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UY', 'UX', 'DY'), | |
('DX', 'DX', 'DY', 'UX', 'UY', 'UY', 'DY', 'UX'), | |
('DX', 'DX', 'DY', 'UX', 'UX', 'UY', 'UY', 'DY'), | |
('DX', 'DY', 'UX', 'UY', 'UX', 'UY', 'DX', 'DY'), | |
('DX', 'DX', 'DY', 'DY', 'UX', 'UX', 'UY', 'UY'), | |
('DX', 'DY', 'UX', 'UY', 'DY', 'UX', 'UY', 'DX'), | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UX', 'DY', 'UY'), | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UY', 'DY', 'UX'), | |
('DX', 'DY', 'UX', 'UY', 'DX', 'DY', 'UY', 'UX'), | |
('DX', 'DX', 'UX', 'UX', 'DY', 'DY', 'UY', 'UY'), | |
('DX', 'DX', 'UX', 'UX', 'UY', 'UY', 'DY', 'DY'), | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UX', 'DY', 'UY'), | |
('DX', 'DX', 'DY', 'DY', 'UY', 'UY', 'UX', 'UX'), | |
('DX', 'DX', 'UY', 'UY', 'UX', 'UX', 'DY', 'DY'), | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UY', 'UX', 'DY'), | |
('DX', 'DY', 'UX', 'UY', 'DX', 'DY', 'UX', 'UY'), | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UX', 'UY', 'DY'), | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UY', 'UY', 'UX'), | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UY', 'DY', 'UX'), | |
} | |
S_ = S | |
S = set() | |
for s in S_: | |
S.add(s+(0,)) | |
S.add(s+(1,)) | |
# 0c0 parity=0 かどうかで初期のグループ化。 | |
G = {} | |
for s in S: | |
if analyse(s[:8])=="Solved+Solved" and s[8]==0: | |
G[s] = 0 | |
else: | |
G[s] = 1 | |
gn = 2 | |
T = {} | |
while True: | |
up = False | |
G2 = {} | |
for g in range(gn): | |
U2G = {} | |
for s in S: | |
if G[s]==g: | |
# U, U2 それぞれについて、遷移先のグループの集合を求める。 | |
U = set() | |
for p in permutations(range(4)): | |
s2 = list(s[:8]) | |
s2[p[0]], s2[p[1]+4], s2[p[2]], s2[p[3]+4] = s2[p[1]+4], s2[p[2]], s2[p[3]+4], s2[p[0]] | |
s2 = normalize(s2) | |
U.add(G[s2+(1-s[8],)]) | |
U2 = set() | |
for p in permutations(range(4)): | |
s2 = list(s[:8]) | |
s2[p[0]], s2[p[1]] = s2[p[1]], s2[p[0]] | |
s2[p[2]+4], s2[p[3]+4] = s2[p[3]+4], s2[p[2]+4] | |
s2 = normalize(s2) | |
U2.add(G[s2+(s[8],)]) | |
U = tuple(sorted(list(U))) | |
U2 = tuple(sorted(list(U2))) | |
#print(g, s, U, U2) | |
# 遷移先のグループが異なれば異なるグループにする。 | |
if (U, U2) not in U2G: | |
if len(U2G)==0: | |
U2G[(U, U2)] = g | |
else: | |
U2G[(U, U2)] = gn | |
gn += 1 | |
up = True | |
G2[s] = U2G[(U, U2)] | |
G = G2 | |
if not up: | |
break | |
for g in range(gn): | |
print(f"Group {g}") | |
U = set() | |
U2 = set() | |
for s in S: | |
if G[s]==g: | |
for p in permutations(range(4)): | |
s2 = list(s[:8]) | |
s2[p[0]], s2[p[1]+4], s2[p[2]], s2[p[3]+4] = s2[p[1]+4], s2[p[2]], s2[p[3]+4], s2[p[0]] | |
s2 = normalize(s2) | |
U.add(G[s2+(1-s[8],)]) | |
for p in permutations(range(4)): | |
s2 = list(s[:8]) | |
s2[p[0]], s2[p[1]] = s2[p[1]], s2[p[0]] | |
s2[p[2]+4], s2[p[3]+4] = s2[p[3]+4], s2[p[2]+4] | |
s2 = normalize(s2) | |
U2.add(G[s2+(s[8],)]) | |
print(s, analyse(s[:8])) | |
U = sorted(list(U)) | |
U2 = sorted(list(U2)) | |
print(f"U: {U}") | |
print(f"U2: {U2}") | |
print() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Group 0 | |
('DX', 'DX', 'UX', 'UX', 'UY', 'UY', 'DY', 'DY', 0) Solved+Solved | |
('DX', 'DX', 'UX', 'UX', 'DY', 'DY', 'UY', 'UY', 0) Solved+Solved | |
U: [2] | |
U2: [0] | |
Group 1 | |
('DX', 'DX', 'DY', 'UX', 'UX', 'UY', 'UY', 'DY', 0) Bar/Slash+OneBar | |
('DX', 'DX', 'DY', 'UX', 'UY', 'UY', 'DY', 'UX', 0) Bar/Slash+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UX', 'UY', 'DY', 0) Bars+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'DY', 'UX', 'UY', 0) Solved+OneBar | |
U: [5, 11] | |
U2: [13, 16] | |
Group 2 | |
('DX', 'DX', 'DY', 'DY', 'UX', 'UX', 'UY', 'UY', 1) Slashes+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UY', 'UX', 'DY', 1) Bars+OneFace | |
('DX', 'DX', 'UY', 'UY', 'UX', 'UX', 'DY', 'DY', 1) Solved+OneFace | |
U: [0, 4] | |
U2: [2, 3] | |
Group 3 | |
('DX', 'DX', 'DY', 'DY', 'UY', 'UY', 'UX', 'UX', 1) Slashes+OneFace | |
('DX', 'DX', 'UY', 'UY', 'DY', 'DY', 'UX', 'UX', 1) Solved+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DY', 'UX', 'UY', 'DX', 1) Bars+OneFace | |
U: [4, 7] | |
U2: [2, 3] | |
Group 4 | |
('DX', 'DY', 'UX', 'UY', 'DX', 'DY', 'UY', 'UX', 0) Solved+Bars | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UX', 'UY', 'UX', 0) Bar/Slash+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UX', 'DY', 'UY', 0) Bars+Bars | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UY', 'UX', 'DY', 0) Bar/Slash+Bars | |
U: [2, 3, 5, 12] | |
U2: [4, 6] | |
Group 5 | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UX', 'DY', 'UY', 1) Bars+OneBar | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UY', 'UY', 'UX', 1) Bar/Slash+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UX', 'UY', 'DY', 1) Bars+OneBar | |
('DX', 'DX', 'DY', 'UX', 'UX', 'UY', 'DY', 'UY', 1) Bar/Slash+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UY', 'UX', 'DY', 1) Bars+OneBar | |
('DX', 'DX', 'DY', 'UX', 'UX', 'UY', 'UY', 'DY', 1) Bar/Slash+OneBar | |
U: [1, 4, 6, 13] | |
U2: [5, 12] | |
Group 6 | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UY', 'DY', 'UX', 0) Bar/Slash+Bars | |
('DX', 'DY', 'UX', 'UY', 'DY', 'UY', 'DX', 'UX', 0) Bars+Bars | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UX', 'UX', 'UY', 0) Bar/Slash+Bars | |
('DX', 'DY', 'UX', 'UY', 'UX', 'UY', 'DY', 'DX', 0) Solved+Bars | |
U: [5, 9, 12, 23] | |
U2: [4, 6] | |
Group 7 | |
('DX', 'DY', 'UX', 'UY', 'UY', 'UX', 'DY', 'DX', 0) Solved+OneFace | |
('DX', 'DX', 'UY', 'UY', 'DY', 'DY', 'UX', 'UX', 0) Solved+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DY', 'DX', 'UY', 'UX', 0) Solved+OneFace | |
('DX', 'DX', 'DY', 'DY', 'UY', 'UY', 'UX', 'UX', 0) Slashes+OneFace | |
U: [3, 11] | |
U2: [7, 10] | |
Group 8 | |
('DX', 'DX', 'DY', 'DY', 'UX', 'UY', 'UX', 'UY', 0) Slashes+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UX', 'UY', 'DY', 0) Bars+Bars | |
('DX', 'DX', 'UY', 'UY', 'DY', 'UX', 'DY', 'UX', 0) Bars+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UY', 'DY', 'UX', 0) Bars+Bars | |
U: [9, 17, 21, 22] | |
U2: [8] | |
Group 9 | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UY', 'UX', 'UX', 1) Bar/Slash+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DY', 'DX', 'UY', 'UX', 1) Solved+OneFace | |
('DX', 'DY', 'UX', 'UY', 'UY', 'UX', 'DY', 'DX', 1) Solved+OneFace | |
U: [6, 8, 19] | |
U2: [9, 17, 23] | |
Group 10 | |
('DX', 'DX', 'DY', 'DY', 'UX', 'UX', 'UY', 'UY', 0) Slashes+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DX', 'DY', 'UX', 'UY', 0) Solved+OneFace | |
('DX', 'DX', 'UY', 'UY', 'UX', 'UX', 'DY', 'DY', 0) Solved+OneFace | |
('DX', 'DY', 'UX', 'UY', 'UX', 'UY', 'DX', 'DY', 0) Solved+OneFace | |
U: [11, 18] | |
U2: [7, 10] | |
Group 11 | |
('DX', 'DY', 'UX', 'UY', 'UX', 'UY', 'DY', 'DX', 1) Solved+Bars | |
('DX', 'DX', 'UY', 'UY', 'DY', 'UX', 'DY', 'UX', 1) Bars+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UX', 'DY', 'UY', 1) Bars+Bars | |
('DX', 'DX', 'DY', 'DY', 'UX', 'UY', 'UX', 'UY', 1) Slashes+Bars | |
('DX', 'DY', 'UX', 'UY', 'DY', 'UY', 'DX', 'UX', 1) Bars+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'DY', 'UY', 'UX', 1) Solved+Bars | |
U: [1, 7, 10, 16] | |
U2: [11] | |
Group 12 | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UY', 'DY', 'UX', 1) Bars+OneBar | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UY', 'UX', 'UY', 1) Bar/Slash+OneBar | |
U: [4, 6] | |
U2: [5] | |
Group 13 | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UX', 'UY', 'UY', 0) Bar/Slash+OneBar | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UY', 'UY', 'UX', 0) Bar/Slash+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UY', 'UX', 'DY', 0) Bars+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UX', 'DY', 'UY', 0) Bars+OneBar | |
('DX', 'DX', 'DY', 'UX', 'UX', 'UY', 'DY', 'UY', 0) Bar/Slash+OneBar | |
('DX', 'DX', 'UX', 'UY', 'UX', 'UY', 'DY', 'DY', 0) Solved+OneBar | |
U: [5, 15, 22] | |
U2: [1, 13, 16] | |
Group 14 | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UX', 'DY', 'UY', 0) Bar/Slash+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UY', 'UX', 'DY', 0) Bars+OneFace | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UX', 'UY', 'DY', 0) Bar/Slash+OneFace | |
U: [15, 18] | |
U2: [14, 19] | |
Group 15 | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UX', 'UX', 'UY', 1) Bar/Slash+Bars | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UY', 'UX', 'DY', 1) Bar/Slash+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UY', 'DY', 'UX', 1) Bars+Bars | |
('DX', 'DY', 'UX', 'UY', 'DX', 'UX', 'UY', 'DY', 1) Bars+Bars | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UY', 'DY', 'UX', 1) Bar/Slash+Bars | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UX', 'UY', 'UX', 1) Bar/Slash+Bars | |
U: [13, 14, 16, 19] | |
U2: [15] | |
Group 16 | |
('DX', 'DX', 'UX', 'UY', 'DY', 'DY', 'UY', 'UX', 0) Solved+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'UY', 'DY', 'UX', 0) Bars+OneBar | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UY', 'UX', 'UY', 0) Bar/Slash+OneBar | |
('DX', 'DX', 'DY', 'UX', 'UY', 'UY', 'UX', 'DY', 0) Bar/Slash+OneBar | |
U: [11, 15] | |
U2: [1, 13] | |
Group 17 | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UX', 'UY', 'DY', 1) Bar/Slash+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DX', 'DY', 'UX', 'UY', 1) Solved+OneFace | |
U: [8, 20] | |
U2: [9, 23] | |
Group 18 | |
('DX', 'DX', 'UX', 'UX', 'DY', 'DY', 'UY', 'UY', 1) Solved+Solved | |
('DX', 'DX', 'UX', 'UX', 'UY', 'UY', 'DY', 'DY', 1) Solved+Solved | |
('DX', 'DX', 'UX', 'UX', 'DY', 'UY', 'DY', 'UY', 1) Bars+Solved | |
U: [10, 14] | |
U2: [18] | |
Group 19 | |
('DX', 'DX', 'DY', 'UY', 'DY', 'UY', 'UX', 'UX', 0) Bar/Slash+OneFace | |
('DX', 'DY', 'UX', 'UY', 'DY', 'UX', 'UY', 'DX', 0) Bars+OneFace | |
U: [9, 15] | |
U2: [14, 19] | |
Group 20 | |
('DX', 'DX', 'UX', 'UX', 'DY', 'UY', 'DY', 'UY', 0) Bars+Solved | |
U: [17, 23] | |
U2: [20] | |
Group 21 | |
('DX', 'DX', 'DY', 'UX', 'UY', 'UY', 'UX', 'DY', 1) Bar/Slash+OneBar | |
('DX', 'DX', 'UX', 'UY', 'DY', 'DY', 'UY', 'UX', 1) Solved+OneBar | |
U: [8] | |
U2: [22] | |
Group 22 | |
('DX', 'DX', 'UX', 'UY', 'DY', 'DY', 'UX', 'UY', 1) Solved+OneBar | |
('DX', 'DX', 'UX', 'UY', 'UX', 'UY', 'DY', 'DY', 1) Solved+OneBar | |
('DX', 'DX', 'DY', 'UX', 'UY', 'UY', 'DY', 'UX', 1) Bar/Slash+OneBar | |
('DX', 'DX', 'DY', 'UX', 'DY', 'UX', 'UY', 'UY', 1) Bar/Slash+OneBar | |
U: [8, 13] | |
U2: [21, 22] | |
Group 23 | |
('DX', 'DY', 'UX', 'UY', 'UX', 'UY', 'DX', 'DY', 1) Solved+OneFace | |
('DX', 'DX', 'DY', 'UY', 'UX', 'UX', 'DY', 'UY', 1) Bar/Slash+OneFace | |
U: [6, 20] | |
U2: [9, 17] | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment