From 4676f68466054a5cc0ec816da9529bcc7bab8619 Mon Sep 17 00:00:00 2001 From: Sijmen Date: Tue, 5 Dec 2023 09:56:37 +0000 Subject: [PATCH] Add day 3 --- day03.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 day03.py diff --git a/day03.py b/day03.py new file mode 100644 index 0000000..1dceb10 --- /dev/null +++ b/day03.py @@ -0,0 +1,76 @@ +import fileinput +from pprint import pprint + +inp = [] + +for line in fileinput.input(): + if line: + inp.append(list(line.strip())) + +numbers = {} +gear_numbers = {} + +def moore(x, y): + for j in (-1, 0, 1): + for i in (-1, 0, 1): + if ( + not (i == 0 and j == 0) + and 0 <= (y + j) < len(inp) + and 0 <= (x + i) < len(inp[y + j]) + ): + yield (x + i, y + j) + + +for y in range(len(inp)): + for x in range(len(inp[y])): + if inp[y][x].isdigit(): + while x >= 0 and inp[y][x].isdigit(): + x -= 1 + x += 1 + + if (x, y) in numbers: + continue + + is_part_number = False + gear = None + + x_ = x + number = 0 + + while x_ < len(inp[y]) and inp[y][x_].isdigit(): + number = number * 10 + int(inp[y][x_]) + + for i, j in moore(x_, y): + if not inp[j][i].isdigit() and inp[j][i] != ".": + is_part_number = True + if inp[j][i] == "*": gear = (i, j) + break + + x_ += 1 + + if gear and (x, y) not in gear_numbers: + gear_number = 0 + + for i, j in moore(*gear): + if inp[j][i].isdigit(): + while j >= 0 and inp[j][i].isdigit(): + i -= 1 + i += 1 + + if (i, j) in gear_numbers: + break + + if (x, y) != (i, j): + i_ = i + while i_ < len(inp[j]) and inp[j][i_].isdigit(): + gear_number = gear_number * 10 + int(inp[j][i_]) + i_ += 1 + gear_number *= number + gear_numbers[(x, y)] = gear_number + break + + numbers[(x, y)] = (number, is_part_number, gear) + +part1 = sum(num for (num, ispart, _) in numbers.values() if ispart) +part2 = sum(gear_numbers.values()) +print(part1, part2) \ No newline at end of file