Compare commits

..

3 Commits

Author SHA1 Message Date
0dcd675042 day 9 cleanup 2025-12-09 06:38:54 +00:00
92138cf8e5 day 9 part 2 2025-12-09 06:15:12 +00:00
b29945625a day 9 part 1 2025-12-09 05:14:57 +00:00
3 changed files with 603 additions and 0 deletions

496
day09/input Normal file
View File

@ -0,0 +1,496 @@
98292,50082
98292,51299
98041,51299
98041,52512
97933,52512
97933,53729
97891,53729
97891,54958
97948,54958
97948,56123
97437,56123
97437,57349
97434,57349
97434,58625
97658,58625
97658,59815
97354,59815
97354,61007
97068,61007
97068,62109
96444,62109
96444,63237
95967,63237
95967,64422
95696,64422
95696,65722
95742,65722
95742,66911
95424,66911
95424,67730
94169,67730
94169,69128
94366,69128
94366,70025
93389,70025
93389,71338
93314,71338
93314,72103
92139,72103
92139,73287
91787,73287
91787,74514
91481,74514
91481,75422
90632,75422
90632,76704
90368,76704
90368,77568
89464,77568
89464,78483
88650,78483
88650,79236
87637,79236
87637,80655
87465,80655
87465,81115
86119,81115
86119,82571
85928,82571
85928,83239
84848,83239
84848,84347
84231,84347
84231,84722
82893,84722
82893,85694
82138,85694
82138,86215
80982,86215
80982,87023
80083,87023
80083,87874
79213,87874
79213,88861
78434,88861
78434,89490
77386,89490
77386,90035
76288,90035
76288,90659
75247,90659
75247,91834
74530,91834
74530,91663
73032,91663
73032,92769
72247,92769
72247,93129
71065,93129
71065,93719
69997,93719
69997,94601
69050,94601
69050,94483
67680,94483
67680,94626
66441,94626
66441,95786
65563,95786
65563,95363
64148,95363
64148,96153
63120,96153
63120,96752
62020,96752
62020,96319
60665,96319
60665,96704
59514,96704
59514,96954
58333,96954
58333,97717
57226,97717
57226,97419
55957,97419
55957,97683
54766,97683
54766,97392
53527,97392
53527,97506
52328,97506
52328,97750
51128,97750
51128,97884
49918,97884
49918,98455
48689,98455
48689,97950
47486,97950
47486,97626
46291,97626
46291,97900
45046,97900
45046,97981
43806,97981
43806,97693
42610,97693
42610,97475
41407,97475
41407,96948
40268,96948
40268,96341
39162,96341
39162,95987
38009,95987
38009,96196
36696,96196
36696,95887
35516,95887
35516,94958
34547,94958
34547,95161
33186,95161
33186,94474
32146,94474
32146,93686
31164,93686
31164,93591
29880,93591
29880,93365
28636,93365
28636,92868
27514,92868
27514,91996
26595,91996
26595,91248
25623,91248
25623,90405
24719,90405
24719,89965
23562,89965
23562,89216
22605,89216
22605,88794
21410,88794
21410,87854
20595,87854
20595,87135
19614,87135
19614,86044
18949,86044
18949,85497
17819,85497
17819,84807
16800,84807
16800,83553
16331,83553
16331,83087
15072,83087
15072,81979
14481,81979
14481,81230
13494,81230
13494,80364
12631,80364
12631,79438
11834,79438
11834,78320
11294,78320
11294,77350
10561,77350
10561,76275
9983,76275
9983,75427
9049,75427
9049,74517
8187,74517
8187,73207
8020,73207
8020,71987
7731,71987
7731,71263
6464,71263
6464,70095
6066,70095
6066,68916
5711,68916
5711,67727
5399,67727
5399,66691
4694,66691
4694,65298
4992,65298
4992,64223
4395,64223
4395,63008
4243,63008
4243,61887
3762,61887
3762,60810
3049,60810
3049,59627
2745,59627
2745,58451
2377,58451
2377,57232
2245,57232
2245,55998
2255,55998
2255,54788
2103,54788
2103,53599
1645,53599
1645,52353
1980,52353
1980,51122
2484,51122
2484,50076
94607,50076
94607,48713
2419,48713
2419,47502
2367,47502
2367,46305
2556,46305
2556,45069
2319,45069
2319,43868
2503,43868
2503,42604
2271,42604
2271,41378
2366,41378
2366,40243
2932,40243
2932,39158
3637,39158
3637,37993
3952,37993
3952,36700
3817,36700
3817,35502
4067,35502
4067,34405
4628,34405
4628,33233
4965,33233
4965,32219
5706,32219
5706,30966
5853,30966
5853,30059
6796,30059
6796,28764
6895,28764
6895,27555
7210,27555
7210,26525
7877,26525
7877,25807
9062,25807
9062,24416
9111,24416
9111,23301
9639,23301
9639,22495
10627,22495
10627,21248
10985,21248
10985,20458
11969,20458
11969,19850
13153,19850
13153,18527
13465,18527
13465,17780
14460,17780
14460,16736
15125,16736
15125,16113
16229,16113
16229,15375
17198,15375
17198,14067
17646,14067
17646,13204
18520,13204
18520,12766
19745,12766
19745,11706
20463,11706
20463,11476
21812,11476
21812,10306
22472,10306
22472,9799
23603,9799
23603,9481
24840,9481
24840,8594
25721,8594
25721,8321
26959,8321
26959,7306
27791,7306
27791,6632
28818,6632
28818,6289
30006,6289
30006,5752
31101,5752
31101,5616
32358,5616
32358,4838
33361,4838
33361,4326
34475,4326
34475,4414
35782,4414
35782,3495
36779,3495
36779,3373
38012,3373
38012,2815
39135,2815
39135,3440
40514,3440
40514,2709
41607,2709
41607,2818
42854,2818
42854,1922
43960,1922
43960,1884
45189,1884
45189,2138
46437,2138
46437,2264
47660,2264
47660,1956
48864,1956
48864,1579
50082,1579
50082,1956
51299,1956
51299,1669
52533,1669
52533,1656
53764,1656
53764,2349
54927,2349
54927,2193
56171,2193
56171,3042
57275,3042
57275,2822
58538,2822
58538,2858
59771,2858
59771,3154
60954,3154
60954,3953
62006,3953
62006,4034
63237,4034
63237,4422
64385,4422
64385,4471
65649,4471
65649,5053
66733,5053
66733,5422
67894,5422
67894,5800
69056,5800
69056,6313
70162,6313
70162,6949
71208,6949
71208,7281
72406,7281
72406,8118
73339,8118
73339,8878
74301,8878
74301,9110
75583,9110
75583,9760
76618,9760
76618,10542
77562,10542
77562,11459
78402,11459
78402,11839
79642,11839
79642,12591
80609,12591
80609,13867
81126,13867
81126,14279
82382,14279
82382,15350
83049,15350
83049,15940
84176,15940
84176,16870
84971,16870
84971,17882
85671,17882
85671,18636
86660,18636
86660,19524
87505,19524
87505,20842
87801,20842
87801,21454
89013,21454
89013,22634
89459,22634
89459,23916
89724,23916
89724,24675
90783,24675
90783,25871
91149,25871
91149,26864
91850,26864
91850,27747
92777,27747
92777,29088
92815,29088
92815,29845
94062,29845
94062,31020
94436,31020
94436,32266
94616,32266
94616,33501
94782,33501
94782,34499
95601,34499
95601,35767
95634,35767
95634,36965
95849,36965
95849,38021
96591,38021
96591,39160
97075,39160
97075,40461
96820,40461
96820,41594
97362,41594
97362,42761
97798,42761
97798,44061
97274,44061
97274,45271
97302,45271
97302,46441
97806,46441
97806,47663
97683,47663
97683,48874
97612,48874
97612,50082

8
day09/sample Normal file
View File

@ -0,0 +1,8 @@
7,1
11,1
11,7
9,7
9,5
2,5
2,3
7,3

99
day09/sol.py Normal file
View File

@ -0,0 +1,99 @@
from math import dist
def solve(input):
points = []
for line in open(input):
x,y = map(int, line.strip().split(","))
points.append((x,y))
# Part 1:
# find the largest rectangle created by two points
def areas():
for p in points:
for q in points:
if p != q:
yield area(p,q)
# answer 1
print(max(areas()))
# Part 2:
# find the largest rectangle formed by a pair of points
# which is contained within the polygon defined by the list of points.
lines = list(zip(points, points[1:]+[points[0]]))
# keep only vertical lines, and sort so the uppermost point (lowest y coord) is the first of the pair
lines = [(min(p,q),max(p,q)) for p,q in lines if p[1] != q[1]]
# sort lines by y coord
lines.sort(key=lambda l: (l[0][1],l[1][1],l[0][0],l[1][0]))
#print(lines)
# we want to know if the rectangle formed by a pair of points
# is completely contained within an axis-aligned polygon.
#
# we can do that with a pseudo-scanline algorithm.
#
# we make a couple simplifying assumptions:
# 1. first, that the polygon is not self-intersecting
# 2. second, that the polygon is not "U shaped" --
# that is, it has a definite, single width in every horizontal slice
# and it doesn't curve around at all -- so we don't have to worry
# about voids
#
# for each y position, we first calculate the horizontal bounds of the
# polygon at that line.
#
# then, to test if a rectangle is contained within the polygon,
# we just need to iterate through the y positions which fall inside the rectangle
# and check whether the rectangle would exceed the previously computed bounds
# of the polygon at any of those points.
bounds = {}
ys = sorted(set(p[1] for l in lines for p in l))
for y in ys:
# select lines which intersect with the scanline at y
mylines = []
for p,q in lines:
if p[1] <= y <= q[1]:
mylines.append(p[0]) # only keep the x coord
# since we are assuming no self-intersection and no voids,
# the bounds on this line are just the leftmost and rightmost
# x coordinate of the intersecting lines
bounds[y] = (min(mylines),max(mylines))
#print(ys)
#print(bounds)
def inbounds(p,q):
y0 = min(p[1],q[1])
y1 = max(p[1],q[1])
x0 = min(p[0],q[0])
x1 = max(p[0],q[0])
#print(y0, y1, ys)
start = ys.index(y0)
for i in range(start,len(ys)):
y = ys[i]
if y > y1:
break
if not bounds[y][0] <= x0 <= x1 <= bounds[y][1]:
return False
return True
def inbound_areas():
for p in points:
for q in points:
if p != q and inbounds(p,q):
yield area(p,q)
# answer 2
print(max(inbound_areas()))
def area(p,q):
dx = abs(p[0] - q[0]) + 1
dy = abs(p[1] - q[1]) + 1
return dx*dy
solve("sample")
solve("input")