-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
131 lines (106 loc) · 3.83 KB
/
main.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
def part_1():
with open("input.txt", "r") as file:
text = file.read()
rows = text.splitlines()
trees_visible = 0
for row_index, row in enumerate(rows):
last_row_index = len(rows) - 1
if row_index == 0 or row_index == last_row_index:
continue
numbers = [int(number) for number in row]
last_number_index = len(numbers) - 1
for number_index, number in enumerate(numbers):
if number_index == 0 or number_index == last_number_index:
continue
while True:
# Calculate numbers to the left of number_index
if number > max(numbers[:number_index]):
trees_visible += 1
break
# Calculate numbers to the right of number_index
if number > max(numbers[number_index + 1 :]):
trees_visible += 1
break
# Calculate rows above
numbers_in_above_rows = [
int(row_above[number_index]) for row_above in rows[:row_index]
]
if number > max(numbers_in_above_rows):
trees_visible += 1
break
# Calculate rows below
numbers_in_below_rows = [
int(row_below[number_index]) for row_below in rows[row_index + 1 :]
]
if number > max(numbers_in_below_rows):
trees_visible += 1
break
perimeter = (len(rows[0]) - 1) * 4
print(
f"Sum: {trees_visible + perimeter}",
)
def part_2():
with open("input.txt", "r") as file:
text = file.read()
rows = text.splitlines()
totals = []
for row_index, row in enumerate(rows):
last_row_index = len(rows) - 1
if row_index == 0 or row_index == last_row_index:
continue
numbers = [int(number) for number in row]
last_number_index = len(numbers) - 1
for number_index, number in enumerate(numbers):
if number_index == 0 or number_index == last_number_index:
continue
# Calculate numbers left
left_count = 0
left_numbers = numbers[:number_index]
left_numbers.reverse()
print(f"Left {left_numbers}")
for i in left_numbers:
if number > i:
left_count += 1
else:
left_count += 1
break
# Calculate numbers right
right_count = 0
for i in numbers[number_index + 1 :]:
if number > i:
right_count += 1
else:
right_count += 1
break
# Calculate rows above
above_rows = rows[:row_index]
above_rows.reverse()
numbers_in_above_rows = [
int(row_above[number_index]) for row_above in above_rows
]
above_count = 0
for i in numbers_in_above_rows:
if number > i:
above_count += 1
else:
above_count += 1
break
# Calculate rows below
numbers_in_below_rows = [
int(row_below[number_index]) for row_below in rows[row_index + 1 :]
]
below_count = 0
for i in numbers_in_below_rows:
if number > i:
below_count += 1
else:
below_count += 1
break
total = left_count * right_count * above_count * below_count
totals.append(total)
print(max(totals))
def main():
part_1()
part_2()
if __name__ == "__main__":
main()