diff --git a/cube/cube_net.png b/cube/cube_net.png new file mode 100644 index 0000000..f815aeb Binary files /dev/null and b/cube/cube_net.png differ diff --git a/cube/solver.py b/cube/solver.py new file mode 100644 index 0000000..8ae700f --- /dev/null +++ b/cube/solver.py @@ -0,0 +1,687 @@ +class Cube: + """ + Stores and manipulates the cube + + This class stores the cube in form of matrix and contains functions to manipulate the cube. A piece of cube is set of indices of the matrix. + + Variables: + matrix: An array of shape 6*3*3 + |4| |O| + |2|5|3| <-> |G|Y|B| + |1| |R| + |0| |W| + + 0 - Bottom + 1 - Front + 2 - Left + 3 - Right + 4 - Back + 5 - Top + + Constants: + center_pieces: An array of center pieces of the cube + corner_pieces: An array of corner pieces of the cube + edge_pieces: An array of edge pieces of the cube + """ + + matrix = [[[i]*3]*3 for i in range(6)] + + center_pieces = [{(0,1,1)}, {(1,1,1)}, {(2,1,1)}, {(3,1,1)}, {(4,1,1)}, {(5,1,1)}] + corner_pieces = [{(1,0,0),(2,0,2), (5,2,0)}, {(2,0,0), (4,0,2),(5,0,0)}, {(4,0,0),(3,0,2),(5,0,2)}, {(3,0,0),(1,0,2),(5,2,2)}, {(1,2,0), (2,2,2), (0,0,0)}, {(2,2,0), (4,2,2), (0,2,0)}, {(4,2,0), (3,2,2), (0,2,2)}, {(3,2,0), (1,2,2), (0,0,2)}] + edge_pieces = [{(5,2,1), (1,0,1)}, {(5,1,0), (2,0,1)}, {(5,0,1), (4,0,1)}, {(5,1,2), (3,0,1)}, {(1,1,0), (2,1,2)}, {(2,1,0), (4,1,2)}, {(4,1,0), (3,1,2)}, {(3,1,0), (1,1,2)}, {(0,0,1), (1,2,1)}, {(0,1,0), (2,2,1)}, {(0,2,1), (4,2,1)}, {(0,1,2), (3,2,1)}] + + top = 'Y' + bottom = 'W' + one = 'R' + two = 'G' + three = 'B' + four = 'O' + + def __init__(self, matrix=[]): + """ + Args: + matrix: An array of shape 6*3*3 containing any object + """ + if(len(matrix)==0): + self.matrix[0] = [['W', 'W', 'W'], ['W', 'W', 'W'], ['W', 'W', 'W']] + self.matrix[1] = [['R', 'R', 'R'], ['R', 'R', 'R'], ['R', 'R', 'R']] + self.matrix[2] = [['G', 'G', 'G'], ['G', 'G', 'G'], ['G', 'G', 'G']] + self.matrix[3] = [['B', 'B', 'B'], ['B', 'B', 'B'], ['B', 'B', 'B']] + self.matrix[4] = [['O', 'O', 'O'], ['O', 'O', 'O'], ['O', 'O', 'O']] + self.matrix[5] = [['Y', 'Y', 'Y'], ['Y', 'Y', 'Y'], ['Y', 'Y', 'Y']] + else: + self.matrix = matrix + + self.top = self.matrix[5][1][1] + self.bottom = self.matrix[0][1][1] + self.one = self.matrix[1][1][1] + self.two = self.matrix[2][1][1] + self.three = self.matrix[3][1][1] + self.four = self.matrix[4][1][1] + + def get_string_net(self): + """ + Returns the net of the cube that is printable on the console + + Returns: + str: The net of cube + """ + """ + |4| <-- g1 + |2|5|3| <-- g2 + |1| <-- g3 + |0| <-- g4 + """ + g1 = "\n".join([" "*(3) + " ".join([str(self.matrix[4][2-j][2-i]) for i in range(3)]) for j in range(3)]) + + g2 = "\n".join([" ".join([str(self.matrix[2][2-i][j]) for i in range(3)]) + " " + " ".join([str(i) for i in self.matrix[5][j]]) + " " + " ".join([str(self.matrix[3][i][2-j]) for i in range(3)]) for j in range(3)]) + + g3 = "\n".join([" "*(3) + " ".join([str(i) for i in self.matrix[1][j]]) for j in range(3)]) + + g4 = "\n".join([" "*(3) + " ".join([str(i) for i in self.matrix[0][j]]) for j in range(3)]) + + return "\n".join([g1, g2, g3, g4]) + + def get_color(self, index): + """ + Returns the color at the given index in the matrix + + Args: + index: tuple(int, int, int): An index of the matrix + + Returns: + Value of matrix at the "index" + """ + return self.matrix[index[0]][index[1]][index[2]] + + def is_index_of_center_piece(self, index): + """ + Args: + index: An index of "matrix" + + Returns: + true: If the index corresponds to a center piece in the cube + false: Otherwise + """ + if(index[-1]==index[-2]==1): + return True + else: + return False + + def is_index_of_corner_piece(self, index): + """ + Args: + index: An index of "matrix" + + Returns: + true: If the index corresponds to a corner piece in the cube + false: Otherwise + """ + if((index[-1]==0 or index[-1]==2) and (index[-2]==0 or index[-2]==2)): + return True + else: + return False + + def is_index_of_edge_piece(self, index): + """ + Args: + index: An index of "matrix" + + Returns: + true: If the index corresponds to an edge piece in the cube + false: Otherwise + """ + if(index[-1]+index[-2])%2==1: + return True + else: + return False + + def is_center_piece(self, piece): + """ + Args: + piece: A piece of the cube + + Returns: + true: If the "piece" is a center piece + """ + return set(piece) in self.center_pieces + + def is_corner_piece(self, piece): + """ + Args: + piece: A piece of the cube + + Returns: + true: If the "piece" is a corner piece + """ + return set(piece) in self.corner_pieces + + def is_edge_piece(self, piece): + """ + Args: + piece: A piece of the cube + + Returns: + true: If the "piece" is an edge piece + """ + return set(piece) in self.edge_pieces + + def get_piece(self, colors): + """ + Returns a piece that has the given colors + + Args: + colors: list: Colors to search for + + Returns: + list(tuple): Piece corresponding to the colors + """ + #TODO: Make it work + if(len(colors)==1): + ans_piece = [] + color = list(colors)[0] + for piece in self.center_pieces: + if(self.get_color(list(piece)[0])==color): + ans_piece = list(piece) + break + return ans_piece + elif(len(colors)==2): + ans_piece = [] + for piece in self.edge_pieces: + temp_ans = [] + temp = list(piece) + for color in colors: + match = False + for i in range(len(temp)): + if(self.get_color(temp[i])==color): + temp_ans.append(temp[i]) + temp.pop(i) + match = True + break + if(not match): + break + if(len(temp_ans)==2): + ans_piece = temp_ans + break + return ans_piece + elif(len(colors)==3): + ans_piece = [] + for piece in self.corner_pieces: + temp_ans = [] + temp = list(piece) + for color in colors: + match = False + for i in range(len(temp)): + if(self.get_color(temp[i])==color): + temp_ans.append(temp[i]) + temp.pop(i) + match = True + break + if(not match): + break + if(len(temp_ans)==3): + ans_piece = temp_ans + break + return ans_piece + else: + return [] + + def rotate(self, move): + """ + Rotates the cube/face(s) of cube as per the given move + + Args: + move: A standard cube move + """ + #Handling whole cube rotations + if(move==Rotations.X): + """ + |4| |4| + |2|5|3| -> |0|2|5| + |1| |1| + |0| |3| + """ + self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2], self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2], self.matrix[4][2][2], self.matrix[4][2][1], self.matrix[4][2][0], self.matrix[4][1][2], self.matrix[4][1][1], self.matrix[4][1][0], self.matrix[4][0][2], self.matrix[4][0][1], self.matrix[4][0][0], self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2] = self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2], self.matrix[4][2][2], self.matrix[4][2][1], self.matrix[4][2][0], self.matrix[4][1][2], self.matrix[4][1][1], self.matrix[4][1][0], self.matrix[4][0][2], self.matrix[4][0][1], self.matrix[4][0][0], self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2] + + self.matrix[3][0][0], self.matrix[3][0][1], self.matrix[3][0][2], self.matrix[3][1][0], self.matrix[3][1][1], self.matrix[3][1][2], self.matrix[3][2][0], self.matrix[3][2][1], self.matrix[3][2][2] = self.matrix[3][2][0], self.matrix[3][1][0], self.matrix[3][0][0], self.matrix[3][2][1], self.matrix[3][1][1], self.matrix[3][0][1], self.matrix[3][2][2], self.matrix[3][1][2], self.matrix[3][0][2] + + self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] = self.matrix[2][0][0], self.matrix[2][0][1], self.matrix[2][0][2], self.matrix[2][1][0], self.matrix[2][1][1], self.matrix[2][1][2], self.matrix[2][2][0], self.matrix[2][2][1], self.matrix[2][2][2] + elif(move==Rotations.X_prime): + """ + |4| |0| + |2|5|3| -> |2|4|3| + |1| |5| + |0| |1| + """ + self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2], self.matrix[4][2][2], self.matrix[4][2][1], self.matrix[4][2][0], self.matrix[4][1][2], self.matrix[4][1][1], self.matrix[4][1][0], self.matrix[4][0][2], self.matrix[4][0][1], self.matrix[4][0][0], self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2] = self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2], self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2], self.matrix[4][2][2], self.matrix[4][2][1], self.matrix[4][2][0], self.matrix[4][1][2], self.matrix[4][1][1], self.matrix[4][1][0], self.matrix[4][0][2], self.matrix[4][0][1], self.matrix[4][0][0], self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2] + + self.matrix[3][2][0], self.matrix[3][1][0], self.matrix[3][0][0], self.matrix[3][2][1], self.matrix[3][1][1], self.matrix[3][0][1], self.matrix[3][2][2], self.matrix[3][1][2], self.matrix[3][0][2] = self.matrix[3][0][0], self.matrix[3][0][1], self.matrix[3][0][2], self.matrix[3][1][0], self.matrix[3][1][1], self.matrix[3][1][2], self.matrix[3][2][0], self.matrix[3][2][1], self.matrix[3][2][2] + + self.matrix[2][0][0], self.matrix[2][0][1], self.matrix[2][0][2], self.matrix[2][1][0], self.matrix[2][1][1], self.matrix[2][1][2], self.matrix[2][2][0], self.matrix[2][2][1], self.matrix[2][2][2] = self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] + elif(move==Rotations.Y): + """ + |4| |2| + |2|5|3| -> |1|5|4| + |1| |3| + |0| |0| + """ + self.matrix[0], self.matrix[1], self.matrix[2], self.matrix[3],self.matrix[4], self.matrix[5] = self.matrix[0], self.matrix[3], self.matrix[1], self.matrix[4],self.matrix[2], self.matrix[5] + + self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2] = self.matrix[5][2][0], self.matrix[5][1][0], self.matrix[5][0][0], self.matrix[5][2][1], self.matrix[5][1][1], self.matrix[5][0][1], self.matrix[5][2][2], self.matrix[5][1][2], self.matrix[5][0][2] + + self.matrix[0][2][0], self.matrix[0][1][0], self.matrix[0][0][0], self.matrix[0][2][1], self.matrix[0][1][1], self.matrix[0][0][1], self.matrix[0][2][2], self.matrix[0][1][2], self.matrix[0][0][2] = self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2] + elif(move==Rotations.Y_prime): + """ + |4| |3| + |2|5|3| -> |4|5|1| + |1| |2| + |0| |0| + """ + self.matrix[0], self.matrix[1], self.matrix[2], self.matrix[3],self.matrix[4], self.matrix[5] = self.matrix[0], self.matrix[2], self.matrix[4], self.matrix[1],self.matrix[3], self.matrix[5] + + self.matrix[5][2][0], self.matrix[5][1][0], self.matrix[5][0][0], self.matrix[5][2][1], self.matrix[5][1][1], self.matrix[5][0][1], self.matrix[5][2][2], self.matrix[5][1][2], self.matrix[5][0][2] = self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2] + + self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2] = self.matrix[0][2][0], self.matrix[0][1][0], self.matrix[0][0][0], self.matrix[0][2][1], self.matrix[0][1][1], self.matrix[0][0][1], self.matrix[0][2][2], self.matrix[0][1][2], self.matrix[0][0][2] + elif(move==Rotations.Z): + """ + |4| |4| + |2|5|3| -> |0|2|5| + |1| |1| + |0| |3| + """ + self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0], self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] = self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2], self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0] + + self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2] = self.matrix[1][2][0], self.matrix[1][1][0], self.matrix[1][0][0], self.matrix[1][2][1], self.matrix[1][1][1], self.matrix[1][0][1], self.matrix[1][2][2], self.matrix[1][1][2], self.matrix[1][0][2] + + self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2] = self.matrix[4][0][0], self.matrix[4][0][1], self.matrix[4][0][2], self.matrix[4][1][0], self.matrix[4][1][1], self.matrix[4][1][2], self.matrix[4][2][0], self.matrix[4][2][1], self.matrix[4][2][2] + elif(move==Rotations.Z_prime): + """ + |4| |4| + |2|5|3| -> |5|3|0| + |1| |1| + |0| |2| + """ + self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2], self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0] = self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0], self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] + + self.matrix[1][2][0], self.matrix[1][1][0], self.matrix[1][0][0], self.matrix[1][2][1], self.matrix[1][1][1], self.matrix[1][0][1], self.matrix[1][2][2], self.matrix[1][1][2], self.matrix[1][0][2] = self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2] + + self.matrix[4][0][0], self.matrix[4][0][1], self.matrix[4][0][2], self.matrix[4][1][0], self.matrix[4][1][1], self.matrix[4][1][2], self.matrix[4][2][0], self.matrix[4][2][1], self.matrix[4][2][2] = self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2] + + #Handling face rotations + elif(move==Rotations.U): + """ + Top face rotates 90 degress clockwise + """ + self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2] = self.matrix[5][2][0], self.matrix[5][1][0], self.matrix[5][0][0], self.matrix[5][2][1], self.matrix[5][1][1], self.matrix[5][0][1], self.matrix[5][2][2], self.matrix[5][1][2], self.matrix[5][0][2] + + self.matrix[1][0], self.matrix[3][0], self.matrix[4][0], self.matrix[2][0] = self.matrix[3][0], self.matrix[4][0], self.matrix[2][0], self.matrix[1][0] + elif(move==Rotations.U_prime): + """ + Top face rotates 90 degress counter clockwise + """ + self.matrix[5][2][0], self.matrix[5][1][0], self.matrix[5][0][0], self.matrix[5][2][1], self.matrix[5][1][1], self.matrix[5][0][1], self.matrix[5][2][2], self.matrix[5][1][2], self.matrix[5][0][2] = self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2] + + self.matrix[3][0], self.matrix[4][0], self.matrix[2][0], self.matrix[1][0] = self.matrix[1][0], self.matrix[3][0], self.matrix[4][0], self.matrix[2][0] + elif(move==Rotations.L): + """ + Left face rotates 90 degress clockwise + """ + self.matrix[2][0][0], self.matrix[2][0][1], self.matrix[2][0][2], self.matrix[2][1][0], self.matrix[2][1][1], self.matrix[2][1][2], self.matrix[2][2][0], self.matrix[2][2][1], self.matrix[2][2][2] = self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] + + self.matrix[1][0][0], self.matrix[1][1][0], self.matrix[1][2][0], self.matrix[0][0][0], self.matrix[0][1][0], self.matrix[0][2][0], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2], self.matrix[5][0][0], self.matrix[5][1][0], self.matrix[5][2][0] = self.matrix[5][0][0], self.matrix[5][1][0], self.matrix[5][2][0],self.matrix[1][0][0], self.matrix[1][1][0], self.matrix[1][2][0],self.matrix[0][0][0], self.matrix[0][1][0], self.matrix[0][2][0], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2] + elif(move==Rotations.L_prime): + """ + Left face rotates 90 degress counterclockwise + """ + self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] = self.matrix[2][0][0], self.matrix[2][0][1], self.matrix[2][0][2], self.matrix[2][1][0], self.matrix[2][1][1], self.matrix[2][1][2], self.matrix[2][2][0], self.matrix[2][2][1], self.matrix[2][2][2] + + self.matrix[5][0][0], self.matrix[5][1][0], self.matrix[5][2][0],self.matrix[1][0][0], self.matrix[1][1][0], self.matrix[1][2][0],self.matrix[0][0][0], self.matrix[0][1][0], self.matrix[0][2][0], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2] = self.matrix[1][0][0], self.matrix[1][1][0], self.matrix[1][2][0], self.matrix[0][0][0], self.matrix[0][1][0], self.matrix[0][2][0], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2], self.matrix[5][0][0], self.matrix[5][1][0], self.matrix[5][2][0] + elif(move==Rotations.F): + """ + Front face rotates 90 degress clockwise + """ + self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2] = self.matrix[1][2][0], self.matrix[1][1][0], self.matrix[1][0][0], self.matrix[1][2][1], self.matrix[1][1][1], self.matrix[1][0][1], self.matrix[1][2][2], self.matrix[1][1][2], self.matrix[1][0][2] + + self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] = self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2],self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0] + elif(move==Rotations.F_prime): + """ + Front face rotates 90 degress counterclockwise + """ + self.matrix[1][2][0], self.matrix[1][1][0], self.matrix[1][0][0], self.matrix[1][2][1], self.matrix[1][1][1], self.matrix[1][0][1], self.matrix[1][2][2], self.matrix[1][1][2], self.matrix[1][0][2] = self.matrix[1][0][0], self.matrix[1][0][1], self.matrix[1][0][2], self.matrix[1][1][0], self.matrix[1][1][1], self.matrix[1][1][2], self.matrix[1][2][0], self.matrix[1][2][1], self.matrix[1][2][2] + + self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2],self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0] = self.matrix[5][2][0], self.matrix[5][2][1], self.matrix[5][2][2], self.matrix[3][0][0], self.matrix[3][1][0], self.matrix[3][2][0], self.matrix[0][0][2], self.matrix[0][0][1], self.matrix[0][0][0], self.matrix[2][2][2], self.matrix[2][1][2], self.matrix[2][0][2] + elif(move==Rotations.R): + """ + Right face rotates 90 degress clockwise + """ + self.matrix[3][0][0], self.matrix[3][0][1], self.matrix[3][0][2], self.matrix[3][1][0], self.matrix[3][1][1], self.matrix[3][1][2], self.matrix[3][2][0], self.matrix[3][2][1], self.matrix[3][2][2] = self.matrix[3][2][0], self.matrix[3][1][0], self.matrix[3][0][0], self.matrix[3][2][1], self.matrix[3][1][1], self.matrix[3][0][1], self.matrix[3][2][2], self.matrix[3][1][2], self.matrix[3][0][2] + + self.matrix[1][0][2], self.matrix[1][1][2], self.matrix[1][2][2], self.matrix[0][0][2], self.matrix[0][1][2], self.matrix[0][2][2], self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0], self.matrix[5][0][2], self.matrix[5][1][2], self.matrix[5][2][2] = self.matrix[0][0][2], self.matrix[0][1][2], self.matrix[0][2][2], self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0],self.matrix[5][0][2], self.matrix[5][1][2], self.matrix[5][2][2],self.matrix[1][0][2], self.matrix[1][1][2], self.matrix[1][2][2] + elif(move==Rotations.R_prime): + """ + Right face rotates 90 degress counterclockwise + """ + self.matrix[3][2][0], self.matrix[3][1][0], self.matrix[3][0][0], self.matrix[3][2][1], self.matrix[3][1][1], self.matrix[3][0][1], self.matrix[3][2][2], self.matrix[3][1][2], self.matrix[3][0][2] = self.matrix[3][0][0], self.matrix[3][0][1], self.matrix[3][0][2], self.matrix[3][1][0], self.matrix[3][1][1], self.matrix[3][1][2], self.matrix[3][2][0], self.matrix[3][2][1], self.matrix[3][2][2] + + self.matrix[0][0][2], self.matrix[0][1][2], self.matrix[0][2][2], self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0],self.matrix[5][0][2], self.matrix[5][1][2], self.matrix[5][2][2],self.matrix[1][0][2], self.matrix[1][1][2], self.matrix[1][2][2] = self.matrix[1][0][2], self.matrix[1][1][2], self.matrix[1][2][2], self.matrix[0][0][2], self.matrix[0][1][2], self.matrix[0][2][2], self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0], self.matrix[5][0][2], self.matrix[5][1][2], self.matrix[5][2][2] + elif(move==Rotations.B): + """ + Back face rotates 90 degress clockwise + """ + self.matrix[4][0][0], self.matrix[4][0][1], self.matrix[4][0][2], self.matrix[4][1][0], self.matrix[4][1][1], self.matrix[4][1][2], self.matrix[4][2][0], self.matrix[4][2][1], self.matrix[4][2][2] = self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2] + + self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0] = self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0],self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2] + elif(move==Rotations.B_prime): + """ + Back face rotates 90 degress counterclockwise + """ + self.matrix[4][2][0], self.matrix[4][1][0], self.matrix[4][0][0], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1], self.matrix[4][2][2], self.matrix[4][1][2], self.matrix[4][0][2] = self.matrix[4][0][0], self.matrix[4][0][1], self.matrix[4][0][2], self.matrix[4][1][0], self.matrix[4][1][1], self.matrix[4][1][2], self.matrix[4][2][0], self.matrix[4][2][1], self.matrix[4][2][2] + + self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0],self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2] = self.matrix[5][0][0], self.matrix[5][0][1], self.matrix[5][0][2], self.matrix[3][0][2], self.matrix[3][1][2], self.matrix[3][2][2], self.matrix[0][2][2], self.matrix[0][2][1], self.matrix[0][2][0], self.matrix[2][2][0], self.matrix[2][1][0], self.matrix[2][0][0] + elif(move==Rotations.D): + """ + Bottom face rotates 90 degress clockwise + """ + self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2] = self.matrix[0][2][0], self.matrix[0][1][0], self.matrix[0][0][0], self.matrix[0][2][1], self.matrix[0][1][1], self.matrix[0][0][1], self.matrix[0][2][2], self.matrix[0][1][2], self.matrix[0][0][2] + + self.matrix[1][2], self.matrix[3][2], self.matrix[4][2], self.matrix[2][2] = self.matrix[2][2], self.matrix[1][2], self.matrix[3][2], self.matrix[4][2] + elif(move==Rotations.D_prime): + """ + Bottom face rotates 90 degress counterclockwise + """ + self.matrix[0][2][0], self.matrix[0][1][0], self.matrix[0][0][0], self.matrix[0][2][1], self.matrix[0][1][1], self.matrix[0][0][1], self.matrix[0][2][2], self.matrix[0][1][2], self.matrix[0][0][2] = self.matrix[0][0][0], self.matrix[0][0][1], self.matrix[0][0][2], self.matrix[0][1][0], self.matrix[0][1][1], self.matrix[0][1][2], self.matrix[0][2][0], self.matrix[0][2][1], self.matrix[0][2][2] + + self.matrix[2][2], self.matrix[1][2], self.matrix[3][2], self.matrix[4][2] = self.matrix[1][2], self.matrix[3][2], self.matrix[4][2], self.matrix[2][2] + + #Handling slicing turns + elif(move==Rotations.M): + """ + Middle plane parallel to the view rotates 90 degrees clockwise, when viewed from the left face + """ + self.matrix[1][0][1], self.matrix[1][1][1], self.matrix[1][2][1], self.matrix[0][0][1], self.matrix[0][1][1], self.matrix[0][2][1], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1], self.matrix[5][0][1], self.matrix[5][1][1], self.matrix[5][2][1] = self.matrix[5][0][1], self.matrix[5][1][1], self.matrix[5][2][1], self.matrix[1][0][1], self.matrix[1][1][1], self.matrix[1][2][1], self.matrix[0][0][1], self.matrix[0][1][1], self.matrix[0][2][1], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1] + elif(move==Rotations.M_prime): + """ + Middle plane parallel to the view rotates 90 degrees counterclockwise, when viewed from the left face + """ + self.matrix[5][0][1], self.matrix[5][1][1], self.matrix[5][2][1], self.matrix[1][0][1], self.matrix[1][1][1], self.matrix[1][2][1], self.matrix[0][0][1], self.matrix[0][1][1], self.matrix[0][2][1], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1] = self.matrix[1][0][1], self.matrix[1][1][1], self.matrix[1][2][1], self.matrix[0][0][1], self.matrix[0][1][1], self.matrix[0][2][1], self.matrix[4][2][1], self.matrix[4][1][1], self.matrix[4][0][1], self.matrix[5][0][1], self.matrix[5][1][1], self.matrix[5][2][1] + elif(move==Rotations.E): + """ + Middle plane parallel to the view rotates 90 degrees clockwise, when viewed from the bottom face + """ + self.matrix[1][1], self.matrix[3][1], self.matrix[4][1], self.matrix[2][1] = self.matrix[2][1], self.matrix[1][1], self.matrix[3][1], self.matrix[4][1] + elif(move==Rotations.E_prime): + """ + Middle plane parallel to the view rotates 90 degrees counterclockwise, when viewed from the bottom face + """ + self.matrix[2][1], self.matrix[1][1], self.matrix[3][1], self.matrix[4][1] = self.matrix[1][1], self.matrix[3][1], self.matrix[4][1], self.matrix[2][1] + elif(move==Rotations.S): + """ + Middle plane parallel to the view rotates 90 degrees clockwise, when viewed from the front face + """ + self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1] = self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1],self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0] + elif(move==Rotations.S_prime): + """ + Middle plane parallel to the view rotates 90 degrees counterclockwise, when viewed from the front face + """ + self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1],self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0] = self.matrix[5][1][0], self.matrix[5][1][1], self.matrix[5][1][2], self.matrix[3][0][1], self.matrix[3][1][1], self.matrix[3][2][1], self.matrix[0][1][2], self.matrix[0][1][1], self.matrix[0][1][0], self.matrix[2][2][1], self.matrix[2][1][1], self.matrix[2][0][1] + + #Handling double layer turns + elif(move==Rotations.u): + """ + The top 2 faces rotate by 90 degrees clockwise + It is same as U + E_prime + """ + self.rotate(Rotations.U) + self.rotate(Rotations.E_prime) + + elif(move==Rotations.u_prime): + """ + The top 2 faces rotate by 90 degrees counterclockwise + It is same as U_prime + E + """ + self.rotate(Rotations.U_prime) + self.rotate(Rotations.E) + + elif(move==Rotations.l): + """ + The left 2 faces rotate by 90 degrees clockwise + It is same as L + M + """ + self.rotate(Rotations.L) + self.rotate(Rotations.M) + + elif(move==Rotations.l_prime): + """ + The left 2 faces rotate by 90 degrees counterclockwise + It is same as L_prime + M_prime + """ + self.rotate(Rotations.L_prime) + self.rotate(Rotations.M_prime) + + elif(move==Rotations.f): + """ + The front 2 faces rotate by 90 degrees clockwise + It is same as F + S + """ + self.rotate(Rotations.F) + self.rotate(Rotations.S) + + elif(move==Rotations.f_prime): + """ + The front 2 faces rotate by 90 degrees counterclockwise + It is same as F_prime + S_prime + """ + self.rotate(Rotations.F_prime) + self.rotate(Rotations.S_prime) + + elif(move==Rotations.r): + """ + The right 2 faces rotate by 90 degrees clockwise + It is same as R + M_prime + """ + self.rotate(Rotations.R) + self.rotate(Rotations.M_prime) + + elif(move==Rotations.r_prime): + """ + The right 2 faces rotate by 90 degrees counterclockwise + It is same as R_prime + M + """ + self.rotate(Rotations.R_prime) + self.rotate(Rotations.M) + + elif(move==Rotations.b): + """ + The back 2 faces rotate by 90 degrees clockwise + It is same as B + S_prime + """ + self.rotate(Rotations.B) + self.rotate(Rotations.S_prime) + + elif(move==Rotations.b_prime): + """ + The back 2 faces rotate by 90 degrees counterclockwise + It is same as B_prime + S + """ + self.rotate(Rotations.B_prime) + self.rotate(Rotations.S) + + elif(move==Rotations.d): + """ + The bottom 2 faces rotate by 90 degrees clockwise + It is same as D + E + """ + self.rotate(Rotations.D) + self.rotate(Rotations.E) + + elif(move==Rotations.d_prime): + """ + The bottom 2 faces rotate by 90 degrees counterclockwise + It is same as D_prime + E_prime + """ + self.rotate(Rotations.D_prime) + self.rotate(Rotations.E_prime) + + def apply_algorithm(self, algorithm): + """ + Applies the given algorithm on the cube + + Iterates through each move in the algorithm and applies them sequentially + + Args: + algorithm: A sequence of moves + """ + for move in algorithm: + if(isinstance(move, int)): + self.rotate([move]) + else: + self.apply_algorithm(move) + + def get_solution(self): + """ + This function finds an algorithm which when applied solves the scrambled cube + + Returns: + An algorithm that solves the cube + """ + #Making bottom cross + + +class Rotations: + """ + This class contains standard moves of a Rubik's Cube. + Each move is a singleton array. + + Moves can be directly added with each other and can repeated by multiplying with an integer. + + e.g. U2 F' X can be given by U*2 + F_prime + X + + A move or combination of move is termed as algorithm + """ + #Clockwise face rotations + U,L,F,R,B,D = [1],[2],[3],[4],[5],[6] + #Counterclockwise face rotations + U_prime, L_prime, F_prime, R_prime, B_prime, D_prime = [-1],[-2],[-3],[-4],[-5],[-6] + + #Slice turns + M, E, S = [13], [14], [15] + M_prime, E_prime, S_prime = [-13], [-14], [-15] + + #Whole cube rotations + X, Y, Z = [16], [17], [18] + X_prime, Y_prime, Z_prime = [-16], [-17], [-18] + + #Double layer turns + u,l,f,r,b,d = [7],[8],[9],[10],[11],[12] + #Inverse double layer turns + u_prime, l_prime, f_prime, r_prime, b_prime, d_prime = [-7],[-8],[-9],[-10],[-11],[-12] + + def reverse(self, algorithm): + """ + Args: + int[]: An algorithm + + Returns: + int[]: An algorithm that undoes the effect of the given algorithm + """ + rev = [] + for i in algorithm: + if(isinstance(i, int)): + rev.append(-i) + else: + rev.append(self.reverse(i)) + rev.reverse() + return rev + + def unnest(self, algorithm): + """ + Removes nesting from the algorithm + + Args: + algorithm: An algorithm + + Returns + list[int]: An algorithm without nesting + """ + new_algo = [] + for i in algorithm: + if(isinstance(i, int)): + new_algo.append(i) + else: + new_algo += self.unnest(i) + return new_algo + + def simplify_algorithm(self, algorithm): + """ + Removes the moves X, X', Y, Y', Z and Z' and changes the other moves so that the algorithm is unchanged + + Args: + algorithm: An algorithm + + Returns + An unnested algorithm without the moves X, X', Y, Y', Z and Z' + """ + #TODO: Make it work + X_dict = {self.U[0]: self.B, self.L[0]: self.L, self.F[0]: self.U, self.R[0]: self.R, self.B[0]: self.D, self.D[0]: self.F, self.U_prime[0]: self.B_prime, self.L_prime[0]: self.L_prime, self.F_prime[0]: self.U_prime, self.R_prime[0]: self.R_prime, self.B_prime[0]: self.D_prime, self.D_prime[0]: self.F_prime, self.M[0]: "M", self.E[0]: "E", self.S[0]: "S", self.M_prime[0]: "M'", self.E_prime[0]: "E'", self.S_prime[0]: "S'", self.X[0]: self.X*2, self.Y[0]: self.Z_prime, self.Z[0]: self.Y, self.X_prime[0]: [0], self.Y_prime[0]: self.Z, self.Z_prime[0]: self.Y_prime, self.u[0]: self.b, self.l[0]: self.l, self.f[0]: self.u, self.r[0]: self.r, self.b[0]: self.d, self.d[0]: self.f, self.u_prime[0]: self.b_prime, self.l_prime[0]: self.l_prime, self.f_prime[0]: self.u_prime, self.r_prime[0]: self.r_prime, self.b_prime[0]: self.d_prime, self.d_prime[0]: self.f_prime} + + new_algo = [] + algo = self.unnest(algorithm) + + + def algorithm_from_string(self, text: str): + """ + Converts the algorithm described in text into an executable algorithm + + e.g. text = "U2 F' X" will return U + U + F_prime + X + + Args: + text: An algorithm in form of string + + Returns: + int[]: An algorithm that can be applied on cube + """ + + dictionary = {"U":self.U, "L":self.L, "F":self.F, "R":self.R, "B":self.B, "D":self.D, "U'":self.U_prime, "L'":self.L_prime, "F'":self.F_prime, "R'":self.R_prime, "B'":self.B_prime, "D'":self.D_prime, "M":self.M, "E":self.E, "S":self.S, "M'":self.M_prime, "E'":self.E_prime, "S'":self.S_prime, "X":self.X, "Y":self.Y, "Z":self.Z, "X'":self.X_prime, "Y'":self.Y_prime, "Z'":self.Z_prime, "u":self.u, "l":self.l, "f":self.f, "r":self.r, "b":self.b, "d":self.d, "u'":self.u_prime, "l'":self.l_prime, "f'":self.f_prime, "r'":self.r_prime, "b'":self.b_prime, "d'":self.d_prime} + parts = text.strip().split() + algo = [] + for part in parts: + repetition = 1 + move = part + for i in range(1,len(part)): + if(ord('0')<=ord(part[i])<=ord('9')): + repetition = int(part[i:]) + move = part[:i] + algo += dictionary[move]*repetition + return algo + + def algorithm_to_string(self, algorithm): + """ + Converts an algorithm into readable string + + e.g. algorithm = U + U + F_prime + X will return "U2 F' X" + + Args: + algorithm: int[]: An algorithm + + Returns: + str: A standard readable cube algorithm + """ + + dictionary = {self.U[0]: "U", self.L[0]: "L", self.F[0]: "F", self.R[0]: "R", self.B[0]: "B", self.D[0]: "D", self.U_prime[0]: "U'", self.L_prime[0]: "L'", self.F_prime[0]: "F'", self.R_prime[0]: "R'", self.B_prime[0]: "B'", self.D_prime[0]: "D'", self.M[0]: "M", self.E[0]: "E", self.S[0]: "S", self.M_prime[0]: "M'", self.E_prime[0]: "E'", self.S_prime[0]: "S'", self.X[0]: "X", self.Y[0]: "Y", self.Z[0]: "Z", self.X_prime[0]: "X'", self.Y_prime[0]: "Y'", self.Z_prime[0]: "Z'", self.u[0]: "u", self.l[0]: "l", self.f[0]: "f", self.r[0]: "r", self.b[0]: "b", self.d[0]: "d", self.u_prime[0]: "u'", self.l_prime[0]: "l'", self.f_prime[0]: "f'", self.r_prime[0]: "r'", self.b_prime[0]: "b'", self.d_prime[0]: "d'"} + + cursor = 0 + text = "" + while(cursor1): + text += str(repetitions) + cursor = cursor_2 + return text.strip() \ No newline at end of file