Пример #1
0
def docking_data_1():
    solution = 0
    memory = dict()
    mask = None
    mask_value = None
    input_data = read_and_load_input("DAY14")

    for line in input_data:
        if line.startswith("mask"):
            mask = re.search(r"\s*=\s*([\S\s]+)", line).group(1)
        elif line.startswith("mem"):
            memory_address = re.search(r"\[([A-Za-z0-9_]+)\]", line).group(1)
            value = int(re.search(r"\s*=\s*([\S\s]+)", line).group(1))
            value_bin = f"{value:036b}"
            value_after_mask = []

            for index, bit in enumerate(mask):
                if bit == "X":
                    value_after_mask.append(value_bin[index])
                else:
                    value_after_mask.append(mask[index])

            value_after_mask = "".join(value_after_mask)
            value_after_mask = int(value_after_mask, 2)
            memory[memory_address] = value_after_mask

    for k, v in memory.items():
        solution += v
    return solution
Пример #2
0
def combo_breaker_1():
    input_data = read_and_load_input("Day25")
    card_public = int(input_data[0])
    door_public = int(input_data[1])
    MOD = 20201227
    card_loop_size = find_loop_size(7, card_public, MOD)
    return (pow(door_public, card_loop_size, MOD))
Пример #3
0
def ticket_translation_1():
    input = read_and_load_input("DAY16")
    valid_seq = set()
    rules = True
    nearby = False
    solution = 0

    for line in input:
        if rules:
            seq = re.findall('\d+', line)
            round = 0
            while round < 3 and len(seq) > 0:
                for _ in range(int(seq[round]), int(seq[round + 1]) + 1):
                    valid_seq.add(_)

                round += 2
            sorted(valid_seq)
        elif nearby:
            numbers = line.split(",")
            for number in numbers:
                if int(number) not in valid_seq:
                    solution += int(number)

        if len(line) == 0:
            rules = False

        if line.startswith("nearby"):
            nearby = True
    return solution
Пример #4
0
def crab_combat_1():
    solution = 0
    input_data = read_and_load_input("Day22")
    players = generate_decks(input_data)
    winner = play_game(players)
    for index, val in enumerate(winner):
        solution += (val * (len(winner) - index))
    return solution
Пример #5
0
def crab_combat_2():
    solution = 0
    input_data = read_and_load_input("Day22")
    players = generate_decks(input_data)
    game = 1
    winner = play_game_2(players, game)
    print(winner[1])
    for index, val in enumerate(winner[1]):
        solution += (val * (len(winner[1]) - index))
    return solution
Пример #6
0
def adapter_array_2(input):
    input = read_and_load_input("DAY10")
    numbers = sorted(input)
    combination_count = {0: 1}
    for num in numbers:
        combination_count[num] = 0
        combination_count[num] += combination_count.get(num - 1, 0)
        combination_count[num] += combination_count.get(num - 2, 0)
        combination_count[num] += combination_count.get(num - 3, 0)

    return combination_count[numbers[-1]]
def allergen_assessment_1():
    input = read_and_load_input("DAY21")
    foods = []
    ingredients = set()
    allergens = set()

    allergen_probable_map = defaultdict(list)
    for line in input:
        ingr_re = re.match(r"(.*?)\(contains (.*?)\)", line)
        ingrs = [x for x in ingr_re.group(1).split(' ') if x]
        allergs = [x for x in ingr_re.group(2).split(', ') if x]
        ingredients.update(ingrs)
        allergens.update(allergs)
        food = Food(ingrs, allergs)
        foods.append(food)

    could_allergens = set()
    for a in allergens:
        ingr_sets = []
        for f in foods:
            if a in f.allerg:
                ingr_sets.append(f.ing)
        if len(ingr_sets) > 1:
            could_allergens.update(ingr_sets[0].intersection(*ingr_sets[1:]))
        else:
            could_allergens.update(ingr_sets[0])

    not_allergens = ingredients - could_allergens

    ingr_occur_map = defaultdict(int)
    for f in foods:
        for ing in not_allergens:
            if ing in f.ing:
                ingr_occur_map[ing] += 1

    solution = sum(list(ingr_occur_map.values()))
    return solution, foods, not_allergens, allergens
