Beispiel #1
0
def main():
    input_txt = get_input(17)
    int_code_list = ints(input_txt)
    code = defaultdict(int, enumerate(int_code_list))
    board1 = run_robot(code)

    print(f'Part 1: {len(board1)}')
Beispiel #2
0
def part2(lines: list[str]):
    rotations = {
        "L": {
            90: counterclockwise_90,
            180: rotate,
            270: clockwise_90
        },
        "R": {
            90: clockwise_90,
            180: rotate,
            270: counterclockwise_90
        },
    }

    pos = (0, 0)
    waypoint = (10, 1)

    for line in lines:
        cmd = line[0]
        number = utils.ints(line)[0]
        if cmd == "F":
            pos = utils.tuple_add(pos, tuple(number * i for i in waypoint))
        elif cmd in "LR":
            waypoint = rotations[cmd][number](waypoint)
        elif cmd in DIRECTIONS.keys():
            waypoint = utils.tuple_add(
                waypoint, tuple(number * i for i in DIRECTIONS[cmd]))

    return abs(pos[0]) + abs(pos[1])
Beispiel #3
0
def get_numbers_for_index(
        valid_nearby_lines: list[str]) -> dict[int, set[int]]:
    positions = defaultdict(set)
    for n in valid_nearby_lines:
        all_numbers = utils.ints(n)
        for i, x in enumerate(all_numbers):
            positions[i].add(x)
    return positions
Beispiel #4
0
def main():
    input_txt = utils.get_input(5)
    lines = []
    for line_def in input_txt.strip().split("\n"):
        x1, y1, x2, y2 = utils.ints(line_def)
        lines.append(((x1, y1), (x2, y2)))
    print(f"Part 1: {part1(lines)}")
    print(f"Part 2: {part2(lines)}")
Beispiel #5
0
 def __init__(self, board_input: str, done=False):
     self.done = done
     self.board = [[None for _ in range(5)] for _ in range(5)]
     rows = board_input.strip().split("\n")
     all_row_entries = [utils.ints(row) for row in rows]
     # TODO: only 5x5 boards
     for x in range(5):
         for y in range(5):
             self.board[x][y] = Number(all_row_entries[x][y])
Beispiel #6
0
def main():
    input_txt = get_input(19)
    int_code_list = ints(input_txt)
    code = defaultdict(int, enumerate(int_code_list))
    p1 = part1(code)
    print(f"Part 1: {p1}")

    p2 = part2(code)
    print(f"Part 2: {p2}")
Beispiel #7
0
def read_ranges(ranges: str) -> dict[str, set[int]]:
    valid = {}
    for line in ranges.split("\n"):
        name = line.split(":")[0]
        valid_range = set()
        a, b, c, d = map(abs, utils.ints(line))
        valid_range.update(set(range(a, b + 1)))
        valid_range.update(set(range(c, d + 1)))
        valid[name] = valid_range
    return valid
Beispiel #8
0
def main():
    input_txt = utils.get_input(4)
    sections = input_txt.split("\n\n")

    drawn_numbers = utils.ints(sections[0])
    boards_input = sections[1:]
    boards = [Board(board_input) for board_input in boards_input]
    boards2 = deepcopy(boards)

    print(f"Part 1: {part1(drawn_numbers, boards)}")
    print(f"Part 2: {part2(drawn_numbers, boards2)}")
Beispiel #9
0
def part2(my_ticket: str, ranges: dict[str, set[int]],
          valid_nearby_lines: list[str]) -> int:
    positions = get_numbers_for_index(valid_nearby_lines)
    classification = create_index_to_name_classification(ranges, positions)

    assign_index_to_unique_name(classification)
    indices = [
        i for i, names in classification.items()
        if names and names[0].startswith("departure")
    ]
    return math.prod([utils.ints(my_ticket)[i] for i in indices])
Beispiel #10
0
def main():
    input_txt = utils.get_input(19).rstrip()
    rules, text = input_txt.split("\n\n")

    all_rules = {}
    for rule_line in rules.split("\n"):
        idx, rule = rule_line.split(": ")
        if "|" in rule:
            or_rules = rule.split("|")
            or_rules = [utils.ints(x) for x in or_rules]
            all_rules[int(idx)] = or_rules
        elif '"' in rule:
            char = rule.strip('"')
            all_rules[int(idx)] = char
        else:
            and_rules = utils.ints(rule)
            all_rules[int(idx)] = [and_rules]

    messages = text.split("\n")
    print(calc_valid_messages(all_rules, messages))

    all_rules[8] = [[42], [42, 8]]
    all_rules[11] = [[42, 31], [42, 11, 31]]
    print(calc_valid_messages(all_rules, messages))
