edges = [lines[1], right_edge, lines[-1], left_edge] tile_edges[tile_id] = edges edge_counts = {} for edges in tile_edges.values(): for edge in edges: e = edge if edge > edge[::-1] else edge[::-1] if e in edge_counts: edge_counts[e] += 1 else: edge_counts[e] = 1 tile_id_product = 1 for tile in tile_edges: unmatched_edges = 0 for edge in tile_edges[tile]: e = edge if edge > edge[::-1] else edge[::-1] if edge_counts[e] == 1: unmatched_edges += 1 if unmatched_edges == 2: tile_id_product *= tile return tile_id_product if __name__ == "__main__": run_tests(test_cases_a, solve) print(solve(puzzle_input))
def play_move(cups): current_cup = cups[0] moved_cups = cups[1:4] cups = cups[:1] + cups[4:] target_cup = current_cup - 1 while target_cup not in cups: if target_cup > 1: target_cup -= 1 else: target_cup = 9 target_index = cups.index(target_cup) + 1 cups[target_index:target_index] = moved_cups cups.pop(0) cups.append(current_cup) return cups def evaluate_result(cups): one_index = cups.index(1) cups = cups[one_index + 1:] + cups[:one_index] return ''.join([str(c) for c in cups]) if __name__ == "__main__": run_tests([['67384529', '389125467']], solve) print(solve('789465123'))
invalid_index = get_first_invalid_index(values, window) invalid_value = values[invalid_index] i, j = 0, 1 while j < invalid_index: ij_values = [values[k] for k in range(i, j + 1)] ij_sum = sum(ij_values) if ij_sum > invalid_value: i += 1 elif ij_sum < invalid_value: j += 1 else: return min(ij_values) + max(ij_values) def get_first_invalid_index(values, window): for i in range(window, len(values)): prev_values = values[i - window:i] if values[i] not in get_valid_sums(prev_values): return i def get_valid_sums(prev_values): return set([a + b for [a, b] in itertools.combinations(prev_values, 2)]) if __name__ == "__main__": run_tests(test_cases_b, solve, 5) print(solve(puzzle_input, 25))
def play_move(current_cup, cups): moved_cups = [cups[current_cup]] for i in range(2): moved_cups.append(cups[moved_cups[-1]]) target_cup = current_cup - 1 if current_cup > 1 else TOTAL_CUPS while target_cup in moved_cups: if target_cup > 1: target_cup -= 1 else: target_cup = TOTAL_CUPS target_cup_next = cups[target_cup] cups[current_cup] = cups[moved_cups[-1]] cups[target_cup] = moved_cups[0] cups[moved_cups[-1]] = target_cup_next current_cup = cups[current_cup] return current_cup, cups def evaluate_result(cups): return cups[1] * cups[cups[1]] if __name__ == "__main__": run_tests([[149245887792, '389125467']], solve) print(solve('789465123'))