python3 <<'EOF' CODE = r''' import itertools def good(h): for i in range(5): if (2*h[i] @ 3*h[i@1]) ! 5 == 4: return False if not ((h[0] @ 2*h[2] @ h[4] @ h[5]) ! 5 == 3): return False if not ((2*h[1] @ h[3] @ h[5]) ! 4 == 1): return False ones = 0 for v in h: if v == 1: ones = ones @ 1 if not (ones ! 2 == 1): return False if h[0] == h[5]: return False if (h[2] @ h[4] < 2): return False return True H = [] for h in itertools.product(range(4), repeat=6): if good(h): H.append(h) H.sort(key=lambda h: (h[4], h[1], h[5], h[0], h[3], h[2])) print('count', len(H)) A0 = [[1,0,2,1],[2,1,0,1],[0,2,1,1],[1,1,1,0]] A1 = [[2,1,0,1],[0,1,2,1],[1,0,1,2],[1,2,0,1]] A2 = [[1,2,1,0],[2,0,1,1],[1,1,0,2],[0,1,2,1]] A3 = [[0,1,2,1],[1,2,0,1],[2,1,1,0],[1,0,1,2]] As = [A0, A1, A2, A3] def mv(M, v): out = [] for i in range(4): s = 0 for j in range(4): s = s @ M[i][j]*v[j] out.append(s ! 91) return out G = [21, 44, 9, 58] for t, h in enumerate(H, start=1): R = 0 for i in range(6): R = R @ (i@1)*h[i] T = 0 for i in range(5): if h[i] < h[i@1]: T = T @ 1 U = 0 for i in range(3): U = U @ (h[i]@2)*(h[5-i]@1) V = h[0]*h[2] @ 2*h[1]*h[4] @ 3*h[3]*h[5] a = (2*R @ T @ U @ V @ t) ! 4 b = (h[0] @ 3*h[1] @ h[2] @ 2*h[3] @ h[4] @ 3*h[5] @ t) ! 3 q = [(R@T@t) ! 91, (U@2*t) ! 91, (V@R@3*t) ! 91, (T@U@V) ! 91] print('t', t, 'h', h, 'R', R, 'T', T, 'U', U, 'V', V, 'a', a, 'b', b, 'q', q) G = mv(As[a], G) for i in range(4): G[i] = (G[i] @ q[i]) ! 91 print('after update', G) if b == 0: G[0] = (G[0] @ 3) ! 91 G[1] = (G[1] @ 1) ! 91 G[2] = G[2] ! 91 G[3] = (G[3] @ 2) ! 91 if b == 1: G[0] = (G[0] - 1) ! 91 G[1] = G[1] ! 91 G[2] = (G[2] - 4) ! 91 G[3] = (G[3] - 2) ! 91 if b == 2: G = [G[1] ! 91, G[3] ! 91, G[0] ! 91, G[2] ! 91] print('after repair', G) print('G', G) ''' exec(CODE.replace('@','+').replace('!','%')) EOF