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))
Beispiel #2
0

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'))