From 3714865a72967f6b40cf9bfcd91c3474aa8c884a Mon Sep 17 00:00:00 2001 From: Patrick Stevens Date: Sat, 25 Dec 2021 08:44:38 +0000 Subject: [PATCH] Day 25 (#23) --- Cargo.toml | 1 + day_25/Cargo.toml | 17 +++++ day_25/benches/bench.rs | 14 ++++ day_25/input.txt | 137 ++++++++++++++++++++++++++++++++++++ day_25/src/lib.rs | 150 ++++++++++++++++++++++++++++++++++++++++ day_25/src/main.rs | 6 ++ 6 files changed, 325 insertions(+) create mode 100644 day_25/Cargo.toml create mode 100644 day_25/benches/bench.rs create mode 100644 day_25/input.txt create mode 100644 day_25/src/lib.rs create mode 100644 day_25/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 9cd18df..5fa35b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,5 @@ members = [ "day_18", "day_20", "day_21", + "day_25", ] diff --git a/day_25/Cargo.toml b/day_25/Cargo.toml new file mode 100644 index 0000000..8254541 --- /dev/null +++ b/day_25/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "day_25" +version = "0.1.0" +authors = ["Smaug123 "] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +array = { path = "../array" } + +[dev-dependencies] +criterion = "0.3" + +[[bench]] +name = "bench" +harness = false diff --git a/day_25/benches/bench.rs b/day_25/benches/bench.rs new file mode 100644 index 0000000..0bff8b0 --- /dev/null +++ b/day_25/benches/bench.rs @@ -0,0 +1,14 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use day_25::day_25::{input, part_1, part_2}; + +fn criterion_benchmark(c: &mut Criterion) { + let input = input(); + c.bench_function("day 25 part 1", |b| { + b.iter(|| { + black_box(part_1(&input)); + }) + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_25/input.txt b/day_25/input.txt new file mode 100644 index 0000000..b898f46 --- /dev/null +++ b/day_25/input.txt @@ -0,0 +1,137 @@ +.vvvv>.vv...v.>...>.vv..>..>.....>.v>>v>>.>.>v.vv...v...vv>v.vv....>.v>.v>.>.>v....>v...v>.>vvv..vv>v>......v....v>.vv.>.vv>..vv.....>..... +v.vvv>..v.>.vv..v.v......vv...>....>.v>>v...v..>.v......v...v>.>vv.v.vvvv>...v..>>.vv.....>>..>.vv...v...>v>.>v>.v>.>.v>>>v.>....v.vv..>... +>.>.>vv>v.vv....v.....vvv...v..v>>v.>v.vv>.>>v.>>.vv..vvv>>>..v.>.v>...vvv.v.v.....vvv>..>.v>>.>>>.>>vv>>>.>v....v>vv.>v>v>>v.v>v..>.vvvv>. +vv>....>vv>>.v...v>..>..>..vv>..>.>vv...>...v.>.v>>.>......vv>v>..v..v>>v...>.>..>...>>v>>v.>>>v>vv...>...>..>...v.v...>.vvv....>.>.>.>>.v. +v....>>vvv.v..>v....v.>>v.v.>v>vvv..>>v>v.>.>>..>.v..v>.v>>v>v...vv...v..>.v>.>v...vv.v>.vv..>>...v.v>>vv.vv.v>>>..v>....v...>>>.......>>v> +..vv.....>....>>v>....>.vv....vv.>>.>v.....v>vv..v.>v.>.v..v>>>vv.>..v.vv.>>>...vv.v..>.vv..vv...>.>..v.v.v>v>>v.vvv>......v.>>>.>>...>.>v. +v..>.v.v.>v>.v.>..v>v....vv...v....>v.>.vv..>v.>.>v.>.>>.>v.>..v>..>.v.v.v..vv>v>.v>v>.....vv..>.>....>....v..vv.v.>......v..v.>.v>>.v.>vv. +.v.v..>vvv.v..v>..>.v.v.vv>.>....v>>>>v..v..v..v>.>.vv>...>...>v>>.v>>.v.v........>v...vv.vv.v>>.vvv..>..v...>v.v.v>v.v.v.>.v..v>..v.v.v... +v.>v.v.>v>...>.>..>vv..>vv.vvvv...>>vv...>....>vv.>>>.>.>>v..>>v>vvvv.v.v.vv.>>v>...>v>.>>....>>v.v..>>>v>.>.>.vv..>....>.>>vvv.v..v.vvv.>. +v.>v>v..>v...>vv.v.v.v>.v....v>..>.>>>..>>.>....v..>..v.v...vv>.>....>>..v>>.>..>.v>>v....>v....vv.>vv>v>>vv>....v>>>.v>.>v.>vv.>.v...>.v.. +..>...>.>...v.v....>>v>.v.v.>v.>.vv.>v.v..vv.v....>vv>.>vv...v.v...v.vvv..vv.>..>v.>..v...v.vv>>v>v>.v>.v...v.v...v.v.v.v..>>v...>vvv..>>>. +>.v>>>.v.>>v.>v>>...>.v.....>.>...v>>v>vv...v.v....>>vv..>>..vvv...v>>.>.vv..v......v.>>v.>>..>.v.>>>>.v...>>.>vv.>.v..v.v>v>..v.vv.v.>v... +..v>vv>..>>v....v....>>>..>>>vv...>.>.>v>v>.>.....>........>..>.>....v...>>.v>vv.v..v......v.v....>.v...v....>vv.vv....v.....>...>>>v...... +>....vv>>.>.>..v.vvv...v>>.v>....vv...v..vv>..v........>....>..vv.>>>.>....v...v..>vvv.>vv.....v.vvv.>>v....vv.>v.v.>..v...v.vv>.v.>vvv.... +.>.>....v>.....>..>>>.>.vv>vv..>.>v.vv....vv.>.>v.v..v>..>>v>>>v.>>v>vv.>>>v>v>>v..v...>..v>.>vv.>.>.v.>v>vv.>...v.v.>>v......v.>..>.>v>..> +>v...v..>..v>v.>.>..v.v>...v>vv.v>v..>.>>......>......vv>.>.v>.v..v.v>.>v>vv>..>.v.>.>..v.v.vvv.v..>.v>>>v.v>....v.v>.v.v...v.vv.>...v..>.v +.>v.v...>>.>.>vvv..v>.v.....v.>.....v..v.>v....>.v>....v>>vv..>v>....v>.>.....v.....>>...v>..>>....v..v.>.v.>.v..v.>v.>......vv.v..v>...>.. +..>v>v..vv..v..>v>v..v.v...v..v.>>.v.v.>v..vv>...v..v.v.vv>.>>vv.>v.>v>.v...vv.........v.vv.v...v>v>...>vvv.>.>>v..>v>vv.>vvvv>.>v.>v..>>.v +>v>...>v.>>>>....>vv>.v>.vv>>.>v.v..>.vv.vv..v.>.....v>v.>.vv..vvv>...vvvv>v..v.vv.v>.vvv.v>v>...v>.v.v>...vv...v.vvv..vv...>..>..>...>.... +>.v.v>..>..v..>.>>vv>>..vvv>.>.>.v.vvv.......>>vvv.vvv.>v>.>.>..v>..>>.....>v.v>>v>.v>.>..>.vv...>>.v.>vv>>v>.>.v>v>vv>.....v....v..>vv...> +.v..>.v>....>v.>>..v.>.vv......v.>>...v.>..v>>.>.>....>>..>.vv>>.v...v.....v..v.>v.v>v.>>.>.v.v...>v....>v>.>>v.>v>.>.>.v...vv.>v...>...... +v..v.v..>v.>..>.>>...>v>v..>v>..>..v...v>.v.v.>..>.v.>v>.>>>...v.vv.....>>..v.>..v..vv....>.>...>...>>v..>...v.......v>..v.......>v..v>v... +.v...>v>.>.v>..v...v..>..v>>.>.v>..v..>....>>.v.>.>..v>>>vv>>v>..v..v...>>.>v>vv.>..>v..>>.v.>v..vv>>.v....v>......>v>..vvvv>vvv>vv.v>.v>>> +..vv..>..>v...vv.>.v>.v>.>>vv>>.v..v.v.>v.v>..v....>>.vv.>.v>.v>>.v>v...>.>..vv..v>..>....>>..v>v.>......>vv>...>vv>>....>>>>..vv>v.vv....v +...v>..>.v.v...>.>.>.v......v..>v..v.v.....>>vvv>v>.>.vv..>vv.>>v.vv..v....>..>>..>.....v....v.>......>.v>.v.....vv>...vv.>....v.>.v>v>v>.> +.>.>.>...>v.....vv....>v.v>..>.v.>.>>.v>....>...v.....>vv.>vv..v>...>.v.v..>>>.>.vv..vv...>.>v>v.>...>.v.vv.v....v........v..>>v>..v.>.>.>> +v.v>>...>v.>..v>.>.v..v....vv.>...v>...>>...v.>.......v>.>>.>.v>....v.>>..vv.v>..>v...>vv...vvv.v.v.>v.>>..v>vv..>v.>....v.>>>>v......>v.vv +.v>>..v>.>.v>>v..>vvv.>.>v.v...>>v.>>>...>vv...>.v>>>.v>.>.v..>v.>.>v..v..>..v.....v>...>>>.>.vvv>>>v>.>>v..v>>>..>....>.vv>..>>v>..>>.v... +>>>v.vvv.vv.>>>....vv...>>...vv>v>.>>>v.>.>.>...>v>...>.v>......>.>..v.>>v.>v..>v..>v......>.....>.v..v...v..v....>.>...>>.>>v.v>..>.>v..v> +.v.v....v>.>.>.v>>v......>>v.>.vv>.vvvv.vvvv.v..v..v.>.v.v.>...>...vv>v....vv......v.v>v.>>>>>v>.>>>vv>.v>>..v>.vv>v.>..v>>v.v>>.>..>>.>v.. +.vv.>v>>...>.>>v.v..>v...v.v.>..........v...v....v..vv..>v.v...v>>.>.v>vv>.vv>.v.v>.v.>v>.>>>..>..>...>....v.v.>v.vv.vv.....>.vv>>>.>>..>>. +.v..>..>..>>vv.v.....>>.>..v.....v..v..>..v>..v...>.....>>>>..v..vv.v...>>>.v.>..>v.>>>..>...>>>>.v.>.>>>v>v.v.>.v.v>.>>v>....v.>>>..v>...> +>.>.>...>v..>v.v...v>..>>>....>>.v>v>v..>.>>.>v.v.>vv.v..v.v.>v>v......>v>.v>.v.....v>..v...v>v.v>vvv.>.v>....>v.>.>>>.v..>vv>....v..>..>vv +>.v>>>.vv..v..>.vv>v..>>..>...>.v>.v..>vv>....>vv.>.>vvv.vv.v>.v>>.....>>...>.v>.>.v.v.v.v.....v>>..v..>...vv.>.>.vv..v.>>v.....v>vvv>>.v.. +>>.>v>>..>..v>..>v...>>v..>vv..>..>..>..>>>>>vv.>..v.v.>>v..>...>>..v>>....v...>..v.v.>..v>.v>vv>.v.v.v...>>....v..>>v>.vv..>.>>>.....vv.v. +...>>....>v...>v.>v>.>>vv..>>>>.v.v.>....v...>>v>.>...v>.v..........v....v.vvv..v>vv...vv.vv>>..>>....>vv.>.>..vv.v>.>v.>>>>v...v.vv.>..>.v +.v.>..>.v.>..vv..>v..>>.v>>>>>vv>.v>.>.>.v.vv.v>.v.v.vvvv>......v....v.vvv...>.>.>.>>.>v>..v>vv.>...vv>>>v>vv.v..........>>v...v>.>>>.>.v>. +.v..vvv.>..>.vvv.>>vv.vv.....>.vv..vvv..vv.v>vv...v.v.>.v>vv.....>vv..>...>.vv.v>v.>.vv.vvv>v..v.v>>>.v.v>>.>>.v.>....>..>v>v.v.v.>>.v>v... +v>.>.v.>..>.>.>>..>v>.v..>...>..v>>.vv...vv.>v.>..>..>.......>..v>>v.>v>v..>v.>v.vv>.>v.vvv>v.v...>.v.v....>>.vv>v>>v.v>>v>>..>>...>v.....> +>>>>>.>....>.v>vv..>.>.vv..vv.v.v...>.>>.v..v..>vv>..v..>v.>>.>>..>.vvv.vv>...v.....v..v>.>>v>v....>........v>>vv.>...v.>v.......vv.>>..... +.vvv.v......>>...>.>..v.>..vv..v>...vv>v>>>.>...>.v..v.v......>...>v......v.vv>...>...>..>.v...v..v>.v.vv>....v......>..v.>.vv....v.v.>>..v +...>v...>>..v.v.>........>>vv>>.>v>>>>v..>.v...v..>v....>>.v.vv>v>v...>>.>vvv>v..>...v>vv..>v..>.>.v.v...>.vv.....>v>.v>v>v>..v.>.>..v.>v.. +vvv.>.>v.vv..>>.>v>>..>.v>>.v.>.>>>.>>.v.v.v.>>v.>.>...vv...>....v.>...>.v..>v....v>v..v.>>........v>v.....>..v>v....v.>.>..v.v>v..>...v>.> +.v.>v..v...>>...>....vv.>>.v...v>v>.>v>>>.vv...v.......>>...vv>.>.v.....>>.v.>...>vv>>>>...vvv.>.....v...>>vv...vv>..v.>v>>....v...v>>>.v.v +.>..v>vv>.>v.v.>.v>..>v...v>.>v>>v..vv.>.>vvvvvv.v...>...v>..>.>>>.>v..v..>>.vvv.>...v.>...>>..>........>>.v.vv..vv.>>v..vv>......>v>v..... +...v>>..>..v..v.v>>.v.vv>..v..v...vv..>..>v..>v..v>..v>>...v>.v.>>..>.>>v>...vv..>>.>.vv.vv.>>..v>.v.>.v...v>vv>.....v>.v>....>>v...v.....> +...>>.>.....v..v...>.>>....>>v>.v..>.>v>v...>.>....v.>.>v.v..>v>>vvv..vvv.>>.>.v>v>...v>.v...v.v.>>...v.v>vv>>>>.v>.>>...v.>.>>......>..... +.v..vv.vv..>....vv...vvvv.v..v..v.vv>.vv>v>vvv.>>v>.>v>....v.>.>>v.....v.>......>...v.>>.>.>..>.>..v.v.v...>v.>.v..>.v.>.vvv.>v>.>..>vvv>v. +vvv...vv>v>>vvv..v>..>>>>.>>..v>..>.v.>....>vv.>vv.>>.vv.v.>>..>..vvv>...>..vv>>>..>v...>>v...>>.v.>>..vv>>.vv..v...>>>....>v.>.>>>v.>v.>>v +>>..v..vv>v.>>v.>...>.vvvv..v....v.v.v...>>.>..>v.v>.>>v.....v.v.......>vvvv>.>v>v.v....v.v>.v.v.v>>>v...v...v..>vvv..>.v>>.v.v.>..>>>.>.>. +..>>.>>vv.>v>>.>.v..vv>.v.>..v.v>>>>.v.vv..vvv...v.vv>v...>>..v.vv.>>v.v...>.vvv>..>v..>.v....>>v..>>..>.v.>....v>.v...v..v...>.v>>>v>..v.v +>>.>vv..vvv..v>.>vv...vv.>>>.v>v..>.vv..vvv>.v.v..v.>...v>v.v..v.vvv.>v>....>..>..>.>.v.v..vv..>>>>.vv>>.v>v>v>>.vv>...v.v>>v..>.>>..>..>v> +>>v..v.vv.......v.>>.>.vvv.v...>v.>v>.>>>..>.>v>.vv>>v..>v..>..>v...v..v..>>>>.>>vv>.>.>..>.>.>..v....v.v.v.>.....>v>...>.v>.>>..>vvv>..v.> +v.....>vvv..vv.....>v..vv...>.>.>v..v..v>>>v.>.v>.vvvvvv>vvv...>>>....v...>v>v..>..>....v>.>..>v>vvv.>>.v.v>v>.>.vvvvv.>>vvv.>>...>v>.>>..v +...>.>.>...v...vv..v>.v>.>>.>v>....v.v..>>v..v.>.v..>v>v>>..>vv>>...vv>.v.>>v>v...v....>>.>.v.>>vv......>v......>>.vv..>.v>>..>..>.>>.v.>>. +.>.>>>v.v..>.>..>v.>..>v>>>..vv.vv.>v.>.>.v..v>>v.vv.v..>>...>v>.v>v.v>v.>v.v..v.>.>.>v..>.>v.v>.>v>v>.v.....>....v.>.>v..>.>v.vv.>....>>.v +.>v.>v.>>.>..>>>.>.>.....>.v>...>vvvv.v.>>v>vv..>v.>v>v..v>>.v>v>.>....v..v.vvv.>...vv.vvvv>v..vvv>v.>>>>..v..v.vv>..v.v.v>...>v.....v.>>.> +>>v.v.>>>>.>>...v..>v.v..v..>>...>........>.>.>.v..v>...v....vv.>..vvv>>.vv.....>vvv>..>....vv.v.v>.v>v..v>.>v..v.>..v.vv>>>>....v.v..>..>. +>.vvv>vv...>v>v>.v>>>...vv...v...>.....>>...vv.>..v......vv.....v.>...v.>.vvv..>..>>..v...vv...v.>.v>v>v.>..>>.>.>v....>..v.v....>>.v>...v> +.v..v>.>.>>>..v.>v>..v.v.....>.v..>v>.>vv.>.v>>vv..vv>....v.vv.>..v>v..>..vvv...v...v>>.v..v..>.>>vvv..>vvv..>vv>v>>...v.vv.....>.>...v>..> +.vvv..vv>..>....vv.>...v>....>..>....>..v>.....v..>.>.vv>.vv.v.>>v>>v..v.v.>.......>>....>v..v>>...>....v>vv..>.v..>....>vvvvvv..v>.vvv.v.v +v>>v>...>v..>v..v>..vv>v..v>>.vv.>>>v.v....vv>vv>>>>v.v.v....>>.vv.vv>....>.....v...>.v>>...>.>v>.>v>.>.>>..>....>.v>.....v...vv.vv.v>v.>.v +..>.v>...v.>v..v.>.>.....vv.v..>>..>.>.v.>.>v......>...>.>.>.vv.vv.vv>vv.v>...>>..>>.>..>>....v.>.v>v.v>.v>>..vv>>...v>>v..v>vv>.>.>>...v>. +...vvvv..v.>...vv..v.>.vv>.vv>>.v.>.>.>.v>.vv>>.v>>.>>v..v.v.>vv.v..v.vvvv>..v>..>>>.v.v>..>v...vv.v>v>v..v.v.>v.vv....v.>....vvv..>vvvv>>> +.v>>.v..>>..vv..>v...v..v>.>.v.>>v>...>>.v.v.v.v..>.vv>>.>>....v.v.>v..v.>..>>..v.>...vv.v....>>>v>>v.....>>>>vv....vv..v>v>vv>..>.vv..vv.. +>>>>.v>..>.v..vv..v.v..>...>..>.>v.>>>.>..>.>.v>.......>..>.>..v>..v.v..>>...vvv..v...>...vv.>v>.>v.>...vv.>..>..>v>.>>.>vv.v..v.v.vv>>v... +v..>>v.>.>.>>.vv.vv.v.>..>.vv.v...vv.v.>>v..v.v....>v..v..>>...>...v....v>..v..vvv>vv..v..v.v...>.....vv>>v.....>>v..>.>.vv>.>>.>.v..>..vv. +.v....>..v.v.v>..vv.>...v.v>......v.>..>.v....>..vv.vvvvv>>>.v..vv.v>>..vv.v>.>..v..vv.>......>v.v.....v.>.v..vv...>..>v>vvvv>>.v...v.v.... +...v.v.>.>....vvv..>vv.>...>>>.v>v.v>>>..>.v>...vvv.>>>>.>>..........v.>......v>...vv...>v....>..>>.v>.>>.v>....>..>..vvv.>.vv..v.>....>..> +.>.v>.>.v.>....>.>>>>.>..vvvv>>.v..>.>.>.v.>>>.>..v.>v...v....>>v.>..>>v..>>v>.>>.>>.>.....vv>.>>>v..>>>v.>..vv..v.>.vv>v>.vvv...vv.>.v.v.. +..v>.v..>..>vv...v.v...v...>.......vvvvv>..v.....v...>vv.v...>v.>>v>v>.v>>>.v>.>v>v.>.....v>>vv.>>.>v..>.vv...>.>>..>.v.....v.v.v.vv.v>..>v +vv>.vvv>.>.v.....v..vv>vv...>v...v.v..>.>v.>.>vv.v>..v>vv.....>.v.>.v....v.......v>>..v>vv.v.v>>.....v>v...>>>..vv>v.v.v.v>.v.>.v..v>...v>. +..>v..>..>vv>>.vv.>..>.v...>vv....v>.>........>...>vv.v>>..>vvv.>.v>vv.vv..>.>>>.>v..v>.v.>>...>.>.v>>v....vv>>>....>v.v>v.v....v..v>v>>>>. +.>..v...v..v>.v.vv..>>......vv>>v....v....>>.vv>v..>.v.v....>>vv.v>v>v>v.>.>v..v..v>vvvv..vv>vvv.>.>..>v>>>..v..>.v>>>....>.>.v.>v>>...vv>v +v>..>.v..v.........v.>.>>...>>.vv>vv>....>..>.>>v>...>>>vvv>v...v.>vv....v.>v.v..v.v.vvvv.>>>.>vvv.>..vv..v....>..vvv>vv>v.>v>...v.>v.vvv>v +v..vv>>v...v>.>>...vv.>.>v.v..>...v>>>.>vv.v..v..v....v.v.>>.>>.....v>v..........>>.>vv......>.v.v>v...>>>>>v.>vvv>>.>v.v>v..>.vv>.v>>v.v.. +.>>>>..v.....>.>..>..>.>..v>...>..>.>.vvv.v>>>>>.vv.......>.v>>>v>.....>>>...>v..>.>>..v..>.v...v>...v..vvv.....>..>.>.v.v..v.>....vv.v...v +.vv>v.v.>.>..>.>.vv>>>vv...vvv.>.>v.>.v...>>>.vv>>>vv>>vv>v>>..vv>..>.....>.>>v...>.>>>v..>...>v..>>v>.v>.>.>.>.v>.v.>..v.vv.vvv.>v.>...v.> +...>..v....>v.v>.>vv>.>...>.vvv>...v>.vv.>v..v>.>>>..>.v....>>vv....v...>...>>>>.>.....v>v....>..>v.>v>.v..vv.....>>..v.>.>..>.>.v>>>v.>vv. +v>v>....>..>>.>........>....v...>....>.vv>.vv.v..v.....>...v.vvv>vvvv.v.>.>.vv..v.>>.>v>.>v.v.v>>.vvvvv>v>v.v.vvvvv>vv.>..v>v.>..vv>.v..vv. +.>..>>>..v..>>..vv..v.v..>>.v.v>.>.v>vv..>...v.v..v>v..>.v..v...v.v.v.>..>>>>.>vv.vvvvv...vvv....>..v..>...v.>..>.vv>v>>>.v..v>.vvv..>...vv +.v.....>.v.>.>.v>v..v..v.>..>v>.v.>v..>vvv.vv..>v.vvvv>v..v....v>>>vv>v.v>vv..>....>v.......>vvv.>..>vv.>.>>....>.>.........>v>vv>v>>>>..v. +>vvv>.vv.v.v.>.v.v..>v.>>..v>.v>v.v.>..>....>..v..v.v>vv..vv>>.v..>....v....v.>>>vv.....v.v.>>v.vv...>..>>>.>>.vv>.>v....>.>.vv...v>v.>v>vv +>.vvv...>.>....vv.vv..>>vv...v..v>>..>..vv....vv..>v..vvv>vvv.>.>.v.>>>v>..>vv.vv.v.....>v>>v...v.v.v...vv..v>>>v>>v..v>..>>>.>.vv.vv>>..vv +.>.....v....vvv...>v.>.....v.>.>....v>.>v.v>>>>..>.v.>v..v>vv>..>.vv>>>v>>vv>...>......>v..>.>....>.v.>>.v>....>........>>.....>>>vv.v.v>v. +...v>.>>..vv.v........>>>.>.v>v..v...v.v>>...vv...vvv...>vv.>>v.v.>>....>>>..>...v>.>..v.vv.v.v>..v>...v>.vv.>v>.v>..>.>.>>....vv>>>.>v>... +>v>..v...>v....>.>>>v.v....v.>>.>>..v>.v.>v>.>.v>v.v>.>.....>..vv..v>v.>v.>.v..>>...>.>v.v.>>>.>vv>>.>>.v....v.>>.>.v.vvvv.>>v..>.vv.v>.v>v +.v.>.vv.>..v.....v>>v.>>>..v.>.>v>...v.>..>>.>v>.v..>v>v....>v.>..v....>v.>.v>...>>>..>>vv>..v>.v..v>v.vv.>.>v..>....v...v.>...v.v...v>v.>> +v.>vv....>..>v.>vvv..vv.>vv>.>>..v>>>>>v......>>>..v..>v>........v>..>.vvv>>>.vv....v.v....v>.....>..>>vv.>.vv...>.v>......v>>v...v>...v.>. +v>.>.>..>>.....>..>>...>v.v.>>...>.>v>v>vvv.v.v...>.v>vv...>>...>..vvv.v.>.>.>v>.v>>>>.vv...vv>v.vv.>.>>v>.v>v.......v..>>.v>.v>...>.....>v +v.....v....v.v.v>v.v>..>>.v..>....vvvv>.v..v>>vvv.>.v>v>>..>.v..>vv>v.>>..v..v>>..v.>v.v...v..v.>..v>..>v..v>v>...>.>v......v.>.v>..vv.v.>> +>>vv...>v>>>>v..v.v..>.....>..>>>..v>vv.v.vv.v.>...vv>>>v>v...v>.>v..>..v>.v>.vv.v>v.>....>..v.>>..>>>....v>>vv>.>.vv.>>>>>..>.>.vvv..v.>>. +v..v>..>....vv.>..>>.>>.vv...v.....>.vv>.v.>>.>v.....>.v.v....vv.>vv.v>v..>..>...>>.v.>......>.v.>>>.>>v..v.v...v.v.>>....>v..vv>.>.>.v..vv +.v>v>v....>v>v>vv>.......v.v>>v..v.....v...>v..>..v>..v>.......>v>.v....v.v.>>.v...>..vv.>v.v......v...v...>...v.v.....v>..>.>.vv>>v......v +>>..v.....vv>.>>>>....>..v...>v...>.vv>vv......>>.>.>>>vv.v.v>>...v>.>.>>>v>...>..v>vv.v.>>v>....>.v...vvv>v....v>>.>v....vv..v>v.vvv.>.v>v +>..vv>>v>.>v>..v>....>vv>.....>>........>.....v>.v..>..v...v...>v.>....>vv.v>...vvv>vv.>.>v>..v>.>..>>vv.>...>v...>>vv.>>.vv>..>>...v>.>.v. +.v.>.......v>.....>vv..>..vv...>>..vv>v.>..v>.>...v..v.v.>..vv.v....>>...v.v>.>vv..>>>.>v>>>.>>v.v.....>..>v>v.>.v.>>...v>.>>>.>...v...>... +..>v...>...v.v.>.>>>>.v...>..>v..>.v.v>..v>v>>>.v>.v.vv...>v.>v>vv..v...vv>>.>.>...vv.>v>v>.v..v>.v>v.vvv..>.v...v.....>.>>vv>>>..>....vv.> +>..v.v>>v......>>>.>.v>.>vv..v>vv...........>>...>...>v..v.v>..>.>.v.>v.v..v>....>v.>...v..v.vv>..>>>....vv>.>>...v...>>.>>.v>>.v.>.v>..... +.....v....v>>v>..vvv.>v.>..v..>.vv>v>.v.....v.....>>v...>>>.vv.v.>..v>.v.>vv.>v.>.v.v.v.v..>.>>.v.>.v>...>v.vvv.>.>..>.v.>vv..v..>..v.>>..> +..vvv>>>.>>..v..>.v>..>>v.>v>.v>vv..>v.v....>.vv...>>.v.>..vvvv...v>.......v>v>..>.>vvv>>>>.>>......v....v......>vv>.vv>.>....>v..>v.>v.... +.>.v.>>v>.>....>>.v.>v..>v....>v.v.v..>.....v>.v..>...>.vv.>.v.vv>v..v..>.v>...>.>..>vvv...>....v...>vvv.>v...v>v>.>...>>..>..v..>.vv.v>v>> +.v>..vvv.....v...>v>v>..v>.>.....v.>.>v.v>.>.>..>..v....>.>>.>vv.>v.>.vv>v>>v.v>v.v.>v.v......>>.>>vv...v>v>..v.v.....>..>...>.....v.vv.>>> +>>>..>.vvv>..vv..>>v...>>.v...vv.....>.v...v.v..v.v>>vvvv>vv>..v>....>...v....>.>v.v>>>.>.>>v.v.vv.vv...>v>.v..vvvvvv...>>.>>.vv..vv....vv> +>.>...>>...>v.>..>>>>...v..>.....v..>>>.v.>..v>v>..v>v>..v..>>..v>>....>...v>vvv>.v>.....vv>..>.>>..>.>..>...v...v>>v.....>>..>>...>......> +v...>v..>..>.>>..v>.>...v>..>v.vv.>.v.v.vv>>v.>v....v...>vv...vvvv.vv...>>>>vvv..v.>.....v.v.v..>...v>.v>.>>>v..v>>...v..>.>.>.>>..v.vvv... +.>v..v..v>.v.v...v.>...vv..>..v.v....>.v.>>..>>.vv>>...v.....v>..v.vvv>.v...>v..v..v.>.>>vvv.>...v>.>.>..v.vv>.>..>v.v..vv>v.>..>>..v.>...v +>>...>.>.....v...v.>.v.....v.>>..vvv.v.>.vv>..v....>....>....v..>>>.v>.>v.>>v...v.>...>...>>>.>>v>...v>..>vv>>.....vv>v..v....>v.>.>>v..v.. +v.>>>.>.v......>v>v.>.....vv.>.>.>>v...v.v..v..vv>..v>>vv..>v.vv>....v>...>>>v>v.>.....v.>vv>v.>....>.>.v..>v>>.>....vvv.v.v.v>.vv>..v..... +vv>.>.....>.v..>>>...v.>....>vv....>v>>..v.>.>..>.v..>.....>v..v>v..>.vv>.>.>.v.vv>.>>.....vvv>>v.vvv.>v...vv.v>.>.v>>v....v>..v>..v.>vvvv. +.v.>v.v..>>.v..v>..v..v>.....>.>......>v..v....>.>.>...v>>...>>..v......>v>.>.>>>...v..v>v>.v..>..>v.vv.>.v>...v.>......v>>>....v>>v>>...>. +.v..v....v>v.v.v.>....v.>v>>.v..v>v>.>v.>vv>..>v>v.>v..>v..v.v>v>v..>>>.>.......v.>...>vv.v>.v>v...>vv>..>..v>..vv>...vv...v>>..v.v.vv>..>. +.>...vv>.>....v.v.>..>.>>>.v>>.>.>v..v>.vv..v>.v..v.>.>v..>...v..v...v.>v>>.>..>v>v.>v.>.v>v>v>v>...>.v>..vv.v..>.....v>v>v.v.v>>>...v>.>.. +vvv.v.v.>vvvv>.vv.>v.>.>.vv.>..v.vvvv.>..>v>.>v>v.>v.>..v>..>v..>vvv.....vv.v>v.v.>vvv.vv.....v>vv..>.>v.vv.>>>v..vv>.>vv..v>.>v>>.v...vvv> +v>vv.v.>.>.vv>..>...v....>.>vv..v>vv..v.v.v>v.v.....>.>>..v...>.>>.v..v.>.v>.>.>.v>>...v.>v.v>>......v>v>.>>v....vv.v.v..>v.v>.v...>v.v>>.. +>...v.....v..v>.>..>>.>..>>.v.v..vv>vvv.>v>>v>...>..>....v..vv>.>..>>.v.vvv>...>>.>v..v.....>..v.v>..v>.v....v>......>..v.vv....>.>....>..v +..>>v>v>..v>>...>>v.....>.>>.>...>>........v>v..>.>>>..>vvv.v.>..v.>v.v..v>>vv....v>..>...v>>..>..v.v.v......>>..v.v>..v..vvvv.>>..>..>vv.. +..v.>.>v....>...>..>....>>v..>v..>...>vvv..>v>...>vvv.......>>v....>..vv.v..v.vvv.v......>v.v.>.>.>>v.>.>>>>vvv...>>.>.>.v>vv..>...>.v>v.>. +>v.>..>>.>v..>>..>.vv.>..v.v.>v>..v..>>...>>v.v...vv>.v..>.vv..>.v>>.>....>....>...>.......>>.vv>v>.v>vv..v....>.vvvv>>..v>..v>>.>>v>>.>v.. +>....v..>....>v...>..>v....>>>.v>.v......>v.v.v...v>vvv>.>vv.v......>...v..v>>.......v>...>>>...v...>...v...vv>>..v>v.vvv.v..>.v.v>vv.>>>>v +>..vv>.>.>>....vv>..>vvv.vv..>>>v>..>>.....v...v>...v..>.>..>v>.........v>....v....>..>v.v.>>.v.v.>v..>.>v.>...>>..>...>.vvv>..v.>...>v>.v. +>v>v..v.v>v..>...>>vv.>>.v>..>.>>.v...>vv...vv>>.>>..v>v>>vv.v..>>>.>.v.>.>..v..>>.v>>.>>....>.>>v..>vv.>>>v>>....v..vv.>>>.vvv>>.>v.....>v +...v..v...>.>...>.>v....v>...>...>v>v.....v>>>v...v..>v>.>vv>.v...>........>.vv>v..v..v>>v.v.>>v>>..>vv>.>>.vvv.......v.........>..v.>v.... +...>v.>>.>.vv..>v.vvv.>..v>vv.>.v>v...>>v.v>.>v.>....v.......v>>v>..>v>..>>....>>>v.>.v>...>..v..v.>>v>>.>>.>>.v.>...vv.vv>vv..v...v..vvv.. +.>>.vv.>>..v.>.v>...v>>.>.vv.v>.....v.v.vvvv>..>.>.v.>......>v..>v>.v...>.>>.>....>>>.>......>..>..v>...>.vv..vv.>>..v...>v..vv.>vv>vv..v>> +...v.>v>vv>v.>>......v...vvvv....v>.>.>>v>>..>....>.v.....>>...>>vvv>v>v.>.vv.vv>>>......v..v.v.v....v....vv>vv.>>.>.vv>.v..>.v...vvv>..v.> +.>>..>>..>..vv>>.>..............>v>>.....>vv.>v..>.>v.>>vv.v..>>>v..>>v>v..v>>.v......v>.>>.v.>v>..v.v>..vv...>.>>...vvvv..v..v>>>.......vv +...>v..>v>..v>vv...v.>.v>>.vvv>>>.......v.>...v>..>v......>>..>....>vvv...>..v.vv>>v>v.v.>..>>v>v.>.v.v......vv.....>>..v.>>...v....vv..... +...v.>v>..v..v...v>.v>>>>>...v>v...v>..vv>>v>v....>vvv...>....>>v..>>v>.vv...v.>v....vv.>...>>...v....vv>>........>..v..>vvv.v....>vv....v. +>v>>....>v.v...>.>>.v.>.vv>vv....vv>.>.>>.>..>..>v>v..>>>.>.vv...>>.>v.v>>>..v>>>v.>..>..>..v.....v.v...v>.v.>>vv..>>>....>.v..vvv>.vv..v.. +.vv>vvv...>v...>v>v>.>.v>.>.v>.>....vv.>.v..vv..>...>>...vv>v.v.v...>v.v.>..>......>v....v....vv.....>>.>..>.>v.>v..vv>>vvv>..>..>v.v>>..>. +...v>>vvv>...>...v.v...>vv.v.v..v>.vv..>>...>>.v.>..vv>.v.v>>..>>..>..>>vv>v.>...>..>.>v.vv.>...v>>..>...v>.>.vvv.v...v..v...>v..v..>>v>..> +v>.vv>....v>>..v..vv.v.v.v.v.>..vvvv>>>.>v...v>.v..vv>.>>...v>>..>........v.>v>...>.>..>.v....>...>.>.>>...vvvv.>>>..>v.v..>..>v>>>.>.>.vv. +v.v......>>..v>>.vvv.>v..>.>.v.>...>>v..v.....>..>vv.>.>v.>.>.v.v>>>>>...>>.v.v.>>.v>.>..>v..v>>v..>vv..>..>v>.vvv>.>>...>.>....>>>.......> +.>...v>...vv.v.v..v>.v>...>>>..v.>.........>.>...>.>>..>v.v.>vv>.vv....>v.vv.v>vv...>>.v>.........>vvv....>>v>>...>>..>>v.>>v>.v>vvvv>>v>.> +.>>.>..>>v...>.v.v>..vvv..>...v....vvv>..>..v>.>.v>>>v>.>.v.>..v>>...vv..v>v>>.>>.v.......>>>......>..v>...>.v>>>.>.v...v>.v>..>>v..>.>..>v +>.vv.>......>.>.v>>v..>vv>>>.....v>.v>.>..v.>.v>v.v>..>...>v....v.vv>v...v.......v...v>v>>v.v..>v...v.v.vvv>...v...>v.>.......v..>.v.>vvv>> diff --git a/day_25/src/lib.rs b/day_25/src/lib.rs new file mode 100644 index 0000000..423facc --- /dev/null +++ b/day_25/src/lib.rs @@ -0,0 +1,150 @@ +pub mod day_25 { + + use ::array::array::*; + + #[derive(Clone)] + pub enum Square { + Down, + Right, + Empty, + } + + impl std::fmt::Display for Square { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Square::Down => { + write!(f, "v")?; + } + Square::Right => { + write!(f, ">")?; + } + Square::Empty => { + write!(f, ".")?; + } + } + Ok(()) + } + } + + impl std::fmt::Debug for Square { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Square::Down => { + write!(f, "v")?; + } + Square::Right => { + write!(f, ">")?; + } + Square::Empty => { + write!(f, ".")?; + } + } + Ok(()) + } + } + + fn parse_char(c: char) -> Square { + match c { + 'v' => Square::Down, + '>' => Square::Right, + '.' => Square::Empty, + _ => { + panic!("Expected a square, got {}", c); + } + } + } + + pub(crate) fn parse(s: &str) -> Array { + let lines = s.trim_end().split('\n'); + + Array::from_rows(lines.map(|line| line.chars().map(parse_char))) + } + + pub fn input() -> Array { + parse(include_str!("../input.txt")) + } + + fn move_east(arr: &Array, output: &mut Array) -> bool { + let mut moved = false; + for row in 0..arr.col_len() { + for col in 0..arr.row_len() { + if let Square::Right = arr.get_unsafe(row, col) { + let dest_col = if col == arr.row_len() - 1 { 0 } else { col + 1 }; + if let Square::Empty = arr.get_unsafe(row, dest_col) { + output.set(row, col, Square::Empty); + output.set(row, dest_col, Square::Right); + moved = true; + } + } + } + } + moved + } + + fn move_south(arr: &Array, output: &mut Array) -> bool { + let mut moved = false; + for row in 0..arr.col_len() { + for col in 0..arr.row_len() { + let dest_row = if row == arr.col_len() - 1 { 0 } else { row + 1 }; + + if let Square::Down = arr.get_unsafe(row, col) { + if let Square::Empty = arr.get_unsafe(dest_row, col) { + output.set(row, col, Square::Empty); + output.set(dest_row, col, Square::Down); + moved = true; + } + } + } + } + moved + } + + fn step(arr: &mut Array) -> bool { + let mut output = arr.clone(); + let moved = move_east(arr, &mut output); + for row in 0..arr.col_len() { + for col in 0..arr.row_len() { + arr.set(row, col, output.get_unsafe(row, col).clone()); + } + } + move_south(&output, arr) || moved + } + + pub fn part_1(data: &Array) -> u64 { + let mut arr = data.clone(); + let mut count = 0; + let mut changed = true; + while changed { + count += 1; + changed = step(&mut arr); + } + + count + } +} +#[cfg(test)] +mod tests { + use super::day_25::*; + + static TEST_INPUT: &str = "v...>>.vv> +.vv>>.vv.. +>>.>v>...v +>>v>>.>.v. +v>v.vv.v.. +>.>>..v... +.vv..>.>v. +v.v..>>v.v +....v..v.>"; + + #[test] + fn part1_known() { + let data = parse(&TEST_INPUT); + assert_eq!(part_1(&data), 58); + } + + #[test] + fn test_day_25() { + let input = input(); + assert_eq!(part_1(&input), 389); + } +} diff --git a/day_25/src/main.rs b/day_25/src/main.rs new file mode 100644 index 0000000..fe49f33 --- /dev/null +++ b/day_25/src/main.rs @@ -0,0 +1,6 @@ +use day_25::day_25::{input, part_1}; + +fn main() { + let input = input(); + println!("part 1 => {}", part_1(&input)); +}