diff --git a/Cargo.toml b/Cargo.toml
index 9420c89..eb866ea 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/src/day9/act.html b/src/day9/act.html
new file mode 100644
index 0000000..171e327
--- /dev/null
+++ b/src/day9/act.html
@@ -0,0 +1,10 @@
+
+
+
diff --git a/src/day9/act.txt b/src/day9/act.txt
new file mode 100644
index 0000000..6f1e277
--- /dev/null
+++ b/src/day9/act.txt
@@ -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
diff --git a/src/day9/main.rs b/src/day9/main.rs
new file mode 100644
index 0000000..069d1d3
--- /dev/null
+++ b/src/day9/main.rs
@@ -0,0 +1,221 @@
+use anyhow::{Result, bail};
+use std::{
+ collections::{HashMap, HashSet},
+ fs,
+ ops::RangeInclusive,
+};
+
+#[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 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) -> RangeInclusive {
+ match self.b1.x.cmp(&self.b2.x) {
+ std::cmp::Ordering::Equal => self.b1.x..=self.b1.x,
+ std::cmp::Ordering::Less => self.b1.x..=self.b2.x,
+ std::cmp::Ordering::Greater => self.b2.x..=self.b2.x,
+ }
+ }
+
+ fn get_y_range(&'a self) -> RangeInclusive {
+ match self.b1.y.cmp(&self.b2.y) {
+ std::cmp::Ordering::Equal => self.b1.y..=self.b1.y,
+ std::cmp::Ordering::Less => self.b1.y..=self.b2.y,
+ std::cmp::Ordering::Greater => self.b2.y..=self.b2.y,
+ }
+ }
+
+ // This will only work if the pairs are inline
+ fn colide(&'a self, other: &'a Pair) -> Result {
+ if self.b1.x == self.b2.x {
+ if other.b1.x == other.b2.x {
+ let other_range = other.get_y_range();
+ let b1in = other_range.contains(&self.b1.y);
+ let b2in = other_range.contains(&self.b1.y);
+ // Might need to check this
+ return Ok(self.b1.x == other.b2.x && (b1in || b2in) && !(b1in && b2in));
+ } else if other.b1.y == other.b2.y {
+ return Ok(self.get_y_range().contains(&other.b1.y));
+ } else {
+ bail!("Did not follow instructions 1 {:?}", other);
+ }
+ } else if self.b1.y == self.b2.y {
+ if other.b1.y == other.b2.y {
+ let other_range = other.get_x_range();
+ let b1in = other_range.contains(&self.b1.x);
+ let b2in = other_range.contains(&self.b1.x);
+ // Might need to check this
+ return Ok(self.b1.y == other.b2.y && (b1in || b2in) && !(b1in && b2in));
+ } else if other.b1.x == other.b2.x {
+ return Ok(self.get_x_range().contains(&other.b1.y));
+ } else {
+ bail!("Did not follow instructions 2 {:?}", other);
+ }
+ } else {
+ bail!("Did not follow instructions 3 {:?}", self);
+ }
+ }
+}
+
+fn main() -> Result<()> {
+ let text = fs::read_to_string("src/day9/act.txt")?;
+
+ let boxes: Vec = 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]
+ },
+ ))
+ }
+
+ let mut pairs: Vec = 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.into_iter().rev().take(1).next().unwrap();
+
+ println!("sol1: {} {:?} {:?}", b.area, b.b1, b.b2);
+
+ let mut pairs: Vec = Vec::with_capacity(boxes.len() * boxes.len());
+
+ for (i, b1) in boxes.iter().enumerate() {
+ for b2 in boxes.iter().skip(i) {
+ if b1.y >= 50265 && b2.y >= 50265 {
+ pairs.push(Pair::new(b1, b2))
+ }
+ if b1.y <= 48488 && b2.y <= 48488 {
+ pairs.push(Pair::new(b1, b2))
+ }
+ if b1.x >= 94901 && b2.x >= 94901 {
+ pairs.push(Pair::new(b1, b2))
+ }
+ }
+ }
+
+ pairs.sort_by(|a, b| a.area.cmp(&b.area));
+
+ 'b2: for b in pairs.iter().rev() {
+ // //
+ // // 1 p
+ // //
+ // //
+ // // t 2
+ // //
+ 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 {
+ println!(
+ "",
+ b.b1.x,
+ b.b1.y,
+ b.b2.x,
+ b.b1.y,
+ b.b2.x,
+ b.b2.y,
+ b.b1.x,
+ b.b2.y,
+ b.area,
+ p.x,
+ p.y
+ );
+
+ continue 'b2;
+ }
+ }
+ println!(
+ "",
+ b.b1.x, b.b1.y, b.b2.x, b.b1.y, b.b2.x, b.b2.y, b.b1.x, b.b2.y, b.area
+ );
+ break;
+ }
+
+ // let boxes: Vec = text
+ // .split("\n")
+ // .filter(|s| s.len() > 0)
+ // .map(|s| s.into())
+ // .collect();
+
+ // let mut pairs: Vec = Vec::with_capacity(boxes.len() * boxes.len());
+
+ // for (i, b1) in boxes.iter().enumerate() {
+ // for b2 in boxes.iter().skip(i) {
+ // if b1.y >= 50265 && b2.y >= 50265 {
+ // pairs.push(Pair::new(b1, b2))
+ // }
+ // if b1.y <= 48488 && b2.y <= 48488 {
+ // pairs.push(Pair::new(b1, b2))
+ // }
+ // }
+ // }
+
+ // pairs.sort_by(|a, b| a.area.cmp(&b.area));
+
+ // let pairs = pairs.iter().rev().take(20);
+
+ // for i in pairs {
+ // // 1 p
+ // //
+ // //
+ // // t 2
+ // println!(
+ // "",
+ // i.b1.x, i.b1.y, i.b2.x, i.b1.y, i.b2.x, i.b2.y, i.b1.x, i.b2.y, i.area
+ // )
+ // }
+
+ Ok(())
+}
diff --git a/src/day9/test.txt b/src/day9/test.txt
new file mode 100644
index 0000000..c8563ea
--- /dev/null
+++ b/src/day9/test.txt
@@ -0,0 +1,8 @@
+7,1
+11,1
+11,7
+9,7
+9,5
+2,5
+2,3
+7,3