Day 9
This commit is contained in:
parent
30fb63919a
commit
2466f81541
3
.gitignore
vendored
3
.gitignore
vendored
@ -1 +1,2 @@
|
||||
testinput.txt
|
||||
testinput.txt
|
||||
.venv/
|
||||
74
day09.py
Normal file
74
day09.py
Normal file
@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# https://adventofcode.com/2025/day/9
|
||||
|
||||
# requires Python package "shapely":
|
||||
# python -m venv .venv
|
||||
# . .venv/bin/activate
|
||||
# pip install shapely
|
||||
|
||||
from shapely import *
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
f = open("day09input.txt", "r")
|
||||
#f = open("testinput.txt", "r")
|
||||
data = [l.rstrip("\n").split(",") for l in f.readlines()]
|
||||
data = list(map(lambda x: (int(x[0]), int(x[1])), data))
|
||||
|
||||
def part1(tiles: list[list[int, int]]) -> int:
|
||||
l = len(tiles)
|
||||
max_area = (0, None, None)
|
||||
|
||||
# loop over tiles
|
||||
for i in range(l - 1):
|
||||
for j in range(i + 1, l):
|
||||
area = abs(tiles[i][0] - tiles[j][0] + 1) * abs(tiles[i][1] - tiles[j][1] + 1)
|
||||
if area > max_area[0]:
|
||||
max_area = (area, i, j)
|
||||
|
||||
return max_area[0]
|
||||
|
||||
|
||||
offsets = [(0, 0), (0, 1), (1, 0), (1, 1)]
|
||||
|
||||
def offset_polygon(tiles: list[list[int, int]]) -> Polygon:
|
||||
polygons = [Polygon(list(map(lambda t: (t[0] + o[0], t[1] + o[1]), tiles))) for o in offsets]
|
||||
return union_all(polygons, grid_size=1)
|
||||
|
||||
|
||||
def part2(tiles: list[list[int, int]]) -> int:
|
||||
polygon = offset_polygon(tiles)
|
||||
prepare(polygon)
|
||||
|
||||
# plt.plot(*polygon.exterior.xy, c="b")
|
||||
# plt.show()
|
||||
|
||||
l = len(tiles)
|
||||
max_area = (0, None, None)
|
||||
|
||||
for i in range(l - 1):
|
||||
for j in range(i + 1, l):
|
||||
rect = offset_polygon([tiles[i], (tiles[i][0], tiles[j][1]), tiles[j], (tiles[j][0], tiles[i][1])])
|
||||
# check if rect is inside polygon (see https://stackoverflow.com/a/56916189)
|
||||
if not rect.difference(polygon).area < 1e-14:
|
||||
# print(f"Rectangle {i}, {j} is not inside polygon -> skipping")
|
||||
continue
|
||||
|
||||
# print(f"Rectangle {i}, {j} has area {rect.area} and current max_area is {max_area[0]}")
|
||||
# check if area is larger than current max
|
||||
if rect.area > max_area[0]:
|
||||
print(f"Rectangle {i}, {j} is the new max with area {rect.area}")
|
||||
max_area = (int(rect.area), i, j)
|
||||
|
||||
print(f"Solution: The largest rectangle spans between points {max_area[1]} ({tiles[max_area[1]]}) and {max_area[2]} ({tiles[max_area[2]]}) with an area of {max_area[0]}")
|
||||
|
||||
plt.plot(*polygon.exterior.xy, c="b")
|
||||
i, j = max_area[1], max_area[2]
|
||||
rect = offset_polygon([tiles[i], (tiles[i][0], tiles[j][1]), tiles[j], (tiles[j][0], tiles[i][1])])
|
||||
plt.plot(*rect.exterior.xy, c="r")
|
||||
plt.show()
|
||||
return max_area[0]
|
||||
|
||||
|
||||
#print(part1(data))
|
||||
print(part2(data))
|
||||
496
day09input.txt
Normal file
496
day09input.txt
Normal file
@ -0,0 +1,496 @@
|
||||
97803,50388
|
||||
97803,51592
|
||||
97560,51592
|
||||
97560,52829
|
||||
98065,52829
|
||||
98065,54043
|
||||
97946,54043
|
||||
97946,55285
|
||||
98089,55285
|
||||
98089,56406
|
||||
97235,56406
|
||||
97235,57723
|
||||
97815,57723
|
||||
97815,58870
|
||||
97273,58870
|
||||
97273,59942
|
||||
96461,59942
|
||||
96461,61161
|
||||
96382,61161
|
||||
96382,62494
|
||||
96686,62494
|
||||
96686,63718
|
||||
96510,63718
|
||||
96510,64766
|
||||
95757,64766
|
||||
95757,65907
|
||||
95331,65907
|
||||
95331,67165
|
||||
95215,67165
|
||||
95215,68303
|
||||
94762,68303
|
||||
94762,69455
|
||||
94339,69455
|
||||
94339,70592
|
||||
93873,70592
|
||||
93873,71538
|
||||
93020,71538
|
||||
93020,72784
|
||||
92768,72784
|
||||
92768,73751
|
||||
91984,73751
|
||||
91984,74858
|
||||
91452,74858
|
||||
91452,75465
|
||||
90124,75465
|
||||
90124,76547
|
||||
89576,76547
|
||||
89576,77722
|
||||
89147,77722
|
||||
89147,78533
|
||||
88201,78533
|
||||
88201,79485
|
||||
87458,79485
|
||||
87458,80437
|
||||
86715,80437
|
||||
86715,81272
|
||||
85834,81272
|
||||
85834,82186
|
||||
85048,82186
|
||||
85048,83005
|
||||
84160,83005
|
||||
84160,84327
|
||||
83773,84327
|
||||
83773,85386
|
||||
83093,85386
|
||||
83093,85542
|
||||
81590,85542
|
||||
81590,86318
|
||||
80669,86318
|
||||
80669,87329
|
||||
79935,87329
|
||||
79935,88040
|
||||
78953,88040
|
||||
78953,88866
|
||||
78056,88866
|
||||
78056,89698
|
||||
77154,89698
|
||||
77154,89986
|
||||
75889,89986
|
||||
75889,91356
|
||||
75312,91356
|
||||
75312,91453
|
||||
73950,91453
|
||||
73950,91799
|
||||
72757,91799
|
||||
72757,92417
|
||||
71719,92417
|
||||
71719,93579
|
||||
70938,93579
|
||||
70938,93827
|
||||
69707,93827
|
||||
69707,94431
|
||||
68640,94431
|
||||
68640,95019
|
||||
67559,95019
|
||||
67559,95516
|
||||
66437,95516
|
||||
66437,95279
|
||||
65066,95279
|
||||
65066,95943
|
||||
64005,95943
|
||||
64005,96126
|
||||
62793,96126
|
||||
62793,96875
|
||||
61730,96875
|
||||
61730,97272
|
||||
60565,97272
|
||||
60565,97118
|
||||
59284,97118
|
||||
59284,96998
|
||||
58029,96998
|
||||
58029,97834
|
||||
56930,97834
|
||||
56930,98005
|
||||
55717,98005
|
||||
55717,97926
|
||||
54480,97926
|
||||
54480,98298
|
||||
53283,98298
|
||||
53283,97968
|
||||
52041,97968
|
||||
52041,98019
|
||||
50826,98019
|
||||
50826,98137
|
||||
49608,98137
|
||||
49608,98203
|
||||
48386,98203
|
||||
48386,97950
|
||||
47177,97950
|
||||
47177,97606
|
||||
45984,97606
|
||||
45984,97317
|
||||
44799,97317
|
||||
44799,97531
|
||||
43553,97531
|
||||
43553,96924
|
||||
42420,96924
|
||||
42420,97624
|
||||
41063,97624
|
||||
41063,96533
|
||||
40042,96533
|
||||
40042,96635
|
||||
38777,96635
|
||||
38777,96089
|
||||
37665,96089
|
||||
37665,95862
|
||||
36472,95862
|
||||
36472,95942
|
||||
35173,95942
|
||||
35173,95657
|
||||
33977,95657
|
||||
33977,94660
|
||||
33045,94660
|
||||
33045,94707
|
||||
31718,94707
|
||||
31718,94378
|
||||
30526,94378
|
||||
30526,93177
|
||||
29733,93177
|
||||
29733,93067
|
||||
28438,93067
|
||||
28438,92333
|
||||
27446,92333
|
||||
27446,91914
|
||||
26287,91914
|
||||
26287,91551
|
||||
25082,91551
|
||||
25082,90345
|
||||
24394,90345
|
||||
24394,90113
|
||||
23092,90113
|
||||
23092,89129
|
||||
22289,89129
|
||||
22289,88798
|
||||
21020,88798
|
||||
21020,87706
|
||||
20319,87706
|
||||
20319,87222
|
||||
19141,87222
|
||||
19141,86153
|
||||
18448,86153
|
||||
18448,85167
|
||||
17703,85167
|
||||
17703,84362
|
||||
16799,84362
|
||||
16799,83689
|
||||
15757,83689
|
||||
15757,82551
|
||||
15193,82551
|
||||
15193,81840
|
||||
14176,81840
|
||||
14176,80690
|
||||
13656,80690
|
||||
13656,79872
|
||||
12749,79872
|
||||
12749,79256
|
||||
11561,79256
|
||||
11561,78237
|
||||
10882,78237
|
||||
10882,77342
|
||||
10026,77342
|
||||
10026,76154
|
||||
9604,76154
|
||||
9604,75044
|
||||
9081,75044
|
||||
9081,74004
|
||||
8452,74004
|
||||
8452,72732
|
||||
8247,72732
|
||||
8247,71869
|
||||
7290,71869
|
||||
7290,70835
|
||||
6634,70835
|
||||
6634,69768
|
||||
6037,69768
|
||||
6037,68685
|
||||
5460,68685
|
||||
5460,67616
|
||||
4833,67616
|
||||
4833,66282
|
||||
4913,66282
|
||||
4913,65278
|
||||
4083,65278
|
||||
4083,63957
|
||||
4212,63957
|
||||
4212,62930
|
||||
3377,62930
|
||||
3377,61669
|
||||
3371,61669
|
||||
3371,60476
|
||||
3123,60476
|
||||
3123,59247
|
||||
3070,59247
|
||||
3070,58065
|
||||
2790,58065
|
||||
2790,56825
|
||||
2886,56825
|
||||
2886,55725
|
||||
1925,55725
|
||||
1925,54463
|
||||
2255,54463
|
||||
2255,53286
|
||||
1647,53286
|
||||
1647,52054
|
||||
1739,52054
|
||||
1739,50818
|
||||
2399,50818
|
||||
2399,50365
|
||||
94927,50365
|
||||
94927,48406
|
||||
2412,48406
|
||||
2412,47178
|
||||
2078,47178
|
||||
2078,45954
|
||||
2037,45954
|
||||
2037,44781
|
||||
2521,44781
|
||||
2521,43594
|
||||
2776,43594
|
||||
2776,42423
|
||||
3095,42423
|
||||
3095,41086
|
||||
2494,41086
|
||||
2494,39917
|
||||
2883,39917
|
||||
2883,38850
|
||||
3668,38850
|
||||
3668,37497
|
||||
3280,37497
|
||||
3280,36296
|
||||
3540,36296
|
||||
3540,35327
|
||||
4532,35327
|
||||
4532,34008
|
||||
4429,34008
|
||||
4429,33086
|
||||
5448,33086
|
||||
5448,31727
|
||||
5313,31727
|
||||
5313,30760
|
||||
6155,30760
|
||||
6155,29783
|
||||
6927,29783
|
||||
6927,28345
|
||||
6747,28345
|
||||
6747,27596
|
||||
7947,27596
|
||||
7947,26360
|
||||
8213,26360
|
||||
8213,25322
|
||||
8847,25322
|
||||
8847,24448
|
||||
9740,24448
|
||||
9740,23165
|
||||
9995,23165
|
||||
9995,22317
|
||||
10909,22317
|
||||
10909,21113
|
||||
11324,21113
|
||||
11324,20171
|
||||
12105,20171
|
||||
12105,19626
|
||||
13362,19626
|
||||
13362,18633
|
||||
14058,18633
|
||||
14058,17444
|
||||
14549,17444
|
||||
14549,16961
|
||||
15805,16961
|
||||
15805,15714
|
||||
16268,15714
|
||||
16268,15199
|
||||
17454,15199
|
||||
17454,13913
|
||||
17926,13913
|
||||
17926,13499
|
||||
19177,13499
|
||||
19177,12441
|
||||
19880,12441
|
||||
19880,11932
|
||||
21025,11932
|
||||
21025,11190
|
||||
21984,11190
|
||||
21984,10290
|
||||
22838,10290
|
||||
22838,9316
|
||||
23659,9316
|
||||
23659,8825
|
||||
24798,8825
|
||||
24798,8764
|
||||
26175,8764
|
||||
26175,7524
|
||||
26873,7524
|
||||
26873,7652
|
||||
28315,7652
|
||||
28315,6993
|
||||
29336,6993
|
||||
29336,6020
|
||||
30224,6020
|
||||
30224,5575
|
||||
31362,5575
|
||||
31362,5620
|
||||
32689,5620
|
||||
32689,4746
|
||||
33657,4746
|
||||
33657,4677
|
||||
34919,4677
|
||||
34919,4301
|
||||
36069,4301
|
||||
36069,4017
|
||||
37246,4017
|
||||
37246,3003
|
||||
38238,3003
|
||||
38238,2870
|
||||
39466,2870
|
||||
39466,2453
|
||||
40631,2453
|
||||
40631,2632
|
||||
41907,2632
|
||||
41907,2364
|
||||
43098,2364
|
||||
43098,2394
|
||||
44330,2394
|
||||
44330,2519
|
||||
45561,2519
|
||||
45561,2161
|
||||
46748,2161
|
||||
46748,2483
|
||||
47977,2483
|
||||
47977,2094
|
||||
49175,2094
|
||||
49175,1995
|
||||
50390,1995
|
||||
50390,2181
|
||||
51601,2181
|
||||
51601,2223
|
||||
52812,2223
|
||||
52812,2642
|
||||
53994,2642
|
||||
53994,1871
|
||||
55290,1871
|
||||
55290,2310
|
||||
56468,2310
|
||||
56468,2736
|
||||
57634,2736
|
||||
57634,2787
|
||||
58858,2787
|
||||
58858,2780
|
||||
60104,2780
|
||||
60104,3238
|
||||
61252,3238
|
||||
61252,4056
|
||||
62295,4056
|
||||
62295,3927
|
||||
63589,3927
|
||||
63589,4176
|
||||
64787,4176
|
||||
64787,4315
|
||||
66031,4315
|
||||
66031,5315
|
||||
66963,5315
|
||||
66963,5138
|
||||
68344,5138
|
||||
68344,6216
|
||||
69212,6216
|
||||
69212,6870
|
||||
70243,6870
|
||||
70243,7208
|
||||
71423,7208
|
||||
71423,7868
|
||||
72445,7868
|
||||
72445,8485
|
||||
73486,8485
|
||||
73486,8474
|
||||
74901,8474
|
||||
74901,9235
|
||||
75871,9235
|
||||
75871,10113
|
||||
76755,10113
|
||||
76755,10593
|
||||
77906,10593
|
||||
77906,11703
|
||||
78604,11703
|
||||
78604,12013
|
||||
79900,12013
|
||||
79900,13413
|
||||
80330,13413
|
||||
80330,13900
|
||||
81503,13900
|
||||
81503,14537
|
||||
82567,14537
|
||||
82567,15743
|
||||
83097,15743
|
||||
83097,16651
|
||||
83895,16651
|
||||
83895,17506
|
||||
84745,17506
|
||||
84745,17912
|
||||
86101,17912
|
||||
86101,18851
|
||||
86886,18851
|
||||
86886,20042
|
||||
87356,20042
|
||||
87356,20809
|
||||
88351,20809
|
||||
88351,21826
|
||||
89028,21826
|
||||
89028,23146
|
||||
89258,23146
|
||||
89258,23752
|
||||
90540,23752
|
||||
90540,24692
|
||||
91347,24692
|
||||
91347,26117
|
||||
91336,26117
|
||||
91336,27130
|
||||
92003,27130
|
||||
92003,27951
|
||||
93060,27951
|
||||
93060,29104
|
||||
93489,29104
|
||||
93489,30128
|
||||
94193,30128
|
||||
94193,31491
|
||||
94116,31491
|
||||
94116,32706
|
||||
94335,32706
|
||||
94335,33652
|
||||
95266,33652
|
||||
95266,34881
|
||||
95434,34881
|
||||
95434,36038
|
||||
95798,36038
|
||||
95798,37196
|
||||
96162,37196
|
||||
96162,38331
|
||||
96626,38331
|
||||
96626,39426
|
||||
97310,39426
|
||||
97310,40668
|
||||
97359,40668
|
||||
97359,41849
|
||||
97707,41849
|
||||
97707,43108
|
||||
97569,43108
|
||||
97569,44376
|
||||
97218,44376
|
||||
97218,45527
|
||||
97840,45527
|
||||
97840,46776
|
||||
97425,46776
|
||||
97425,47939
|
||||
98400,47939
|
||||
98400,49175
|
||||
97914,49175
|
||||
97914,50388
|
||||
Loading…
Reference in New Issue
Block a user