def check_corner(cube, corner, i): relations = cube.relation_representation["D"] if corner == find_cubie(cube, relations[0][i], True): return True elif corner == find_cubie(cube, relations[1][i], True): return True elif corner == find_cubie(cube, relations[2][i], True): return True return False
def H_method(cube, lst, result_steps): pos1 = find_cubie(cube, lst[0]) pos2 = find_cubie(cube, lst[1]) maxel = max(cube.ideal_cube[pos1[0]].face[pos1[1]][pos1[2]], cube.ideal_cube[pos2[0]].face[pos2[1]][pos2[2]]) fish_method_steps = {45 : ["r", "d", "U", "f", "f", "d", "U", "d", "U", "b", "d", "d", "B", "D", "u", "D", "u", "f", "f", "D", "u", "R", "d", "d"], # 44+45 47 : ["f", "d", "U", "l", "l", "d", "U", "d", "U", "r", "d", "d", "R", "D", "u", "D", "u", "l", "l", "D", "u", "F", "d", "d"]} # 42+47 steps = fish_method_steps[maxel] for move in steps: cube.rotate(move) result_steps.append(move)
def fish_method(cube, lst, result_steps): pos1 = find_cubie(cube, lst[0]) pos2 = find_cubie(cube, lst[1]) sum_el = cube.ideal_cube[pos1[0]].face[pos1[1]][pos1[2]] + cube.ideal_cube[pos2[0]].face[pos2[1]][pos2[2]] fish_method_steps = {92 : ["b", "l", "r", "d", "U", "f", "f", "d", "U", "d", "U", "b", "d", "d", "B", "D", "u", "D", "u", "f", "f", "D", "u", "R", "d", "d", "L", "B"], # 47+45 87: ["r", "b", "f", "d", "U", "l", "l", "d", "U", "d", "U", "r", "d", "d", "R", "D", "u", "D", "u", "l", "l", "D", "u", "F", "d", "d", "B", "R"], # 42+45 86: ["f", "r", "l", "d", "U", "b", "b", "d", "U", "d", "U", "f", "d", "d", "F", "D", "u", "D", "u", "b", "b", "D", "u", "L", "d", "d", "R", "F"], # 42+44 91: ["l", "f", "b", "d", "U", "r", "r", "d", "U", "d", "U", "l", "d", "d", "L", "D", "u", "D", "u", "r", "r", "D", "u", "B", "d", "d", "F", "L"]} # 44+47 steps = fish_method_steps[sum_el] for move in steps: cube.rotate(move) result_steps.append(move)
def check_fourth_step(cube): relations = cube.relation_representation["D"] for i in range(4): c = find_cubie(cube, relations[0][i]) if not check_corner(cube, c, i): return False return True
def one_round(cube, result_steps): methods = [[1, 2, 3, 4], [3, 1, 4, 2], [2, 4, 1, 3], [4, 3, 2, 1]] relations = cube.relation_representation["D"] for corner in range(len(relations[0])): c = find_cubie(cube, relations[0][corner]) done = False i = corner - 1 while not done: i = (i + 1) % 4 if check_corner(cube, c, i): done = True method = methods[corner][i] if method == 1: continue elif method == 2: method_1_to_2(cube, corner, result_steps) elif method == 3: method_1_to_3(cube, corner, result_steps) elif method == 4: method_1_to_2(cube, corner, result_steps) cube.rotate("d") result_steps.append("d") method_1_to_2(cube, corner, result_steps) cube.rotate("D") result_steps.append("D") method_1_to_2(cube, corner, result_steps)
def corner_method(cube, pos_tup, i, prime_side, turn_u): places_4_5 = [35, 9, 27, 33, 11, 17, 19, 25, 1, 3, 6, 8] if turn_u > 0: for place in places_4_5: possible_pos = find_cubie(cube, place, True) el_in_possible_pos = cube.cube[possible_pos[0]].face[ possible_pos[1]][possible_pos[2]] if el_in_possible_pos == cube.ideal_cube[pos_tup[0]].face[ pos_tup[1]][pos_tup[2]]: return place * 10, turn_u j = 1 while True: if j > 5: # print("Error!!!") return None, None break possible_pos = find_cubie( cube, cube.relation_representation[prime_side][j][i], True) el_in_possible_pos = cube.cube[possible_pos[0]].face[possible_pos[1]][ possible_pos[2]] if el_in_possible_pos == cube.ideal_cube[pos_tup[0]].face[pos_tup[1]][ pos_tup[2]]: return j, turn_u j += 1
def edge_method(cube, pos_tup, i, middle_edge, prime_side): possible_places = [34, 26, 18, 10, 2, 5, 7, 4] j = 7 i = (i + middle_edge) % 4 while True: if middle_edge > 0 and not (j == 9 or j == 10): j += 1 if j > 11: # print("Error!!!") return None, None continue if j > 11: for place in possible_places: possible_pos = find_cubie(cube, place, True) el_in_possible_pos = cube.cube[possible_pos[0]].face[possible_pos[1]][possible_pos[2]] if el_in_possible_pos == cube.ideal_cube[pos_tup[0]].face[pos_tup[1]][pos_tup[2]]: return place * 10, middle_edge return None, None possible_pos = find_cubie(cube, cube.relation_representation[prime_side][j][i], True) el_in_possible_pos = cube.cube[possible_pos[0]].face[possible_pos[1]][possible_pos[2]] if el_in_possible_pos == cube.ideal_cube[pos_tup[0]].face[pos_tup[1]][pos_tup[2]]: return (j - 6), middle_edge j += 1
def solve_corners(cube, prime_side): res_steps = [] relations = cube.relation_representation[prime_side][0] for i in range(len(relations)): turn_u = 0 j = 8 while j > 0: pos_tup = find_cubie(cube, relations[i], True) corner = cube.cube[pos_tup[0]].face[pos_tup[1]][pos_tup[2]] if corner == cube.ideal_cube[pos_tup[0]].face[pos_tup[1]][ pos_tup[2]]: j -= 1 continue else: method = corner_method(cube, pos_tup, i, prime_side, turn_u) if method[0] == 1: corner_method1(cube, i, res_steps) break elif method[0] == 2: corner_method2(cube, i, res_steps) break elif method[0] == 3: corner_method3(cube, i, res_steps) break elif method[0] == 4: corner_method4(cube, i, res_steps) break elif method[0] == 5: corner_method5(cube, i, res_steps) break elif isinstance(method[0], int): corner_method6(cube, i, method[0], res_steps) break else: if j < 5: turn_u += 1 cube.rotate("D") res_steps.append("D") j -= 1 return res_steps
def solve_edges(cube, prime_side, result_steps): relations = cube.relation_representation[prime_side][6] for i in range(len(relations)): j = 8 middle_edge = 0 while j > 0: pos_tup = find_cubie(cube, relations[i], True) edge = cube.cube[pos_tup[0]].face[pos_tup[1]][pos_tup[2]] if edge == cube.ideal_cube[pos_tup[0]].face[pos_tup[1]][pos_tup[2]]: j -= 1 continue else: method = edge_method(cube, pos_tup, i, middle_edge, prime_side) if method[0] == 1: edge_method1(cube, i, result_steps) break elif method[0] == 2: edge_method2(cube, i, result_steps) break elif method[0] == 3: edge_method3(cube, i, method[1], result_steps) break elif method[0] == 4: edge_method4(cube, i, method[1], result_steps) break elif method[0] == 5: edge_method5(cube, i, result_steps) break elif isinstance(method[0], int): edge_method6(cube, i, method[0], result_steps) else: if j < 5: middle_edge += 1 cube.rotate("d") result_steps.append("d") j -= 1
def check_bottom_corners(cube): return (find_cubie(cube, 46, True) == find_cubie(cube, 46)) and \ (find_cubie(cube, 41, True) == find_cubie(cube, 41)) and \ (find_cubie(cube, 43, True) == find_cubie(cube, 43)) and \ (find_cubie(cube, 48, True) == find_cubie(cube, 48))
def check_config_3(cube, rotated): situations = [[46, 41], [43, 41], [48, 43], [46, 48]] situation = situations[rotated] return (find_cubie(cube, 14, True) == find_cubie(cube, situation[0])) and \ (find_cubie(cube, 41, True) == find_cubie(cube, situation[1]))