diff --git a/Cargo.lock b/Cargo.lock index ebc3f8b..8e8fc9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "console" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys", +] + [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -120,18 +133,106 @@ dependencies = [ "itertools", ] +[[package]] +name = "day-11" +version = "0.0.0" +dependencies = [ + "indicatif", + "indoc", + "pathfinding", + "rayon", +] + +[[package]] +name = "deprecate-until" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3767f826efbbe5a5ae093920b58b43b01734202be697e1354914e862e8e704" +dependencies = [ + "proc-macro2", + "quote", + "semver", + "syn", +] + [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indicatif" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "rayon", + "unicode-width", +] + [[package]] name = "indoc" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + [[package]] name = "itertools" version = "0.12.0" @@ -141,6 +242,18 @@ dependencies = [ "either", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + [[package]] name = "memchr" version = "2.6.4" @@ -248,6 +361,51 @@ dependencies = [ "autocfg", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "pathfinding" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "752866d4511516a35883728309499db42696f388263586b70659a5461e641db5" +dependencies = [ + "deprecate-until", + "fixedbitset", + "indexmap", + "integer-sqrt", + "num-traits", + "rustc-hash", + "thiserror", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + [[package]] name = "ranges" version = "0.3.3" @@ -274,8 +432,129 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "syn" +version = "2.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" diff --git a/Cargo.toml b/Cargo.toml index d0773e7..7455f1d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,8 @@ members = [ "day-07", "day-08", "day-09", - "day-10" + "day-10", + "day-11" ] [workspace.dependencies] diff --git a/day-11/Cargo.toml b/day-11/Cargo.toml new file mode 100644 index 0000000..110c155 --- /dev/null +++ b/day-11/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "day-11" +version = "0.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +indicatif = { version = "0.17.7", features = ["rayon"] } +pathfinding = "4.4.0" +rayon.workspace = true + +[dev-dependencies] +indoc.workspace = true diff --git a/day-11/src/bin/input.txt b/day-11/src/bin/input.txt new file mode 100644 index 0000000..f3e8c88 --- /dev/null +++ b/day-11/src/bin/input.txt @@ -0,0 +1,140 @@ +.....................................................................................#......#............................................... +..#.....#.................................................................#........................#........................................ +...............................#...............................................................................#.....#...................... +.................................................#.............#...............................#...................................#........ +..............#......#.................#...............#............#.............#..........................................#.............. +.........................................................................................#.................#...............................# +.#.......................................................................................................................................... +..........................#......#............................................#......#.................................#.................... +.................................................................................................#.......................................... +.........................................#..........#..........#............................................................#............... +......#.....#......#..........................#........................#.................................................................... +....................................#.........................................................................#..........................#.. +..................................................................................#......................................................... +...................................................................................................................#........................ +.................................................................#........................................#................................. +.............................#..............................#..........................#.......#............................................ +..........................................#.....#.............................#............................................................. +#..................#..................................................................................................................#..... +....................................#...................#..........................#...........................#..............#............. +........#................#...................#.............................................................................................# +...............................#....................#...........................................#........................................... +.......................................#..............................................#..................................................... +........................................................................#........#...........................#.............................. +..................................#........#...................#........................................#.........#.................#....... +#................#........................................................................................................#................. +.........#.......................................#...............................................#.............................#........#... +...............................................................................................................#............................ +.........................................................................................#.................................................. +...........................................................#..................................#..........#...........................#...... +......#.........................#..........................................................................................#................ +....................#.....................#.......#...............................#.................................#....................... +..........................#..............................................#.................................................................. +..........#..........................#.......................#...................................#..............#..............#...........# +......................................................#..................................................................................... +............................................................................................................................................ +#...............................................#................#............................#............................................. +..................#......................#............................#................................#................................#... +............................................................................................................................................ +....................................................#....................................#.............................#.................... +..............#...................#................................#..........#..............................#.............................# +............................#...............................................................................................#............... +....#.................#.....................................#..........#............................................................#....... +......................................................#..................................................................................... +...........#..............................#.................................................#..........#.................#.................. +.................................#..............#................#..........#.......#....................................................... +...................................................................................................................#..............#......... +#...........................................................................................................#............................... +........#.......#............................................................................................................#.............. +............................#.....................#..........#......................................#.....................................#. +.....................................#.................................................#........................#........................... +.........................................................................................................................#...........#...... +.......................#.............................#........................#............................................................. +..............#...............................#.................#..................#........#............................................... +...#......................................................................#.................................#..............................# +...................#..................#.............................................................................#........#.............. +............................................................................................................................................ +.........................#.........................#........................................................................................ +......#......#.............................................#.............................#............#..................................... +.................................#......................................#................................................................... +.........................................#........................#..............................#.................#..............#......... +............................................................................................................................................ +......................................................#.................................................#..............#..................#. +......................#......#...............#...................................#............................#............................. +....#...........#.................#............................................................#...............................#............ +..........................................................................#..........................#...................................... +..........................................#................................................#...............................#............#... +................................................................................................................#........................... +..........#....................................#...................................................................................#........ +................................#....................#..............................................................#....................... +......#.......................................................#...............................#............................................. +#.......................#.....................................................................................................#............. +.................#...................#...........................................#..........................#............................... +.....................................................................#....................#................................................. +..............................#.................#.......#.........................................#......................................... +..#........................................................................#....................................#.........#................. +...........#............................#..........................................#.............................................#.......... +......#.............................................................................................................#.....................#. +........................................................................................................#................................... +..............#...................#.........#............................................................................................... +........................................................#.............#..........#.....#..........#............................#............ +.........#......................................................#...........................#............................................... +.........................................#...................................#.................................#............................ +............................................................................................................................................ +................#...................................................................#.................#..................#.................. +.................................#..........................#.............#....................#................................#..........# +...#........................#.........................................................................................................#..... +.................................................#......................................#.....................#......#...................... +...........................................#.........................#........#............................................................. +........#......#...................................................................................................................#.....#.. +.#..................#..................................#.........#.......................................................................... +..................................#.....#.................................#................................................................. +...................................................#.................................#...................................................... +............................................................#............................................................................... +.............................................#......................#..........#............#.........................#......#.............. +................................#...................................................................#....................................... +.....................................................#..................#......................................#............................ +...#......................#.....................................................................................................#........... +...........#...........................................................................#..............................................#..... +................#..................................................#..............................................#......................... +.......................#......................................................................#............................................. +................................#........#.........#.....................#.....#......................#..................................... +.#.......................................................................................................................................... +........................................................#................................#...................#..................#........... +.....................................#........#.................................................#.......................................#... +.........#...........#...................................................................................................................... +....................................................#.............................................................#.................#....... +.............#............#........................................#.............#.....................#...................#...............# +..................#....................#.................................#.............#.................................................... +................................................#........................................................................................... +.......................#...............................................................................................#.................... +....#..........................................................#.....#..............#...........................................#........... +...............................................................................................#..................#.......................#. +.........#...................#............................................#................................................................. +.............................................................................................................#..............#......#........ +...........................................................................................#................................................ +.#...........................................................#.............................................................................. +..............#..............................#........................................#.............#....................................... +....................................#..............#..............#.........#.............................#.............#.............#..... +....................#............................................................................................#.......................... +.........................................................................................#.................................................. +...........#............................#................#....................................................................#............. +.....#......................................................................................................#............................... +..................................#................................................#........#.............................................#. +.#................#......#...........................................................................#...................................... +..............................................#.......................#................#............................................#....... +.........#............................#........................#..........................................#.....#......#.................... +..............................................................................................#............................................. +........................................................................................................................................#... +..........................#........................#...............#................................#............................#.......... +..#........................................#............#............................................................#...................... +...............................#.....#........................................#.......#......................................#.............. +.......................................................................................................#.................................... +.....................................................#..............................................................................#....... +........#......................................#...........................#.............................................#.................# +...................#.....#......................................#.............................#............................................. +............#.........................#......................................................................#.......#.................#.... +..............................#...................................................#......................................................... +............................................#.........................................................#..................................... +.......#..........................#................#.....#.............#.................................................................... +..................#.........................................................#.............#.......................................#......... \ No newline at end of file diff --git a/day-11/src/bin/part1.rs b/day-11/src/bin/part1.rs new file mode 100644 index 0000000..e50a675 --- /dev/null +++ b/day-11/src/bin/part1.rs @@ -0,0 +1,146 @@ +use indicatif::ParallelProgressIterator; +use pathfinding::prelude::bfs; +use rayon::prelude::*; + +fn main() { + println!("{}", part1(include_str!("./input.txt"))); +} + +fn part1(input: &str) -> usize { + let mut lines = input + .lines() + .flat_map(|l| { + let row = l + .chars() + .map(|c| Space::try_from(c).expect("invalid char")) + .collect::>(); + if row.iter().all(|s| *s == Space::Empty) { + vec![row.clone(), row] + } else { + vec![row] + } + }) + .collect::>(); + + let height = lines.len(); + let width = lines[0].len(); + + for i in (0..width).rev() { + if (0..height).all(|j| lines.get(j).unwrap().get(i).unwrap() == &Space::Empty) { + (0..height).for_each(|j| { + lines[j].insert(i, Space::Empty); + }); + } + } + + let height = lines.len(); + let width = lines[0].len(); + + let galaxies = lines + .par_iter() + .enumerate() + .flat_map(|(y, l)| { + l.par_iter() + .enumerate() + .filter_map(move |(x, s)| (s == &Space::Galaxy).then_some((x, y))) + }) + .collect::>(); + + let pairs = galaxies + .par_iter() + .enumerate() + .flat_map(|(i, (x1, y1))| { + galaxies + .par_iter() + .enumerate() + .filter_map(move |(j, (x2, y2))| { + if j > i { + Some(((*x1, *y1), (*x2, *y2))) + } else { + None + } + }) + }) + .collect::>(); + + let distances = pairs + .into_par_iter() + .progress() + .filter_map(|(start, target)| { + bfs( + &start, + |coords| successors(coords, &target, width, height), + |cur| *cur == target, + ) + .map(|path| path.len() - 1) + }) + .collect::>(); + + distances.iter().sum() +} + +fn successors( + (x, y): &(usize, usize), + (tx, ty): &(usize, usize), + width: usize, + height: usize, +) -> Vec<(usize, usize)> { + let mut neighbors = vec![]; + if tx < x && *x > 0 { + neighbors.push((*x - 1, *y)); + } + if tx > x && *x < width - 1 { + neighbors.push((*x + 1, *y)); + } + if ty < y && *y > 0 { + neighbors.push((*x, *y - 1)); + } + if ty > y && *y < height - 1 { + neighbors.push((*x, *y + 1)); + } + neighbors +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Space { + Empty, + Galaxy, +} +impl TryFrom for Space { + type Error = (); + + fn try_from(value: char) -> Result { + match value { + '.' => Ok(Self::Empty), + '#' => Ok(Self::Galaxy), + _ => Err(()), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_part1() { + assert_eq!( + part1(indoc!( + " + ...#...... + .......#.. + #......... + .......... + ......#... + .#........ + .........# + .......... + .......#.. + #...#..... + " + )), + 374 + ); + } +} diff --git a/day-11/src/bin/part2.rs b/day-11/src/bin/part2.rs new file mode 100644 index 0000000..042d4d2 --- /dev/null +++ b/day-11/src/bin/part2.rs @@ -0,0 +1,164 @@ +use indicatif::ParallelProgressIterator; +use pathfinding::prelude::bfs; +use rayon::prelude::*; + +fn main() { + println!("{}", part2(include_str!("./input.txt"), 1_000_000)); +} + +fn part2(input: &str, factor: usize) -> usize { + let mut lines = input + .lines() + .map(|l| { + let row = l + .chars() + .map(|c| Space::try_from(c).expect("invalid char")) + .collect::>(); + if row.iter().all(|s| *s == Space::Empty) { + row.into_par_iter() + .map(|_| Space::ExpandedEmpty) + .collect::>() + } else { + row + } + }) + .collect::>(); + + let height = lines.len(); + let width = lines[0].len(); + + for i in (0..width).rev() { + if (0..height).all(|j| { + matches!( + lines.get(j).unwrap().get(i).unwrap(), + Space::Empty | Space::ExpandedEmpty + ) + }) { + (0..height).for_each(|j| { + if let Some(s) = lines[j].get_mut(i) { + *s = Space::ExpandedEmpty; + } + }); + } + } + + let galaxies = lines + .par_iter() + .enumerate() + .flat_map(|(y, l)| { + l.par_iter() + .enumerate() + .filter_map(move |(x, s)| (s == &Space::Galaxy).then_some((x, y))) + }) + .collect::>(); + + let pairs = galaxies + .par_iter() + .enumerate() + .flat_map(|(i, (x1, y1))| { + galaxies + .par_iter() + .enumerate() + .filter_map(move |(j, (x2, y2))| { + if j > i { + Some(((*x1, *y1), (*x2, *y2))) + } else { + None + } + }) + }) + .collect::>(); + + let distances = pairs + .into_par_iter() + .progress() + .filter_map(|(start, target)| { + bfs( + &start, + |coords| successors(coords, &target, width, height), + |cur| *cur == target, + ) + .map(|path| { + path.iter() + .map(|(x, y)| { + let space = lines.get(*y).unwrap().get(*x).unwrap(); + if matches!(space, Space::ExpandedEmpty) { + factor + } else { + 1 + } + }) + .sum::() + - 1 + }) + }) + .collect::>(); + + distances.iter().sum() +} + +fn successors( + (x, y): &(usize, usize), + (tx, ty): &(usize, usize), + width: usize, + height: usize, +) -> Vec<(usize, usize)> { + let mut neighbors = vec![]; + if tx < x && *x > 0 { + neighbors.push((*x - 1, *y)); + } + if tx > x && *x < width - 1 { + neighbors.push((*x + 1, *y)); + } + if ty < y && *y > 0 { + neighbors.push((*x, *y - 1)); + } + if ty > y && *y < height - 1 { + neighbors.push((*x, *y + 1)); + } + neighbors +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Space { + Empty, + ExpandedEmpty, + Galaxy, +} +impl TryFrom for Space { + type Error = (); + + fn try_from(value: char) -> Result { + match value { + '.' => Ok(Self::Empty), + '#' => Ok(Self::Galaxy), + _ => Err(()), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_part2() { + const INPUT: &str = indoc!( + " + ...#...... + .......#.. + #......... + .......... + ......#... + .#........ + .........# + .......... + .......#.. + #...#..... + " + ); + assert_eq!(part2(INPUT, 10), 1030); + assert_eq!(part2(INPUT, 100), 8410); + } +}