Compare commits
3 Commits
fe3aa98c22
...
f5bb2869d3
| Author | SHA1 | Date | |
|---|---|---|---|
| f5bb2869d3 | |||
| ed9f009bec | |||
| 31fa002b1b |
@@ -35,5 +35,9 @@ path = "src/day7/main.rs"
|
||||
name = "day8"
|
||||
path = "src/day8/main.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "day9"
|
||||
path = "src/day9/main.rs"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.100"
|
||||
|
||||
25
src/day9/act.html
Normal file
25
src/day9/act.html
Normal file
File diff suppressed because one or more lines are too long
496
src/day9/act.txt
Normal file
496
src/day9/act.txt
Normal file
@@ -0,0 +1,496 @@
|
||||
98004,50283
|
||||
98004,51502
|
||||
98073,51502
|
||||
98073,52727
|
||||
98144,52727
|
||||
98144,53937
|
||||
97953,53937
|
||||
97953,55168
|
||||
98003,55168
|
||||
98003,56406
|
||||
98033,56406
|
||||
98033,57473
|
||||
96926,57473
|
||||
96926,58748
|
||||
97199,58748
|
||||
97199,59926
|
||||
96895,59926
|
||||
96895,61220
|
||||
97084,61220
|
||||
97084,62314
|
||||
96426,62314
|
||||
96426,63395
|
||||
95789,63395
|
||||
95789,64490
|
||||
95244,64490
|
||||
95244,65829
|
||||
95432,65829
|
||||
95432,66934
|
||||
94907,66934
|
||||
94907,68050
|
||||
94423,68050
|
||||
94423,69341
|
||||
94345,69341
|
||||
94345,70156
|
||||
93192,70156
|
||||
93192,71485
|
||||
93153,71485
|
||||
93153,72568
|
||||
92590,72568
|
||||
92590,73702
|
||||
92113,73702
|
||||
92113,74741
|
||||
91467,74741
|
||||
91467,75567
|
||||
90483,75567
|
||||
90483,76688
|
||||
89978,76688
|
||||
89978,77537
|
||||
89068,77537
|
||||
89068,78372
|
||||
88163,78372
|
||||
88163,79469
|
||||
87609,79469
|
||||
87609,80612
|
||||
87093,80612
|
||||
87093,81578
|
||||
86346,81578
|
||||
86346,82422
|
||||
85463,82422
|
||||
85463,82939
|
||||
84244,82939
|
||||
84244,84206
|
||||
83804,84206
|
||||
83804,84848
|
||||
82735,84848
|
||||
82735,85434
|
||||
81634,85434
|
||||
81634,86745
|
||||
81168,86745
|
||||
81168,87730
|
||||
80395,87730
|
||||
80395,87950
|
||||
79018,87950
|
||||
79018,88564
|
||||
77968,88564
|
||||
77968,89681
|
||||
77272,89681
|
||||
77272,90032
|
||||
76045,90032
|
||||
76045,90883
|
||||
75148,90883
|
||||
75148,91125
|
||||
73882,91125
|
||||
73882,91934
|
||||
72952,91934
|
||||
72952,92557
|
||||
71910,92557
|
||||
71910,92993
|
||||
70774,92993
|
||||
70774,93784
|
||||
69804,93784
|
||||
69804,94065
|
||||
68601,94065
|
||||
68601,94737
|
||||
67564,94737
|
||||
67564,94644
|
||||
66234,94644
|
||||
66234,95260
|
||||
65172,95260
|
||||
65172,96308
|
||||
64228,96308
|
||||
64228,96569
|
||||
63027,96569
|
||||
63027,96815
|
||||
61826,96815
|
||||
61826,96343
|
||||
60465,96343
|
||||
60465,96835
|
||||
59336,96835
|
||||
59336,97723
|
||||
58262,97723
|
||||
58262,97006
|
||||
56916,97006
|
||||
56916,97227
|
||||
55731,97227
|
||||
55731,97435
|
||||
54540,97435
|
||||
54540,98266
|
||||
53388,98266
|
||||
53388,98391
|
||||
52167,98391
|
||||
52167,98195
|
||||
50936,98195
|
||||
50936,98172
|
||||
49715,98172
|
||||
49715,97959
|
||||
48500,97959
|
||||
48500,98135
|
||||
47273,98135
|
||||
47273,98219
|
||||
46040,98219
|
||||
46040,97295
|
||||
44907,97295
|
||||
44907,97942
|
||||
43605,97942
|
||||
43605,96967
|
||||
42520,96967
|
||||
42520,96937
|
||||
41300,96937
|
||||
41300,96652
|
||||
40124,96652
|
||||
40124,96994
|
||||
38801,96994
|
||||
38801,96419
|
||||
37687,96419
|
||||
37687,95965
|
||||
36552,95965
|
||||
36552,95897
|
||||
35300,95897
|
||||
35300,95312
|
||||
34211,95312
|
||||
34211,94929
|
||||
33056,94929
|
||||
33056,94007
|
||||
32118,94007
|
||||
32118,93804
|
||||
30894,93804
|
||||
30894,93729
|
||||
29593,93729
|
||||
29593,93046
|
||||
28568,93046
|
||||
28568,92453
|
||||
27503,92453
|
||||
27503,91601
|
||||
26586,91601
|
||||
26586,90840
|
||||
25632,90840
|
||||
25632,90635
|
||||
24336,90635
|
||||
24336,89546
|
||||
23599,89546
|
||||
23599,89479
|
||||
22173,89479
|
||||
22173,88691
|
||||
21234,88691
|
||||
21234,87455
|
||||
20651,87455
|
||||
20651,87191
|
||||
19306,87191
|
||||
19306,86273
|
||||
18485,86273
|
||||
18485,85089
|
||||
17918,85089
|
||||
17918,84736
|
||||
16587,84736
|
||||
16587,83568
|
||||
16032,83568
|
||||
16032,83102
|
||||
14760,83102
|
||||
14760,82116
|
||||
14026,82116
|
||||
14026,81313
|
||||
13084,81313
|
||||
13084,79817
|
||||
12987,79817
|
||||
12987,79115
|
||||
11922,79115
|
||||
11922,78148
|
||||
11187,78148
|
||||
11187,77151
|
||||
10493,77151
|
||||
10493,75950
|
||||
10112,75950
|
||||
10112,74905
|
||||
9511,74905
|
||||
9511,74201
|
||||
8326,74201
|
||||
8326,72904
|
||||
8152,72904
|
||||
8152,71838
|
||||
7581,71838
|
||||
7581,70676
|
||||
7210,70676
|
||||
7210,69798
|
||||
6230,69798
|
||||
6230,68607
|
||||
5921,68607
|
||||
5921,67692
|
||||
4935,67692
|
||||
4935,66370
|
||||
4983,66370
|
||||
4983,65240
|
||||
4534,65240
|
||||
4534,64208
|
||||
3759,64208
|
||||
3759,62870
|
||||
3992,62870
|
||||
3992,61715
|
||||
3622,61715
|
||||
3622,60663
|
||||
2780,60663
|
||||
2780,59343
|
||||
3127,59343
|
||||
3127,58209
|
||||
2581,58209
|
||||
2581,57040
|
||||
2155,57040
|
||||
2155,55761
|
||||
2518,55761
|
||||
2518,54592
|
||||
2022,54592
|
||||
2022,53344
|
||||
2362,53344
|
||||
2362,52146
|
||||
2079,52146
|
||||
2079,50925
|
||||
2365,50925
|
||||
2365,50265
|
||||
94901,50265
|
||||
94901,48488
|
||||
1659,48488
|
||||
1659,47308
|
||||
2494,47308
|
||||
2494,46043
|
||||
1812,46043
|
||||
1812,44875
|
||||
2401,44875
|
||||
2401,43591
|
||||
1950,43591
|
||||
1950,42377
|
||||
2134,42377
|
||||
2134,41191
|
||||
2472,41191
|
||||
2472,40153
|
||||
3483,40153
|
||||
3483,38963
|
||||
3684,38963
|
||||
3684,37617
|
||||
3317,37617
|
||||
3317,36454
|
||||
3697,36454
|
||||
3697,35377
|
||||
4342,35377
|
||||
4342,34263
|
||||
4837,34263
|
||||
4837,32955
|
||||
4800,32955
|
||||
4800,31869
|
||||
5379,31869
|
||||
5379,30923
|
||||
6262,30923
|
||||
6262,29782
|
||||
6675,29782
|
||||
6675,28650
|
||||
7119,28650
|
||||
7119,27415
|
||||
7379,27415
|
||||
7379,26415
|
||||
8095,26415
|
||||
8095,25406
|
||||
8781,25406
|
||||
8781,24145
|
||||
9061,24145
|
||||
9061,23300
|
||||
10005,23300
|
||||
10005,22154
|
||||
10494,22154
|
||||
10494,21597
|
||||
11796,21597
|
||||
11796,20131
|
||||
11881,20131
|
||||
11881,19735
|
||||
13328,19735
|
||||
13328,18722
|
||||
13998,18722
|
||||
13998,17795
|
||||
14776,17795
|
||||
14776,16811
|
||||
15496,16811
|
||||
15496,15841
|
||||
16243,15841
|
||||
16243,14681
|
||||
16822,14681
|
||||
16822,14162
|
||||
18004,14162
|
||||
18004,13340
|
||||
18903,13340
|
||||
18903,12715
|
||||
19963,12715
|
||||
19963,11815
|
||||
20802,11815
|
||||
20802,11108
|
||||
21793,11108
|
||||
21793,10828
|
||||
23078,10828
|
||||
23078,10062
|
||||
24016,10062
|
||||
24016,9070
|
||||
24823,9070
|
||||
24823,8392
|
||||
25837,8392
|
||||
25837,7547
|
||||
26764,7547
|
||||
26764,7731
|
||||
28238,7731
|
||||
28238,6379
|
||||
28922,6379
|
||||
28922,5921
|
||||
30062,5921
|
||||
30062,5661
|
||||
31282,5661
|
||||
31282,5137
|
||||
32386,5137
|
||||
32386,5118
|
||||
33678,5118
|
||||
33678,4277
|
||||
34673,4277
|
||||
34673,4403
|
||||
35989,4403
|
||||
35989,4090
|
||||
37156,4090
|
||||
37156,3656
|
||||
38292,3656
|
||||
38292,3559
|
||||
39512,3559
|
||||
39512,2594
|
||||
40549,2594
|
||||
40549,2472
|
||||
41771,2472
|
||||
41771,2323
|
||||
42984,2323
|
||||
42984,2689
|
||||
44258,2689
|
||||
44258,2443
|
||||
45448,2443
|
||||
45448,2139
|
||||
46639,2139
|
||||
46639,1555
|
||||
47830,1555
|
||||
47830,1845
|
||||
49064,1845
|
||||
49064,1634
|
||||
50286,1634
|
||||
50286,2188
|
||||
51494,2188
|
||||
51494,2386
|
||||
52697,2386
|
||||
52697,2595
|
||||
53892,2595
|
||||
53892,2621
|
||||
55101,2621
|
||||
55101,2661
|
||||
56313,2661
|
||||
56313,2728
|
||||
57528,2728
|
||||
57528,2364
|
||||
58828,2364
|
||||
58828,2818
|
||||
59987,2818
|
||||
59987,2845
|
||||
61236,2845
|
||||
61236,3836
|
||||
62244,3836
|
||||
62244,3791
|
||||
63518,3791
|
||||
63518,4250
|
||||
64651,4250
|
||||
64651,4284
|
||||
65928,4284
|
||||
65928,5346
|
||||
66839,5346
|
||||
66839,5849
|
||||
67939,5849
|
||||
67939,5650
|
||||
69343,5650
|
||||
69343,6127
|
||||
70473,6127
|
||||
70473,7026
|
||||
71396,7026
|
||||
71396,7311
|
||||
72621,7311
|
||||
72621,7898
|
||||
73695,7898
|
||||
73695,8360
|
||||
74844,8360
|
||||
74844,9323
|
||||
75689,9323
|
||||
75689,9834
|
||||
76813,9834
|
||||
76813,10909
|
||||
77552,10909
|
||||
77552,11764
|
||||
78426,11764
|
||||
78426,12198
|
||||
79619,12198
|
||||
79619,12720
|
||||
80766,12720
|
||||
80766,13911
|
||||
81353,13911
|
||||
81353,14300
|
||||
82639,14300
|
||||
82639,15444
|
||||
83238,15444
|
||||
83238,15925
|
||||
84480,15925
|
||||
84480,17167
|
||||
84951,17167
|
||||
84951,18280
|
||||
85528,18280
|
||||
85528,19271
|
||||
86225,19271
|
||||
86225,20163
|
||||
87036,20163
|
||||
87036,20724
|
||||
88286,20724
|
||||
88286,21775
|
||||
88917,21775
|
||||
88917,22924
|
||||
89395,22924
|
||||
89395,24077
|
||||
89844,24077
|
||||
89844,24888
|
||||
90823,24888
|
||||
90823,25962
|
||||
91392,25962
|
||||
91392,27042
|
||||
91944,27042
|
||||
91944,28174
|
||||
92391,28174
|
||||
92391,28956
|
||||
93550,28956
|
||||
93550,30107
|
||||
93978,30107
|
||||
93978,31501
|
||||
93820,31501
|
||||
93820,32387
|
||||
94861,32387
|
||||
94861,33531
|
||||
95288,33531
|
||||
95288,34727
|
||||
95560,34727
|
||||
95560,35758
|
||||
96349,35758
|
||||
96349,37174
|
||||
95847,37174
|
||||
95847,38217
|
||||
96640,38217
|
||||
96640,39523
|
||||
96391,39523
|
||||
96391,40646
|
||||
96922,40646
|
||||
96922,41796
|
||||
97381,41796
|
||||
97381,43019
|
||||
97440,43019
|
||||
97440,44222
|
||||
97609,44222
|
||||
97609,45404
|
||||
98016,45404
|
||||
98016,46605
|
||||
98352,46605
|
||||
98352,47838
|
||||
98266,47838
|
||||
98266,49062
|
||||
98278,49062
|
||||
98278,50283
|
||||
193
src/day9/main.rs
Normal file
193
src/day9/main.rs
Normal file
@@ -0,0 +1,193 @@
|
||||
use anyhow::Result;
|
||||
use std::{fs, ops::Range};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Hash)]
|
||||
struct TilePos {
|
||||
x: i64,
|
||||
y: i64,
|
||||
}
|
||||
|
||||
impl TilePos {
|
||||
fn area(&self, other: &TilePos) -> u64 {
|
||||
(((self.x - other.x).abs() + 1) * ((self.y - other.y).abs() + 1)) as u64
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<TilePos> for &str {
|
||||
fn into(self) -> TilePos {
|
||||
let mut niter = self.split(",");
|
||||
let x: i64 = niter.next().unwrap().parse().unwrap();
|
||||
let y: i64 = niter.next().unwrap().parse().unwrap();
|
||||
TilePos { x, y }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Pair<'a> {
|
||||
b1: &'a TilePos,
|
||||
b2: &'a TilePos,
|
||||
area: u64,
|
||||
}
|
||||
|
||||
impl<'a> Pair<'a> {
|
||||
fn new(b1: &'a TilePos, b2: &'a TilePos) -> Pair<'a> {
|
||||
Pair {
|
||||
b1,
|
||||
b2,
|
||||
area: b1.area(b2),
|
||||
}
|
||||
}
|
||||
|
||||
fn get_x_range(&'a self) -> Range<i64> {
|
||||
match self.b1.x.cmp(&self.b2.x) {
|
||||
std::cmp::Ordering::Equal => panic!("unrechable {:?}", self),
|
||||
std::cmp::Ordering::Less => (self.b1.x + 1)..self.b2.x,
|
||||
std::cmp::Ordering::Greater => (self.b2.x + 1)..self.b1.x,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_y_range(&'a self) -> Range<i64> {
|
||||
match self.b1.y.cmp(&self.b2.y) {
|
||||
std::cmp::Ordering::Equal => panic!("unrechable {:?}", self),
|
||||
std::cmp::Ordering::Less => (self.b1.y + 1)..self.b2.y,
|
||||
std::cmp::Ordering::Greater => (self.b2.y + 1)..self.b1.y,
|
||||
}
|
||||
}
|
||||
|
||||
fn colide(&'a self, other: &'a Pair) -> bool {
|
||||
if self.b1.x == self.b2.x && other.b1.y == other.b2.y {
|
||||
self.get_y_range().contains(&other.b1.y) && other.get_x_range().contains(&self.b1.x)
|
||||
} else if self.b1.y == self.b2.y && other.b1.x == other.b2.x {
|
||||
self.get_x_range().contains(&other.b1.x) && other.get_y_range().contains(&self.b1.y)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn as_rect(&self) {
|
||||
println!(
|
||||
"<path style=\"fill:black\" d=\"M{} {} L{} {} L{} {} L{} {}\" count=\"{}\" />",
|
||||
self.b1.x,
|
||||
self.b1.y,
|
||||
self.b2.x,
|
||||
self.b1.y,
|
||||
self.b2.x,
|
||||
self.b2.y,
|
||||
self.b1.x,
|
||||
self.b2.y,
|
||||
self.area
|
||||
);
|
||||
}
|
||||
|
||||
// Usefull for debugging
|
||||
// fn as_line(&self) {
|
||||
// println!(
|
||||
// "<line x1=\"{}\" y1=\"{}\" x2=\"{}\" y2=\"{}\" style=\"stroke:yellow;stroke-width:100\" />",
|
||||
// self.b1.x, self.b1.y, self.b2.x, self.b2.y,
|
||||
// );
|
||||
// }
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let text = fs::read_to_string("src/day9/act.txt")?;
|
||||
|
||||
let boxes: Vec<TilePos> = text
|
||||
.split("\n")
|
||||
.filter(|s| s.len() > 0)
|
||||
.map(|s| s.into())
|
||||
.collect();
|
||||
|
||||
let mut order_pair = Vec::with_capacity(boxes.len() + 1);
|
||||
|
||||
for (i, b1) in boxes.iter().enumerate() {
|
||||
order_pair.push(Pair::new(
|
||||
b1,
|
||||
if i + 1 >= boxes.len() {
|
||||
&boxes[0]
|
||||
} else {
|
||||
&boxes[i + 1]
|
||||
},
|
||||
))
|
||||
}
|
||||
|
||||
let mut pairs: Vec<Pair> = Vec::with_capacity(boxes.len() * boxes.len());
|
||||
|
||||
for (i, b1) in boxes.iter().enumerate() {
|
||||
for b2 in boxes.iter().skip(i) {
|
||||
pairs.push(Pair::new(b1, b2))
|
||||
}
|
||||
}
|
||||
|
||||
pairs.sort_by(|a, b| a.area.cmp(&b.area));
|
||||
|
||||
let b = pairs.iter().rev().take(1).next().unwrap();
|
||||
|
||||
println!("sol1: {} {:?} {:?}", b.area, b.b1, b.b2);
|
||||
|
||||
'b2: for b in pairs.iter().rev() {
|
||||
// This check sees if there is a point inside the target square
|
||||
// this will probably fail if you have a case like this
|
||||
// #XXXX#
|
||||
// X ## X
|
||||
// #X##X#
|
||||
// Lucky we don't tho this could be saved by detecting those and just removing them...
|
||||
let max_x = b.b1.x.max(b.b2.x);
|
||||
let min_x = b.b1.x.min(b.b2.x);
|
||||
let max_y = b.b1.y.max(b.b2.y);
|
||||
let min_y = b.b1.y.min(b.b2.y);
|
||||
|
||||
for p in boxes.iter() {
|
||||
if p.x > min_x && p.x < max_x && p.y > min_y && p.y < max_y {
|
||||
continue 'b2;
|
||||
}
|
||||
}
|
||||
// Raycasting to detect when there is no square but we go outside bounds
|
||||
// this would also fail for the above case
|
||||
//
|
||||
// 1 -> p
|
||||
// ↓
|
||||
// ↑
|
||||
// t <- 2
|
||||
//
|
||||
let p = TilePos {
|
||||
x: b.b2.x,
|
||||
y: b.b1.y,
|
||||
};
|
||||
let t = TilePos {
|
||||
x: b.b1.x,
|
||||
y: b.b2.y,
|
||||
};
|
||||
let ray1 = Pair {
|
||||
b1: b.b1,
|
||||
b2: &p,
|
||||
area: 0,
|
||||
};
|
||||
let ray2 = Pair {
|
||||
b1: b.b1,
|
||||
b2: &t,
|
||||
area: 0,
|
||||
};
|
||||
let ray3 = Pair {
|
||||
b1: b.b2,
|
||||
b2: &p,
|
||||
area: 0,
|
||||
};
|
||||
let ray4 = Pair {
|
||||
b1: b.b2,
|
||||
b2: &t,
|
||||
area: 0,
|
||||
};
|
||||
|
||||
for i in order_pair.iter() {
|
||||
if i.colide(&ray1) || i.colide(&ray2) || i.colide(&ray3) || i.colide(&ray4) {
|
||||
continue 'b2;
|
||||
}
|
||||
}
|
||||
|
||||
println!("sol2 = {} {:?}", b.area, b);
|
||||
b.as_rect();
|
||||
break;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
8
src/day9/test.txt
Normal file
8
src/day9/test.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
7,1
|
||||
11,1
|
||||
11,7
|
||||
9,7
|
||||
9,5
|
||||
2,5
|
||||
2,3
|
||||
7,3
|
||||
Reference in New Issue
Block a user