diff options
-rw-r--r-- | 2024_rust/inputs/14 | 500 | ||||
-rw-r--r-- | 2024_rust/src/bin/day12.rs | 49 | ||||
-rw-r--r-- | 2024_rust/src/bin/day14.rs | 131 |
3 files changed, 657 insertions, 23 deletions
diff --git a/2024_rust/inputs/14 b/2024_rust/inputs/14 new file mode 100644 index 0000000..9c0ea8a --- /dev/null +++ b/2024_rust/inputs/14 @@ -0,0 +1,500 @@ +p=30,37 v=-50,-64 +p=24,42 v=55,12 +p=10,56 v=-49,82 +p=67,69 v=-58,60 +p=82,98 v=-57,61 +p=29,1 v=20,-40 +p=41,61 v=-95,92 +p=92,68 v=38,80 +p=26,82 v=58,79 +p=84,42 v=11,-45 +p=71,10 v=-76,21 +p=42,3 v=-93,-25 +p=53,102 v=93,-63 +p=33,4 v=-13,-94 +p=20,100 v=57,-32 +p=17,50 v=51,39 +p=75,41 v=-84,39 +p=83,53 v=-64,-96 +p=15,38 v=28,-72 +p=35,23 v=-9,-69 +p=26,92 v=10,56 +p=19,54 v=-42,4 +p=50,6 v=-72,28 +p=88,19 v=-90,-29 +p=11,85 v=-5,87 +p=22,22 v=-49,60 +p=70,81 v=-33,37 +p=43,47 v=-93,35 +p=5,32 v=-1,39 +p=91,70 v=96,-44 +p=10,87 v=-38,94 +p=67,6 v=32,-99 +p=54,41 v=-47,68 +p=2,59 v=-75,-53 +p=27,20 v=-46,5 +p=22,28 v=-13,-75 +p=51,29 v=99,66 +p=98,28 v=-38,-30 +p=26,53 v=-49,48 +p=39,83 v=-67,3 +p=34,59 v=-46,-57 +p=96,92 v=83,26 +p=18,70 v=59,23 +p=41,84 v=-27,-1 +p=5,40 v=-30,20 +p=86,83 v=-59,87 +p=3,76 v=12,-76 +p=49,88 v=6,83 +p=37,79 v=90,-5 +p=78,42 v=21,50 +p=78,55 v=-12,-95 +p=66,14 v=31,1 +p=53,47 v=-64,62 +p=67,18 v=-89,58 +p=87,10 v=-78,-29 +p=62,86 v=-14,91 +p=78,74 v=17,-81 +p=12,62 v=-40,45 +p=45,102 v=-91,-32 +p=38,1 v=-99,97 +p=39,81 v=55,-84 +p=43,22 v=-85,65 +p=44,30 v=43,35 +p=58,22 v=-41,-48 +p=59,35 v=-35,-45 +p=93,23 v=-24,13 +p=28,98 v=-39,96 +p=95,34 v=-27,55 +p=18,70 v=92,-27 +p=7,76 v=-11,75 +p=1,23 v=-98,-37 +p=8,87 v=-3,-70 +p=59,22 v=97,-71 +p=69,79 v=-36,-23 +p=34,82 v=-15,-35 +p=5,7 v=-36,44 +p=76,70 v=-79,-6 +p=77,36 v=13,85 +p=68,60 v=80,14 +p=13,96 v=92,94 +p=37,37 v=-93,-38 +p=1,66 v=1,11 +p=10,10 v=94,-37 +p=97,86 v=-30,-5 +p=69,11 v=-76,21 +p=30,90 v=22,-96 +p=33,26 v=-31,97 +p=48,81 v=37,-54 +p=19,37 v=72,33 +p=49,88 v=36,-69 +p=1,61 v=12,44 +p=48,83 v=-72,91 +p=39,6 v=-56,-55 +p=94,98 v=44,-70 +p=68,60 v=95,-99 +p=44,52 v=-83,-61 +p=44,81 v=89,51 +p=4,44 v=36,-7 +p=17,9 v=-77,-93 +p=35,77 v=53,38 +p=60,79 v=86,-81 +p=16,81 v=85,69 +p=54,10 v=-2,36 +p=55,73 v=-43,-42 +p=20,86 v=-11,-47 +p=57,32 v=3,88 +p=82,66 v=89,-42 +p=90,4 v=-59,-55 +p=8,20 v=-76,69 +p=18,77 v=-79,-65 +p=100,29 v=-24,66 +p=22,3 v=-44,-47 +p=52,49 v=-90,68 +p=16,72 v=45,31 +p=57,99 v=33,-82 +p=51,56 v=16,9 +p=28,90 v=88,-74 +p=76,24 v=-43,-10 +p=21,31 v=-36,-90 +p=68,99 v=27,-40 +p=0,84 v=69,83 +p=100,88 v=-97,32 +p=65,52 v=85,-4 +p=31,61 v=-76,71 +p=75,101 v=-70,55 +p=43,17 v=74,-33 +p=56,89 v=62,-54 +p=3,50 v=-96,69 +p=77,70 v=-49,53 +p=69,69 v=-78,72 +p=76,78 v=54,-8 +p=32,75 v=-34,-11 +p=42,100 v=47,75 +p=70,28 v=97,4 +p=88,42 v=75,39 +p=64,20 v=-74,89 +p=78,17 v=-72,-98 +p=14,79 v=30,26 +p=47,50 v=16,38 +p=21,75 v=59,-73 +p=82,74 v=81,30 +p=25,62 v=11,-1 +p=94,83 v=67,40 +p=82,62 v=16,-5 +p=26,97 v=67,50 +p=6,77 v=-44,72 +p=76,94 v=-17,77 +p=55,27 v=-62,-75 +p=86,14 v=-90,-97 +p=51,66 v=78,-20 +p=21,68 v=22,87 +p=50,83 v=-68,-8 +p=52,81 v=3,-8 +p=10,82 v=36,-35 +p=99,10 v=38,-65 +p=56,61 v=-67,-55 +p=46,39 v=-60,73 +p=65,64 v=29,-65 +p=11,5 v=91,-12 +p=93,69 v=38,57 +p=62,56 v=-68,61 +p=31,86 v=-48,79 +p=94,17 v=-90,86 +p=71,37 v=-91,35 +p=97,48 v=58,-69 +p=95,11 v=75,-52 +p=37,62 v=-87,38 +p=63,76 v=97,41 +p=9,74 v=78,-52 +p=13,87 v=96,83 +p=26,50 v=-46,-69 +p=8,68 v=-43,-62 +p=45,9 v=39,-2 +p=29,79 v=-19,87 +p=56,5 v=11,-16 +p=92,68 v=25,99 +p=98,2 v=-63,-13 +p=29,102 v=-93,-36 +p=73,9 v=56,-28 +p=36,66 v=-83,-46 +p=94,80 v=-43,-38 +p=53,79 v=23,97 +p=50,10 v=-91,-37 +p=14,43 v=98,-49 +p=3,78 v=78,-1 +p=46,46 v=-31,-31 +p=94,101 v=38,-70 +p=56,23 v=-37,9 +p=50,66 v=38,91 +p=70,26 v=17,-34 +p=7,92 v=7,-76 +p=75,36 v=-45,-30 +p=71,0 v=62,-51 +p=72,92 v=12,9 +p=34,39 v=84,84 +p=73,88 v=-39,-26 +p=51,81 v=-68,64 +p=24,82 v=61,4 +p=32,2 v=86,86 +p=50,102 v=-30,-12 +p=98,26 v=-67,14 +p=96,88 v=35,-83 +p=43,53 v=12,-99 +p=77,50 v=56,-72 +p=7,50 v=66,92 +p=70,66 v=-6,38 +p=60,29 v=-70,-33 +p=70,11 v=89,24 +p=93,58 v=-19,-74 +p=96,68 v=98,30 +p=70,68 v=-43,38 +p=24,99 v=53,-28 +p=98,38 v=-74,-9 +p=69,49 v=-76,-23 +p=9,75 v=-69,64 +p=41,19 v=14,-71 +p=0,23 v=38,-71 +p=1,56 v=36,-23 +p=55,52 v=-99,31 +p=85,85 v=-22,75 +p=18,78 v=69,-27 +p=7,96 v=90,-89 +p=96,85 v=40,-70 +p=7,80 v=-92,87 +p=81,6 v=46,-17 +p=44,71 v=10,-19 +p=12,72 v=73,-4 +p=33,86 v=14,67 +p=84,94 v=52,-24 +p=34,66 v=-56,-65 +p=31,60 v=-85,88 +p=65,0 v=-35,-97 +p=76,83 v=-12,60 +p=15,29 v=64,-59 +p=71,45 v=-68,43 +p=19,77 v=92,95 +p=6,85 v=-38,79 +p=1,27 v=-59,33 +p=38,12 v=-89,-10 +p=45,27 v=51,66 +p=23,100 v=-13,-70 +p=18,43 v=-35,-59 +p=63,28 v=72,-72 +p=42,7 v=83,-5 +p=28,99 v=29,-43 +p=96,38 v=11,39 +p=47,97 v=74,56 +p=81,27 v=87,-64 +p=63,6 v=39,93 +p=15,43 v=-48,19 +p=6,21 v=12,-65 +p=52,70 v=-85,-14 +p=96,53 v=-55,8 +p=3,77 v=-98,-20 +p=76,54 v=-86,-95 +p=85,77 v=-49,-72 +p=96,46 v=-84,39 +p=42,79 v=-93,68 +p=46,59 v=-17,7 +p=52,16 v=-66,32 +p=12,70 v=67,23 +p=52,7 v=-21,67 +p=13,62 v=-5,95 +p=25,63 v=-83,19 +p=91,25 v=54,24 +p=28,9 v=-5,71 +p=73,1 v=89,82 +p=71,22 v=83,82 +p=37,40 v=90,66 +p=8,91 v=-3,-85 +p=53,66 v=6,38 +p=14,94 v=59,10 +p=81,17 v=-12,-22 +p=82,72 v=-20,-88 +p=36,90 v=-47,-80 +p=26,91 v=-77,-70 +p=73,91 v=23,-40 +p=76,68 v=21,53 +p=64,30 v=-82,55 +p=7,97 v=1,-13 +p=69,87 v=57,-28 +p=19,65 v=92,31 +p=66,50 v=97,-53 +p=86,54 v=13,84 +p=23,51 v=-48,46 +p=97,39 v=-61,-7 +p=6,2 v=57,-42 +p=51,71 v=-20,40 +p=65,17 v=-76,-25 +p=62,12 v=-14,-59 +p=16,31 v=30,85 +p=55,12 v=16,-23 +p=22,45 v=96,-87 +p=8,97 v=95,14 +p=73,91 v=-96,-89 +p=35,32 v=-50,-34 +p=19,78 v=68,-89 +p=88,23 v=-56,-58 +p=63,20 v=74,29 +p=81,79 v=-10,57 +p=11,57 v=-40,-42 +p=24,69 v=-83,-12 +p=41,7 v=19,69 +p=3,101 v=25,69 +p=5,67 v=38,-88 +p=66,50 v=-47,39 +p=59,32 v=-93,16 +p=71,48 v=45,-82 +p=23,76 v=-46,83 +p=27,9 v=-15,-78 +p=39,57 v=99,-63 +p=64,48 v=-39,-88 +p=100,24 v=-78,-61 +p=83,8 v=-88,-89 +p=74,2 v=64,-65 +p=58,54 v=-2,57 +p=69,98 v=-66,-97 +p=12,49 v=-69,27 +p=66,9 v=60,-97 +p=34,47 v=72,-26 +p=48,4 v=66,62 +p=64,22 v=-10,13 +p=87,42 v=23,-87 +p=32,67 v=6,-73 +p=44,77 v=-1,-5 +p=19,44 v=86,80 +p=77,82 v=-86,3 +p=90,99 v=43,-43 +p=77,32 v=-28,-26 +p=78,7 v=-14,2 +p=15,69 v=-44,-69 +p=80,23 v=-39,-74 +p=93,39 v=-56,78 +p=75,51 v=-47,-3 +p=47,20 v=74,1 +p=33,85 v=39,-47 +p=33,2 v=36,50 +p=46,43 v=81,-11 +p=47,100 v=-62,-74 +p=14,31 v=87,-78 +p=63,56 v=41,43 +p=80,57 v=41,47 +p=57,26 v=2,12 +p=56,25 v=5,-95 +p=50,40 v=-66,35 +p=67,30 v=27,-35 +p=38,33 v=42,-10 +p=12,4 v=28,59 +p=2,48 v=54,30 +p=10,8 v=88,-33 +p=34,79 v=14,-35 +p=52,99 v=60,14 +p=25,66 v=-13,-50 +p=94,44 v=7,-30 +p=45,50 v=35,-30 +p=72,96 v=-88,52 +p=91,56 v=-24,19 +p=83,92 v=17,-28 +p=64,28 v=95,31 +p=34,44 v=49,4 +p=32,55 v=-52,-80 +p=11,25 v=40,35 +p=80,2 v=-6,-74 +p=83,27 v=-48,61 +p=23,53 v=-3,-92 +p=60,44 v=-65,-48 +p=46,102 v=-25,-97 +p=8,6 v=-36,-2 +p=87,88 v=13,18 +p=40,84 v=-33,53 +p=13,7 v=28,-78 +p=60,10 v=27,21 +p=92,50 v=44,4 +p=81,55 v=-51,-76 +p=9,102 v=32,-2 +p=65,42 v=-6,54 +p=9,96 v=-34,71 +p=34,94 v=-87,94 +p=74,62 v=90,-52 +p=51,8 v=61,48 +p=45,27 v=70,5 +p=15,74 v=51,-62 +p=92,49 v=83,-22 +p=4,23 v=-28,32 +p=30,54 v=41,-57 +p=70,65 v=27,-4 +p=39,43 v=-56,-38 +p=68,75 v=-78,3 +p=71,58 v=60,-65 +p=7,73 v=98,49 +p=7,54 v=-89,96 +p=77,45 v=81,43 +p=88,76 v=-37,13 +p=62,41 v=99,39 +p=65,76 v=77,52 +p=72,97 v=-43,25 +p=60,30 v=99,5 +p=25,35 v=-23,-53 +p=84,24 v=-88,-60 +p=41,0 v=20,6 +p=78,52 v=-18,-72 +p=68,65 v=95,19 +p=11,40 v=90,-56 +p=69,40 v=35,58 +p=82,44 v=13,-7 +p=32,23 v=-21,32 +p=61,8 v=68,-63 +p=81,5 v=85,-74 +p=55,67 v=66,57 +p=15,6 v=71,-63 +p=29,93 v=-32,72 +p=51,31 v=-20,45 +p=45,63 v=37,19 +p=56,92 v=-37,-43 +p=57,44 v=4,16 +p=29,11 v=-50,93 +p=8,1 v=42,-17 +p=77,71 v=97,76 +p=98,97 v=43,-84 +p=71,51 v=-42,72 +p=4,24 v=92,-10 +p=37,71 v=14,-88 +p=2,0 v=71,86 +p=94,71 v=7,30 +p=95,22 v=-44,-56 +p=13,58 v=96,-4 +p=10,75 v=-47,74 +p=91,27 v=32,-68 +p=94,31 v=48,-56 +p=21,48 v=47,23 +p=98,78 v=-73,79 +p=69,66 v=-76,49 +p=87,67 v=78,60 +p=56,32 v=37,-29 +p=75,1 v=-72,88 +p=90,71 v=-64,-50 +p=63,58 v=27,-40 +p=0,27 v=-20,-25 +p=32,4 v=-87,36 +p=68,51 v=-78,-76 +p=80,78 v=-82,-77 +p=33,7 v=47,-44 +p=42,98 v=80,75 +p=44,97 v=-19,17 +p=91,63 v=-33,98 +p=60,48 v=75,92 +p=41,32 v=-14,-84 +p=7,29 v=-42,-11 +p=2,70 v=-63,87 +p=85,48 v=-16,-34 +p=5,54 v=-82,51 +p=56,95 v=-61,-62 +p=5,57 v=-57,69 +p=80,14 v=-82,-71 +p=30,72 v=-52,-92 +p=70,49 v=-41,27 +p=71,82 v=60,-1 +p=71,9 v=25,97 +p=100,101 v=91,-57 +p=5,48 v=44,38 +p=95,75 v=65,83 +p=34,47 v=-29,27 +p=89,82 v=19,34 +p=76,92 v=-29,-2 +p=71,92 v=81,-70 +p=17,68 v=90,-8 +p=71,44 v=96,32 +p=57,25 v=-10,54 +p=75,67 v=-16,-62 +p=46,87 v=-37,41 +p=74,98 v=97,78 +p=30,22 v=72,-38 +p=41,17 v=-23,-21 +p=67,34 v=85,61 +p=63,58 v=31,42 +p=96,5 v=-94,-17 +p=64,102 v=99,29 +p=99,39 v=-63,27 +p=16,84 v=-40,-24 +p=22,19 v=55,2 +p=70,76 v=-98,-46 +p=16,46 v=-40,16 +p=37,10 v=7,-28 +p=59,49 v=3,-90 +p=38,38 v=-79,8 +p=43,85 v=45,-58 +p=99,23 v=-26,24 +p=45,69 v=-70,-62 +p=44,22 v=-73,21 +p=24,17 v=-10,43 +p=61,90 v=-70,98 +p=69,65 v=-14,-81 +p=23,93 v=-6,-99 +p=80,30 v=-25,-25 +p=31,53 v=-91,-92 +p=45,2 v=78,21 +p=50,47 v=-87,-45 +p=32,86 v=84,-62 +p=47,81 v=97,-92 +p=99,95 v=78,-66 diff --git a/2024_rust/src/bin/day12.rs b/2024_rust/src/bin/day12.rs index 21868aa..4408980 100644 --- a/2024_rust/src/bin/day12.rs +++ b/2024_rust/src/bin/day12.rs @@ -1,9 +1,7 @@ use aoc2024::matrix; use std::collections::HashSet; -static PLUS_DELTAS: [(isize, isize); 4] = [ - (-1, 0), (0, -1), (0, 1), (1, 0) -]; +static PLUS_DELTAS: [(isize, isize); 4] = [(-1, 0), (0, -1), (0, 1), (1, 0)]; type Price = u32; type Matrix = matrix::Matrix<char>; @@ -23,7 +21,7 @@ fn regions_price(m: &Matrix, version: u8) -> Price { for i in 0..m.limit.0 { for j in 0..m.limit.1 { let pos = (i, j); - if ! visited.contains(&pos) { + if !visited.contains(&pos) { let (price, pss) = region(m, pos, version); result += price; for p in pss { @@ -78,7 +76,10 @@ struct Lines { impl Lines { fn new() -> Self { - Lines { hs: vec![], vs: vec![] } + Lines { + hs: vec![], + vs: vec![], + } } fn from_pos(pos: matrix::Pos, in_region: &HashSet<matrix::Pos>) -> Self { @@ -89,25 +90,21 @@ impl Lines { // println!(" Checking p {p:?}"); let p_u = (p.0 as usize, p.1 as usize); // println!(" Checking p_u {p_u:?}"); - if ! in_region.contains(&p_u) { + if !in_region.contains(&p_u) { if p.0 == pos.0 as isize { // println!(" PUSHING V ({} vs {}!", p.1, pos.1); - vs.push( - if p.1 < pos.1 as isize { - (true, pos) - } else { - (false, (pos.0, pos.1+1)) - } - ) + vs.push(if p.1 < pos.1 as isize { + (true, pos) + } else { + (false, (pos.0, pos.1 + 1)) + }) } else { // println!(" PUSHING H ({} vs {}!", p.0, pos.0); - hs.push( - if p.0 < pos.0 as isize { - (true, pos) - } else { - (false, (pos.0+1, pos.1)) - } - ) + hs.push(if p.0 < pos.0 as isize { + (true, pos) + } else { + (false, (pos.0 + 1, pos.1)) + }) } } } @@ -125,8 +122,15 @@ impl Lines { self.hs[..].sort(); self.vs[..].sort_by(|(d1, (x1, y1)), (d2, (x2, y2))| (d1, y1, x1).cmp(&(d2, y2, x2))); // println!("Sorted self: {self:?}"); - self.hs.chunk_by(|(d1, (x1, y1)), (d2, (x2, y2))| d1 == d2 && x1 == x2 && *y1 == y2-1).collect::<Vec<_>>().len() as u32 + - self.vs.chunk_by(|(d1, (x1, y1)), (d2, (x2, y2))| d1 == d2 && y1 == y2 && *x1 == x2-1).collect::<Vec<_>>().len() as u32 + self.hs + .chunk_by(|(d1, (x1, y1)), (d2, (x2, y2))| d1 == d2 && x1 == x2 && *y1 == y2 - 1) + .collect::<Vec<_>>() + .len() as u32 + + self + .vs + .chunk_by(|(d1, (x1, y1)), (d2, (x2, y2))| d1 == d2 && y1 == y2 && *x1 == x2 - 1) + .collect::<Vec<_>>() + .len() as u32 } } @@ -134,7 +138,6 @@ impl Lines { // xs.chunk_by(|().len() // } - fn region(m: &Matrix, pos: matrix::Pos, version: u8) -> (Price, HashSet<matrix::Pos>) { match version { 1 => region_v1(m, pos), diff --git a/2024_rust/src/bin/day14.rs b/2024_rust/src/bin/day14.rs new file mode 100644 index 0000000..55f986b --- /dev/null +++ b/2024_rust/src/bin/day14.rs @@ -0,0 +1,131 @@ +use regex::Regex; +use std::collections::HashSet; + +fn cycle_add(u: u32, i: i32, limit: u32) -> u32 { + let sum: i32 = u as i32 + i; + let mut sum_u: u32 = if sum < 0 { sum + limit as i32 } else { sum } as u32; + while sum_u >= limit { + sum_u -= limit; + } + sum_u +} + +#[derive(Debug)] +struct Robot { + p: (u32, u32), + v: (i32, i32), +} + +impl Robot { + fn parse(input: &str) -> Vec<Self> { + let mut result: Vec<_> = vec![]; + let re = Regex::new(r"p=([0-9]+),([0-9]+) v=([0-9-]+),([0-9-]+)").unwrap(); + for (_, [px, py, vx, vy]) in re.captures_iter(input).map(|c| c.extract()) { + result.push(Robot { + p: (px.parse().unwrap(), py.parse().unwrap()), + v: (vx.parse().unwrap(), vy.parse().unwrap()), + }); + } + // println!("Result: {result:?}"); + result + } + + fn step(&mut self, (lx, ly): (u32, u32)) { + let p: &mut (u32, u32) = &mut self.p; + let v = self.v; + p.0 = cycle_add(p.0, v.0, lx); + p.1 = cycle_add(p.1, v.1, ly); + } +} + +struct Bathroom { + robots: Vec<Robot>, + limit: (u32, u32), +} + +impl Bathroom { + fn step(&mut self) { + for r in self.robots.iter_mut() { + r.step(self.limit); + } + } + + fn stepn(&mut self, seconds: u32) { + for _i in 0..seconds { + self.step(); + } + } + + fn quadrant(&self, Robot { p: (px, py), .. }: &Robot) -> Option<usize> { + let (lx, ly) = self.limit; + let (hx, hy) = (lx / 2, ly / 2); + if *px == hx || *py == hy { + None + } else { + Some(if *px < hx { 0 } else { 1 } + if *py < hy { 0 } else { 2 }) + } + } + + fn safety(&self) -> u32 { + let mut scores = [0; 4]; + for r in self.robots.iter() { + if let Some(q) = self.quadrant(r) { + scores[q] += 1; + } + } + scores.iter().product() + } + + fn show(&self) { + let positions: HashSet<(u32, u32)> = self.robots.iter().map(|r| r.p).collect(); + for i in 0..self.limit.1 { + for j in 0..self.limit.0 { + print!( + "{}", + if positions.contains(&(i, j)) { + "X" + } else { + "." + } + ); + } + println!(""); + } + } +} + +fn p1(input: &str) -> String { + let robots: Vec<Robot> = Robot::parse(input); + let mut bathroom: Bathroom = Bathroom { + robots, + limit: (101, 103), + }; + bathroom.stepn(100); + dbg!(&bathroom.robots); + + let result = bathroom.safety(); + result.to_string() +} + +// use std::thread::sleep; +// use std::time::Duration; + +fn p2(input: &str) -> String { + let robots: Vec<Robot> = Robot::parse(input); + let mut bathroom: Bathroom = Bathroom { + robots, + limit: (101, 103), + }; + bathroom.show(); + for i in 1.. { + println!("\n\nAfter {} seconds:", i); + bathroom.step(); + bathroom.show(); + // sleep(Duration::from_millis(200)); + } + unreachable!(); +} + +fn main() { + aoc2024::run_day("14", p1, p2); +} |