Esempio n. 1
0
def part_2():
    data = get_input()

    oxy_list = data
    i = 0
    while len(oxy_list) > 1:
        zeros, ones = [], []
        for x in oxy_list:
            zeros.append(x) if x[i] == '0' else ones.append(x)

        if len(zeros) > (len(oxy_list) / 2):
            oxy_list = zeros
        else:
            oxy_list = ones
        i += 1

    co2_list = data
    i = 0
    while len(co2_list) > 1:
        zeros, ones = [], []
        for x in co2_list:
            zeros.append(x) if x[i] == '0' else ones.append(x)

        if len(zeros) > (len(co2_list) / 2):
            co2_list = ones
        else:
            co2_list = zeros
        i += 1

    print(BitArray(bin=oxy_list[0]).uint * BitArray(bin=co2_list[0]).uint)
Esempio n. 2
0
def part_1():
    data = [SnailfishNumber(ast.literal_eval(x)) for x in get_input()]

    start = data[0]

    for i in data[1:]:
        start = start + i

    print(start.magnitude())
Esempio n. 3
0
def split_input():
    data = get_input()
    splitter_index = 0
    for index, val in enumerate(data):
        if val == "":
            splitter_index = index
            break

    return data[:splitter_index], [x.split()[2] for x in data[splitter_index + 1:]]
Esempio n. 4
0
def part_1():
    data = [int(x) for x in get_input()]

    dec = 0
    prev = data[0]
    for i in data:
        if i > prev:
            dec += 1
        prev = i

    print(f"Part 1: {dec}")
Esempio n. 5
0
def part_2():
    octo = OctoMap(get_input())

    num_octo = (octo.max_x + 1) * (octo.max_y + 1)

    counter = 0
    while True:
        counter += 1
        if octo.simulate() == num_octo:
            break

    print(counter)
Esempio n. 6
0
def lantern_simulate(days: int):
    data = [int(x) for x in get_input()[0].split(",")]

    population = deque(([0] * 9))

    for i in data:
        population[i] += 1

    for i in range(days):
        population.rotate(-1)
        population[-3] += population[8]

    print(sum(population))
Esempio n. 7
0
def part_2():
    data = [int(x) for x in get_input()]

    prev = 0
    dec = 0

    for i, _ in enumerate(data[:-3]):
        temp = data[i] + data[i+1] + data[i+2]

        if temp > prev:
            dec += 1

        prev = temp

    print(f"Part 2: {dec}")
Esempio n. 8
0
def part_1():
    data = get_input()
    calls = data[0].split(',')
    boards = build_boards(data[2:])

    last_call = 0
    winner: BingoBoard = None
    for call in calls:
        for board in boards:
            if board.mark_and_check(call):
                last_call = int(call)
                winner = board
                break
        if winner:
            break

    print(last_call * winner.sum_unmarked())
Esempio n. 9
0
def part_2():
    data = get_input()
    calls = data[0].split(',')
    boards = build_boards(data[2:])

    last_call = 0
    winner: BingoBoard = None
    for call in calls:
        rem_boards = [b for b in boards if not b.has_won]
        for board in rem_boards:
            if board.mark_and_check(call) and len(rem_boards) == 1:
                last_call = int(call)
                winner = board
        if winner is not None:
            break

    print(last_call * winner.sum_unmarked())
Esempio n. 10
0
def part_1():
    data = [x.split() for x in get_input()]

    depth = 0
    horizontal = 0

    for i in data:

        direction, amt = i
        amt: int = int(amt)

        match direction:
            case 'forward':
                horizontal += amt
            case 'down':
                depth -= amt
            case 'up':
                depth += amt

    print(abs(depth) * horizontal)
Esempio n. 11
0
def part_1():
    data = get_input()

    counts = get_bitcount_array(data)

    half = len(data) / 2
    for index, i in enumerate(counts):
        if i < half:
            counts[index] = '0'
        else:
            counts[index] = '1'

    bits = BitArray(bin=''.join(counts))

    gamma = bits.uint

    bits.invert()

    epsilon = bits.uint
    print(f"{gamma * epsilon}")
Esempio n. 12
0
def get_field_and_points():
    data = get_input()

    points = []
    max_x = 0
    max_y = 0

    for line in data:
        values = line.split(" -> ")
        x1, y1 = [int(x) for x in values[0].split(",")]
        x2, y2 = [int(x) for x in values[1].split(",")]

        max_x = max(max_x, max(x1, x2))
        max_y = max(max_y, max(y1, y2))

        points.append([(x1, y1), (x2, y2)])

    max_y += 1
    max_x += 1
    field = [[]] * max_y
    for i in range(max_x):
        field[i] = ([0] * max_x)

    return field, points
Esempio n. 13
0
def part_2():
    data = sorted([complete_and_score_line(x) for x in get_input() if score_line(x) == 0])
    print(data[int(len(data)/2)])
Esempio n. 14
0
def main():
    p = ProbeCannon(get_input()[0])
    v = p.get_all_valids()

    print(max([p.fire(x) for x in v]))
    print(len(v))
Esempio n. 15
0
def part_2():
    print(ChitonMap(get_input(), 5).find_path())
Esempio n. 16
0
def part_2():
    data = [SnailfishNumber(ast.literal_eval(x)) for x in get_input()]
    print(max([(copy.deepcopy(x) + copy.deepcopy(y)).magnitude() for x, y in itertools.permutations(data, 2)]))
Esempio n. 17
0
def part_1():
    data = [x.split(" | ")[1] for x in get_input()]
    counts = [len([y for y in x.split() if check_length(y)]) for x in data]
    print(sum(counts))
Esempio n. 18
0
def part_2():
    data = get_input()
    print(sum([interpret_line(x) for x in data]))
Esempio n. 19
0
def part_1():
    b = BitsMessage(get_input()[0])
    print(b.sum_versions())
Esempio n. 20
0
def part_1():
    print(CaveMap(get_input()).trace_route())
Esempio n. 21
0
def part_1():
    v = VentMap(get_input())
    print(v.sum_risks())
Esempio n. 22
0
def part_1():
    octo = OctoMap(get_input())
    print(sum([octo.simulate() for _ in range(100)]))
Esempio n. 23
0
def part_2():
    c = CaveMap(get_input())
    print(c.trace_route(with_backtrack=True))
Esempio n. 24
0
def part_1():
    print(sum([score_line(x) for x in get_input()]))
Esempio n. 25
0
def part_2():
    b = BitsMessage(get_input()[0])
    print(b.execute())
Esempio n. 26
0
def part_2():
    v = VentMap(get_input())
    v.paint_basins()
    basin_sizes = heapq.nlargest(3, v.list_basins().values())

    print(math.prod(basin_sizes))
Esempio n. 27
0
def simulate_polymer(steps: int):
    p = PolymerChain(get_input())
    [p.transform() for _ in range(steps)]

    sorted_stats = sorted(p.generate_stats().values(), reverse=True)
    print(sorted_stats[0] - sorted_stats[-1])