def setSlice(self, n): sliceE = [11, 10, 9, 8] otherE = [7, 6, 5, 4, 3, 2, 1, 0] for i in range(12): if n - binomial(11 - i, len(sliceE)) >= 0: n -= binomial(11 - i, len(sliceE)) self.ep[i] = sliceE.pop() else: self.ep[i] = otherE.pop()
def setSliceSorted(self, n): sliceE = [8, 9, 10, 11] otherE = [7, 6, 5, 4, 3, 2, 1, 0] m = n % 24 n = n // 24 for i in range(1, 4): k = m % (i + 1) m //= i + 1 while k > 0: rotRight(sliceE, 0, i) k -= 1 sliceE = sliceE[::-1] for i in range(12): if n - binomial(11 - i, len(sliceE)) >= 0: n -= binomial(11 - i, len(sliceE)) self.ep[i] = sliceE.pop() else: self.ep[i] = otherE.pop()
def getSlice(self): # UD-Slice : position of edges FR, FL, BL, BR without permutation : 4 parmi 12 n = 0 x = 1 for i in range(11, -1, -1): if self.ep[i] in {8, 9, 10, 11}: n += binomial(11 - i, x) x += 1 return n
def setDownEdges(self, n): sliceE = [4, 5, 6, 7] otherE = [3, 2, 1, 0, 11, 10, 9, 8] m = n % 24 # Permutation n = n // 24 # Location for i in range(1, 4): k = m % (i + 1) m //= i + 1 while k > 0: rotRight(sliceE, 0, i) k -= 1 sliceE = sliceE[::-1] for i in range(12): if n - binomial(11 - i, len(sliceE)) >= 0: n -= binomial(11 - i, len(sliceE)) self.ep[i] = sliceE.pop() else: self.ep[i] = otherE.pop() for _ in range(4): rotLeft(self.ep, 0, 11)
def getSliceSorted(self): # UD-Slice : position of edges FR, FL, BL, BR with permutation # 12 * 11 * 10 * 9 = 11880 # < 11880 in phase 1, < 24 in phase 2, 0 for solved cube n = 0 edge = [] # n < 495 (4 parmi 12) for i in range(11, -1, -1): if self.ep[i] in {8, 9, 10, 11}: n += binomial(11 - i, len(edge) + 1) edge.append(self.ep[i]) # m < 24 (4!) permutations edge = edge[::-1] m = 0 for i in range(3, 0, -1): k = 0 while edge[i] != i + 8: rotLeft(edge, 0, i) k += 1 m = (i + 1) * m + k return 24 * n + m
def getDownEdges(self): # DownEdges : position of edges DR, DF, DL, DB with permutation # 12 * 11 * 10 * 9 = 11880 # < 11880 in phase 1, < 1656 + 24 in phase 2, 1656 for solved cube n = 0 edge = [] ep = self.ep[8:] + self.ep[:8] # n < 495 (4 parmi 12) for i in range(11, -1, -1): if ep[i] in {4, 5, 6, 7}: n += binomial(11 - i, len(edge) + 1) edge.append(ep[i]) # m < 24 (4!) permutations edge = edge[::-1] m = 0 for i in range(3, 0, -1): k = 0 while edge[i] != i + 4: rotLeft(edge, 0, i) k += 1 m = (i + 1) * m + k return 24 * n + m