Beispiel #11
0
def part1(areas):
    cubes = set()
    for area in areas:
        x1, x2, y1, y2, z1, z2 = utils.ints(area)
        a = [
            list(range(x1, x2 + 1)),
            list(range(y1, y2 + 1)),
            list(range(z1, z2 + 1))
        ]
        triples = set(itertools.product(*a))
        if area[:2] == "on":
            cubes |= triples
        else:
            cubes -= triples
    return len(cubes)
Beispiel #12
0
def part1(valid_ranges: dict[str, set[int]],
          nearby: str) -> tuple[int, list[str]]:
    not_valid = []
    valid_nearby = []

    valid_numbers = set().union(*valid_ranges.values())
    for line in nearby.split("\n"):
        all_numbers = utils.ints(line)
        is_valid = True
        for n in all_numbers:
            if n not in valid_numbers:
                not_valid.append(n)
                is_valid = False
        if all_numbers and is_valid:
            valid_nearby.append(line)

    return sum(not_valid), valid_nearby
Beispiel #13
0
def main():
    input_txt = get_input(12)
    moons = []

    for line in input_txt.rstrip().split('\n'):
        moon_pos = tuple(ints(line))
        moon = Moon(moon_pos)
        moons.append(moon)

    p1 = part1(moons)
    print(f'Part 1: {p1}')

    loop_lengths = []
    for pos_idx in range(3):
        loop_length = find_loop(pos_idx, deepcopy(moons))
        loop_lengths.append(loop_length)
    print(loop_lengths)
    p2 = np.lcm.reduce(loop_lengths)
    print(f'Part 2: {p2}')
Beispiel #14
0
def part1(lines: list[str]):
    rotations = "ESWN"
    dir_ = "E"
    pos = (0, 0)

    for line in lines:
        cmd = line[0]
        number = utils.ints(line)[0]
        if cmd == "F":
            pos = utils.tuple_add(pos,
                                  tuple(number * i for i in DIRECTIONS[dir_]))
        elif cmd in "LR":
            number = number // 90
            idx = rotations.index(dir_)
            m = 1 if cmd == "R" else -1
            idx += m * number
            dir_ = rotations[idx % 4]
        elif cmd in DIRECTIONS.keys():
            pos = utils.tuple_add(pos,
                                  tuple(number * i for i in DIRECTIONS[cmd]))

    return abs(pos[0]) + abs(pos[1])
Beispiel #15
0
def main():
    input_txt = get_input(11)
    int_code_list = ints(input_txt)
    code = defaultdict(int, enumerate(int_code_list))
    board1 = run_robot(code, 0)
    board2 = run_robot(code, 1)

    print(f'Part 1: {len(board1)}')
    print()
    print('Part 2')
    width_min = min(board2.keys(), key=lambda x: x[0])[0]
    width_max = max(board2.keys(), key=lambda x: x[0])[0]
    height_min = min(board2.keys(), key=lambda x: x[1])[1]
    height_max = max(board2.keys(), key=lambda x: x[1])[1]
    for y in reversed(range(height_min, height_max + 1)):
        line = ''
        for x in range(width_min, width_max + 1):
            if board2[(x, y)]:
                line += '\u2588'
            else:
                line += ' '
        print(line)
Beispiel #16
0
def main():
    input_txt = utils.get_input(6)
    lantern_fish = utils.ints(input_txt)
    lantern_fish2 = copy.deepcopy(lantern_fish)
    print(f"Part 1: {part1(lantern_fish)}")
    print(f"Part 2: {part2(lantern_fish2)}")
Beispiel #17
0
def main():
    input_txt = utils.get_input(7)
    intcode = utils.ints(input_txt)
    determine_phase_setting(intcode)
Beispiel #18
0
def main():
    global INPUT
    INPUT = 5
    input_txt = utils.get_input(5)
    intcode = utils.ints(input_txt)
    calculate(intcode)
Beispiel #19
0
def main():
    input_txt = utils.get_input(15).rstrip()
    numbers = utils.ints(input_txt)
    print(part1(numbers))
    print(part2(numbers))
Beispiel #20
0
def main():
    input_txt = utils.get_input(9).rstrip()
    numbers = utils.ints(input_txt)
    non_valid = part1(numbers)
    print(non_valid)
    print(part2(numbers, non_valid))
Beispiel #21
0
def main():
    input_txt = utils.get_input(1)
    depths = utils.ints(input_txt)
    print(part1(depths))
    print(part2(depths))
Beispiel #22
0
def main():
    input_txt = utils.get_input(7)
    positions = utils.ints(input_txt)
    print(f"Part 1: {part1(positions)}")
    print(f"Part 2: {part2(positions)}")
Beispiel #23
0
def main():
    input_txt = utils.get_input(1)
    amounts = utils.ints(input_txt)
    print(part1(amounts))
    print(part2(amounts))
Beispiel #24
0
def main():
    input_txt = utils.get_input(9)
    int_code_list = utils.ints(input_txt)
    code = defaultdict(int, enumerate(int_code_list))
    determine_phase_setting(code)