-
Notifications
You must be signed in to change notification settings - Fork 0
/
3.py
131 lines (113 loc) · 5.38 KB
/
3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# any number adjacent to a symbol, even diagonally, is a "part number" and should be
# included in your sum. (Periods (.) do not count as a symbol.)
# Here is an example engine schematic:
# 467..114..
# ...*......
# ..35..633.
# ......#...
# 617*......
# .....+.58.
# ..592.....
# ......755.
# ...$.*....
# .664.598..
# In this schematic, two numbers are not part numbers because they are not adjacent
# to a symbol: 114 (top right) and 58 (middle right). Every other number is
# adjacent to a symbol and so is a part number; their sum is 4361.
# Of course, the actual engine schematic is much larger. What is the sum of all of
# the part numbers in the engine schematic?
import re
import numpy as np
filename = "/Users/cyril/Documents/aoc23/input3.txt"
schematic = np.array([list(line) for line in open(filename)])[:,0:140]
print(schematic)
relevance = np.zeros(schematic.shape, dtype=int)
numbers = np.empty(schematic.shape, dtype=str)
for y in np.arange(0, len(schematic)):
for x in np.arange(0, len(schematic[y])):
if re.fullmatch(r'^\d$', schematic[y][x]):
left = schematic[y][x-1] if x-1 >= 0 else ''
upperleft = schematic[y-1][x-1] if y-1 >= 0 and x-1 >= 0 else ''
upper = schematic[y-1][x] if y-1 >= 0 else ''
upperright = schematic[y-1][x+1] if y-1 >= 0 and x+1 < len(schematic[y]) else ''
right = schematic[y][x+1] if x+1 < len(schematic[y]) else ''
lowerright = schematic[y+1][x+1] if y+1 < len(schematic) and x+1 < len(schematic[y]) else ''
lower = schematic[y+1][x] if y+1 < len(schematic) else ''
lowerleft = schematic[y+1][x-1] if y+1 < len(schematic) and x-1 >= 0 else ''
surroundings = left + upperleft + upper + upperright + right + lowerright + lower + lowerleft
if re.search(r'[\#\$\%\&\*\+\-\/\=\@]', surroundings):
relevance[y][x] = 1
if re.fullmatch(r'[0-9]', left):
if re.fullmatch(r'[0-9]', right):
numbers[y][x] = 'm'
else:
numbers[y][x] = 'e'
else:
numbers[y][x] = 's'
else:
numbers[y][x] = ' '
print(relevance)
print(numbers)
count = 0
for check in np.arange(1, 10):
for y in np.arange(0, len(numbers)):
for x in np.arange(0, len(numbers[y])):
if re.match(r'[sme]', numbers[y][x]):
if relevance[y][x] == 0:
if x-1 >= 0:
if relevance[y][x-1] == 1:
count += 1
relevance[y][x] = 1
if x+1 < len(numbers[y]):
if relevance[y][x+1] == 1:
count += 1
relevance[y][x] = 1
print("Changes after check " + str(check) + ": " + str(count))
if count == 0:
break
else:
count = 0
print(relevance)
for y in np.arange(0, len(numbers)):
for x in np.arange(0, len(numbers[y])):
if re.match(r'[sme]', numbers[y][x]):
if relevance[y][x] == 0:
numbers[y][x] = ' '
print(numbers)
parts = []
for y in np.arange(0, len(numbers)):
for x in np.arange(0, len(numbers[y])):
if re.match(r's', numbers[y][x]):
if x+1 < len(numbers[y]):
if re.match(r' ', numbers[y][x+1]):
parts.append(int(schematic[y][x]))
elif re.match(r'e', numbers[y][x+1]):
parts.append(int(str(schematic[y][x]) + str(schematic[y][x+1])))
elif re.match(r'm', numbers[y][x+1]):
if x+2 < len(numbers[y]):
if re.match(r'e', numbers[y][x+2]):
parts.append(int(str(schematic[y][x]) + str(schematic[y][x+1]) + str(schematic[y][x+2])))
elif re.match(r'm', numbers[y][x+2]):
if x+3 < len(numbers[y]):
if re.match(r'e', numbers[y][x+3]):
parts.append(int(str(schematic[y][x]) + str(schematic[y][x+1]) + str(schematic[y][x+2]) + str(schematic[y][x+3])))
elif re.match(r'm', numbers[y][x+3]):
print("\n\n Found a 5-digit number :( \n\n\n")
quit()
else:
print("this condition should not happen 1")
else:
print("this condition should not happen 2")
elif re.match(r' ', numbers[y][x+2]):
parts.append(int(str(schematic[y][x]) + str(schematic[y][x+1]) + str(schematic[y][x+2])))
else:
print("this condition should not happen 3")
else:
print("this condition should not happen 4")
else:
print("this condition should not happen 5")
else:
print("this condition should not happen 6")
print(parts)
result = sum(parts)
print(result)