Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- colors = ["W", "Y", "G", "B", "O", "R"]
- dirs = ["U", "D", "F", "B", "L", "R"]
- class Node:
- def __init__(self, coloration):
- """Create a single part of the cube,
- Node([Up, Down, Front, Back, Left, Right])"""
- self.coloration = coloration
- def get_side(self, side):
- return self.coloration[dirs.index(side)]
- def set_side(self, side1, side2, color = ""):
- """Set color of side. If side2 != "" then it swaps side1 and side2 colors"""
- if side2 == "" or side2 == " ":
- self.coloration[dirs.index(side1)] = color
- else:
- self.coloration[dirs.index(side1)] = self.coloration[dirs.index(side2)]
- def rotate(self, axis, clockwise = True):
- """Rotate a single cubelet 90 degrees"""
- if not clockwise:
- self.rotate(axis, True)
- self.rotate(axis, True)
- self.rotate(axis, True)
- return
- if axis == "X":
- t = self.get_side("B")
- self.set_side("B", "U")
- self.set_side("U", "F")
- self.set_side("F", "D")
- self.set_side("D", "", t)
- if axis == "Z":
- t = self.get_side("B")
- self.set_side("B", "L")
- self.set_side("L", "F")
- self.set_side("F", "R")
- self.set_side("R", "", t)
- if axis == "Y":
- t = self.get_side("L")
- self.set_side("L", "D")
- self.set_side("D", "R")
- self.set_side("R", "U")
- self.set_side("U", "", t)
- def __repr__(self):
- return "Node({})".format(repr(["{}={}".format(a,b) for a,b in zip(dirs, self.coloration)]))
- class Cube:
- def __init__(self):
- self.cube = [[[Node([" "]*6) for _ in xrange(3)] for _ in xrange(3)] for _ in xrange(3)]
- sr = [(i,j) for i in range(3) for j in range(3)]
- for x,y in sr:
- self.cube[x][y][0].set_side("D", "", "Y")
- self.cube[x][y][2].set_side("U", "", "W")
- for x,z in sr:
- self.cube[x][0][z].set_side("F", "", "G")
- self.cube[x][2][z].set_side("B", "", "B")
- for y,z in sr:
- self.cube[0][y][z].set_side("L", "", "O")
- self.cube[2][y][z].set_side("R", "", "R")
- def rotate(self, face, clockwise = True):
- if not clockwise:
- self.rotate(face)
- self.rotate(face)
- self.rotate(face)
- return
- sr = [(i,j) for i in range(3) for j in range(3)]
- if face == "U":
- for x,y in sr:
- self.cube[x][y][2].rotate("Z")
- t = self.cube[0][0][2]
- self.cube[0][0][2] = self.cube[2][0][2]
- self.cube[2][0][2] = self.cube[2][2][2]
- self.cube[2][2][2] = self.cube[0][2][2]
- self.cube[0][2][2] = t
- t = self.cube[1][0][2]
- self.cube[1][0][2] = self.cube[2][1][2]
- self.cube[2][1][2] = self.cube[1][2][2]
- self.cube[1][2][2] = self.cube[0][1][2]
- self.cube[0][1][2] = t
- if face == "D":
- for x,y in sr:
- self.cube[x][y][0].rotate("Z", False)
- t = self.cube[0][0][0]
- self.cube[0][0][0] = self.cube[0][2][0]
- self.cube[0][2][0] = self.cube[2][2][0]
- self.cube[2][2][0] = self.cube[2][0][0]
- self.cube[2][0][0] = t
- t = self.cube[1][0][0]
- self.cube[1][0][0] = self.cube[0][1][0]
- self.cube[0][1][0] = self.cube[1][2][0]
- self.cube[1][2][0] = self.cube[2][1][0]
- self.cube[2][1][0] = t
- if face == "F":
- for x,z in sr:
- self.cube[x][0][z].rotate("Y")
- t = self.cube[0][0][0]
- self.cube[0][0][0] = self.cube[2][0][0]
- self.cube[2][0][0] = self.cube[2][0][2]
- self.cube[2][0][2] = self.cube[0][0][2]
- self.cube[0][0][2] = t
- t = self.cube[1][0][0]
- self.cube[1][0][0] = self.cube[2][0][1]
- self.cube[2][0][1] = self.cube[1][0][2]
- self.cube[1][0][2] = self.cube[0][0][1]
- self.cube[0][0][1] = t
- if face == "B":
- for x,z in sr:
- self.cube[x][2][z].rotate("Y", False)
- t = self.cube[0][2][0]
- self.cube[0][2][0] = self.cube[0][2][2]
- self.cube[0][2][2] = self.cube[2][2][2]
- self.cube[2][2][2] = self.cube[2][2][0]
- self.cube[2][2][0] = t
- t = self.cube[1][2][0]
- self.cube[1][2][0] = self.cube[0][2][1]
- self.cube[0][2][1] = self.cube[1][2][2]
- self.cube[1][2][2] = self.cube[2][2][1]
- self.cube[2][2][1] = t
- if face == "L":
- for y,z in sr:
- self.cube[0][y][z].rotate("X", False)
- t = self.cube[0][0][0]
- self.cube[0][0][0] = self.cube[0][0][2]
- self.cube[0][0][2] = self.cube[0][2][2]
- self.cube[0][2][2] = self.cube[0][2][0]
- self.cube[0][2][0] = t
- t = self.cube[0][0][1]
- self.cube[0][0][1] = self.cube[0][1][2]
- self.cube[0][1][2] = self.cube[0][2][1]
- self.cube[0][2][1] = self.cube[0][1][0]
- self.cube[0][1][0] = t
- if face == "R":
- for y,z in sr:
- self.cube[2][y][z].rotate("X")
- t = self.cube[2][0][0]
- self.cube[2][0][0] = self.cube[2][2][0]
- self.cube[2][2][0] = self.cube[2][2][2]
- self.cube[2][2][2] = self.cube[2][0][2]
- self.cube[2][0][2] = t
- t = self.cube[2][1][0]
- self.cube[2][1][0] = self.cube[2][2][1]
- self.cube[2][2][1] = self.cube[2][1][2]
- self.cube[2][1][2] = self.cube[2][0][1]
- self.cube[2][0][1] = t
- def execute_moves(self, moves):
- charlist = "UDFBLR"
- if isinstance(moves, str):
- move_list = []
- i = 0
- while i < len(moves):
- if moves[i] not in charlist:
- i+=1
- continue
- basic = moves[i]
- i+=1
- if i < len(moves) and moves[i] == "'":
- move_list.append((basic, False))
- i+=1
- elif i < len(moves) and moves[i] == "2":
- move_list.append((basic, True))
- move_list.append((basic, True))
- i+=1
- else:
- move_list.append((basic, True))
- moves = move_list
- for side, clockwise in moves:
- self.rotate(side, clockwise)
- def __str__(self):
- """
- U U U /
- U U U / R
- U U U / R R
- F F F|R R R
- F F F|R R
- F F F|R
- """
- rn = [0,1,2]
- rb = [2,1,0]
- up = [[self.cube[x][y][2].get_side("U") for x in rn] for y in rb]
- front = [[self.cube[x][0][z].get_side("F") for x in rn] for z in rb]
- right = [[self.cube[2][y][z].get_side("R") for y in rn] for z in rb]
- grid = [[" " for _ in xrange(11)] for _ in xrange(6)]
- for i, row in enumerate(up):
- for j, color in enumerate(row):
- grid[i][2*(2 - i) + 2*j] = color
- for i, row in enumerate(front):
- for j, color in enumerate(row):
- grid[i + 3][2*j] = color
- for i, row in enumerate(right):
- for j, color in enumerate(row):
- grid[3 - j + i][6 + 2*j] = color
- grid[0][10] = "/"
- grid[1][8] = "/"
- grid[2][6] = "/"
- grid[3][5] = "|"
- grid[4][5] = "|"
- grid[5][5] = "|"
- return "\n".join("".join(s for s in row) for row in grid)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement