Compare commits
3 Commits
c200e211c9
...
0dcd675042
| Author | SHA1 | Date | |
|---|---|---|---|
| 0dcd675042 | |||
| 92138cf8e5 | |||
| b29945625a |
496
day09/input
Normal file
496
day09/input
Normal 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
8
day09/sample
Normal 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
99
day09/sol.py
Normal 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")
|
||||||
Loading…
x
Reference in New Issue
Block a user