Skip to content

Commit 4573890

Browse files
authored
Improve day3.py and add solution for day3_part2
1 parent edeca81 commit 4573890

File tree

2 files changed

+99
-40
lines changed

2 files changed

+99
-40
lines changed

day3.py

+39-40
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,43 @@
1-
# wrong answer, but seems to work as expected up to line 3 (line_idx=2) number: 667 (number_idx: 57)
2-
# every line in the "engine schematic" (-> the puzzle input) has 141 characters
3-
LINE_LENGTH = 141
4-
# the "engine schematic" has 140 lines
5-
NUMBER_OF_LINES = 140
6-
71
input_lines = []
82

93

104
def is_part_number(line_idx: int, number_idx: int, number_length: int):
11-
if number_idx != 0:
12-
if is_part_marker(input_lines[line_idx][number_idx - 1]):
13-
return True
14-
if line_idx != 0:
15-
if is_part_marker(input_lines[line_idx - 1][number_idx - 1]):
16-
return True
17-
if line_idx != NUMBER_OF_LINES - 1:
18-
if is_part_marker(input_lines[line_idx + 1][number_idx - 1]):
19-
return True
20-
if number_idx + number_length != LINE_LENGTH - 1:
21-
if is_part_marker(input_lines[line_idx][number_idx + number_length]):
22-
return True
23-
if line_idx != 0:
24-
if is_part_marker(input_lines[line_idx - 1][number_idx + number_length]):
25-
return True
26-
if line_idx != NUMBER_OF_LINES - 1:
27-
if is_part_marker(input_lines[line_idx + 1][number_idx + number_length]):
28-
return True
29-
if line_idx != 0:
30-
for idx in range(number_idx, number_idx + number_length):
31-
if is_part_marker(input_lines[line_idx - 1][idx]):
32-
return True
33-
if line_idx != NUMBER_OF_LINES - 1:
34-
for idx in range(number_idx, number_idx + number_length):
35-
if is_part_marker(input_lines[line_idx + 1][idx]):
36-
return True
37-
38-
return False
5+
for x in range(line_idx - 1, line_idx + 2):
6+
for y in range(number_idx - 1, number_idx + number_length + 1):
7+
try:
8+
if not input_lines[x][y].isdigit() and input_lines[x][y] != ".":
9+
return True
10+
except IndexError:
11+
pass
3912

13+
# if number_idx != 0:
14+
# if is_part_marker(input_lines[line_idx][number_idx - 1]):
15+
# return True
16+
# if line_idx != 0:
17+
# if is_part_marker(input_lines[line_idx - 1][number_idx - 1]):
18+
# return True
19+
# if line_idx != NUMBER_OF_LINES - 1:
20+
# if is_part_marker(input_lines[line_idx + 1][number_idx - 1]):
21+
# return True
22+
# if number_idx + number_length != LINE_LENGTH - 1:
23+
# if is_part_marker(input_lines[line_idx][number_idx + number_length]):
24+
# return True
25+
# if line_idx != 0:
26+
# if is_part_marker(input_lines[line_idx - 1][number_idx + number_length]):
27+
# return True
28+
# if line_idx != NUMBER_OF_LINES - 1:
29+
# if is_part_marker(input_lines[line_idx + 1][number_idx + number_length]):
30+
# return True
31+
# if line_idx != 0:
32+
# for idx in range(number_idx, number_idx + number_length):
33+
# if is_part_marker(input_lines[line_idx - 1][idx]):
34+
# return True
35+
# if line_idx != NUMBER_OF_LINES - 1:
36+
# for idx in range(number_idx, number_idx + number_length):
37+
# if is_part_marker(input_lines[line_idx + 1][idx]):
38+
# return True
4039

41-
# Part Marker refers all symbols except the '.'.
42-
# As stated in the puzzle any number that is in any way adjacent to one of these symbols is a part number.
43-
def is_part_marker(adjacent_char: str):
44-
return not adjacent_char.isdigit() and adjacent_char != "."
40+
return False
4541

4642

4743
def main():
@@ -58,13 +54,16 @@ def main():
5854
for char_idx, char in enumerate(line):
5955
if char.isdigit():
6056
number += char
61-
if not number_idx:
57+
if number_idx is None:
6258
number_idx = char_idx
63-
elif number_idx:
59+
elif number_idx is not None:
6460
if is_part_number(line_idx, number_idx, len(number)):
6561
part_numbers_sum += int(number)
6662
number = ""
6763
number_idx = None
64+
if number_idx is not None:
65+
if is_part_number(line_idx, number_idx, len(number)):
66+
part_numbers_sum += int(number)
6867

6968
print("Sum of part numbers:", part_numbers_sum)
7069

day3_part2.py

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
input_lines = []
2+
3+
4+
def main():
5+
with open("day3_input.txt", "r") as input_file:
6+
input_string = input_file.read()
7+
8+
global input_lines
9+
input_lines = input_string.splitlines()
10+
gears = {}
11+
12+
for line_idx, line in enumerate(input_lines):
13+
number: str = ""
14+
number_idx: int | None = None
15+
for char_idx, char in enumerate(line):
16+
if char.isdigit():
17+
number += char
18+
if number_idx is None:
19+
number_idx = char_idx
20+
elif number_idx is not None:
21+
for x in range(line_idx - 1, line_idx + 2):
22+
for y in range(number_idx - 1, number_idx + len(number) + 1):
23+
try:
24+
if input_lines[x][y] == "*":
25+
key = "{}-{}".format(x, y)
26+
if key in gears.keys():
27+
gears[key].append(number)
28+
else:
29+
gears[key] = [number]
30+
except IndexError:
31+
pass
32+
number = ""
33+
number_idx = None
34+
if number_idx is not None:
35+
for x in range(line_idx - 1, line_idx + 2):
36+
for y in range(number_idx - 1, number_idx + len(number) + 1):
37+
try:
38+
if input_lines[x][y] == "*":
39+
key = "{}-{}".format(x, y)
40+
if key in gears.keys():
41+
gears[key].append(number)
42+
else:
43+
gears[key] = [number]
44+
except IndexError:
45+
pass
46+
47+
gear_ratios_sum = 0
48+
for gear in gears.values():
49+
gear_ratio = 1
50+
if len(gear) < 2: # The thing that is currently represented by 'gear' is not a real gear
51+
continue
52+
for number in gear:
53+
gear_ratio *= int(number)
54+
gear_ratios_sum += gear_ratio
55+
56+
print("Sum of gear ratios:", gear_ratios_sum)
57+
58+
59+
if __name__ == '__main__':
60+
main()

0 commit comments

Comments
 (0)