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