Пример #8
0
from collections import deque
from utils import read_and_load_input

facing = deque('ESWN')
steps = {'N': 1j, 'E': 1, 'S': -1j, 'W': -1}
p1, p2 = 0, 0
waypoint = 10+1j
data = read_and_load_input("DAY12")

for line in data:
    op, arg = line[0], int(line[1:].strip())
    val = arg // 90
    if op == 'L':
        facing.rotate(val)
        for _ in range(val):
            waypoint = complex(-waypoint.imag, waypoint.real)
    if op == 'R':
        facing.rotate(-val)
        for _ in range(val):
            waypoint = complex(waypoint.imag, -waypoint.real)
    if op == 'F':
        step = steps.get(facing[0])
        p1 += step * arg
        p2 += waypoint * arg
    if op in facing:
        step = steps.get(op)
        p1 += step * arg
        waypoint += step * arg

def rain_risky_1():
    print(f"Solution 1: {int(abs(p1.real) + abs(p1.imag))}")
Пример #9
0

def lobby_layout_2(blackTiles):
    for day in range(100):
        newTiles = set()

        affectedTiles = blackTiles.copy()
        for tile in blackTiles:
            affectedTiles.update(neighbors(tile))

        for tile in affectedTiles:
            numNeighbors = sum(n in blackTiles for n in neighbors(tile))
            if tile in blackTiles:
                if numNeighbors in (1, 2):
                    newTiles.add(tile)
            else:
                if numNeighbors == 2:
                    newTiles.add(tile)

        blackTiles = newTiles

    return len(blackTiles)


if __name__ == '__main__':
    input_data = read_and_load_input("Day24")
    tiles = [parse(line.rstrip()) for line in input_data]
    blackTiles = lobby_layout_1()
    print(f"Solution 1: {len(blackTiles)}")
    print(f"Solution 2: {lobby_layout_2(blackTiles)}")
Пример #10
0
def adapter_array_1(input):
    numbers = read_and_load_input("DAY10")
    numbers.append(0)
    numbers.sort()
    differences = [numbers[i + 1] - x for i, x in enumerate(numbers[:-1])]
    return differences.count(1) * (differences.count(3) + 1)
Пример #11
0
import os
from utils import read_and_load_input

input = read_and_load_input("DAY10")

def adapter_array_1(input):
    numbers = read_and_load_input("DAY10")
    numbers.append(0)
    numbers.sort()
    differences = [numbers[i + 1] - x for i, x in enumerate(numbers[:-1])]
    return differences.count(1) * (differences.count(3) + 1)

def adapter_array_2(input):
    input = read_and_load_input("DAY10")
    numbers = sorted(input)
    combination_count = {0: 1}
    for num in numbers:
        combination_count[num] = 0
        combination_count[num] += combination_count.get(num - 1, 0)
        combination_count[num] += combination_count.get(num - 2, 0)
        combination_count[num] += combination_count.get(num - 3, 0)

    return combination_count[numbers[-1]]

if __name__ == '__main__':
    print(adapter_array_1(input))
    print(adapter_array_2(input))
Пример #12
0
def seating_system_2():
    data = read_and_load_input("DAY11")
    stabilized2 = run_till_stabilized2(text2chart(data))
    return count_occupied(stabilized2)
Пример #13
0
def seating_system_1():
    data = read_and_load_input("DAY11")
    empty_chart = text2chart(data)
    stabilized = run_till_stabilized(empty_chart)
    return count_occupied(stabilized)
Пример #14
0
def conway_cubes_2():
    input = read_and_load_input("DAY17")
    return playLife(input, 4)
Пример #15
0
def operation_order_2():
    input = read_and_load_input("DAY18")
    return sum(evaluate_with_precedence(expression) for expression in input)