From 7e9e3e63c3ecf8972447bc1b43b7f691eea3cb35 Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Fri, 9 Dec 2022 18:50:44 +0100 Subject: [PATCH] Rust Day 9 --- rust/Cargo.toml | 4 + rust/src/day09/input.txt | 2000 +++++++++++++++++++++++++++++++ rust/src/day09/main.rs | 62 + rust/src/day09/part_1.rs | 55 + rust/src/day09/part_2.rs | 82 ++ rust/src/day09/sample_input.txt | 8 + 6 files changed, 2211 insertions(+) create mode 100644 rust/src/day09/input.txt create mode 100644 rust/src/day09/main.rs create mode 100644 rust/src/day09/part_1.rs create mode 100644 rust/src/day09/part_2.rs create mode 100644 rust/src/day09/sample_input.txt diff --git a/rust/Cargo.toml b/rust/Cargo.toml index cf91b72..0ba3ea5 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -55,6 +55,10 @@ path = "src/day07/main.rs" name = "day08" path = "src/day08/main.rs" +[[bin]] +name = "day09" +path = "src/day09/main.rs" + [dependencies] # Required for one of the day06 solutions (commented out) # phf = { version = "0.11.1", features = ["macros"] } \ No newline at end of file diff --git a/rust/src/day09/input.txt b/rust/src/day09/input.txt new file mode 100644 index 0000000..0371339 --- /dev/null +++ b/rust/src/day09/input.txt @@ -0,0 +1,2000 @@ +U 1 +L 1 +D 2 +U 2 +R 2 +D 1 +L 1 +D 2 +R 2 +D 2 +U 1 +L 1 +D 2 +U 1 +D 2 +L 2 +R 1 +U 1 +L 1 +R 1 +U 1 +R 2 +L 1 +D 2 +U 1 +R 1 +L 2 +R 2 +L 2 +R 2 +L 2 +U 1 +L 2 +U 1 +D 2 +L 2 +R 2 +D 2 +L 2 +U 2 +L 1 +U 1 +D 2 +L 1 +D 1 +R 1 +U 1 +L 2 +D 2 +U 2 +L 1 +D 1 +R 2 +D 1 +R 2 +D 1 +R 2 +U 2 +R 2 +L 2 +R 1 +D 1 +U 1 +R 2 +D 1 +U 1 +R 2 +L 2 +U 2 +R 2 +U 1 +D 1 +R 2 +L 1 +U 1 +L 2 +D 1 +R 1 +U 2 +L 1 +D 2 +L 1 +R 2 +D 2 +L 2 +R 2 +U 2 +R 2 +D 2 +L 1 +R 2 +U 1 +R 2 +U 1 +L 1 +R 1 +L 2 +U 2 +L 1 +D 2 +L 2 +U 2 +D 2 +R 2 +D 2 +R 1 +U 2 +L 1 +U 1 +L 2 +R 1 +D 1 +R 1 +L 1 +D 2 +L 2 +R 2 +D 3 +R 2 +D 2 +L 3 +R 1 +L 2 +U 3 +D 1 +U 1 +L 2 +D 2 +L 2 +R 2 +L 1 +U 2 +D 2 +U 2 +D 1 +L 1 +D 1 +R 2 +D 3 +U 3 +D 3 +L 2 +R 2 +U 1 +L 3 +R 2 +U 2 +D 2 +L 3 +D 2 +R 3 +D 3 +U 2 +R 2 +D 2 +U 1 +L 3 +R 3 +U 3 +L 3 +D 3 +L 3 +D 2 +L 1 +R 2 +L 1 +R 2 +D 1 +L 3 +R 2 +D 3 +L 1 +R 1 +L 2 +U 1 +L 2 +R 2 +U 2 +L 1 +D 1 +R 3 +L 1 +R 2 +U 2 +D 1 +R 2 +U 1 +R 3 +U 1 +D 3 +R 3 +L 1 +D 1 +U 1 +D 3 +R 2 +U 1 +R 1 +U 1 +L 3 +D 2 +U 3 +R 2 +D 1 +R 1 +U 2 +L 1 +U 1 +R 3 +U 2 +D 1 +R 2 +U 3 +D 2 +U 1 +R 2 +L 2 +U 3 +L 1 +R 1 +L 2 +D 2 +U 1 +D 2 +R 3 +D 3 +U 4 +R 3 +D 2 +U 4 +L 4 +U 3 +L 1 +U 2 +L 2 +R 3 +U 4 +D 1 +L 1 +D 2 +L 2 +R 1 +L 2 +U 1 +L 3 +D 1 +L 2 +D 3 +R 3 +D 4 +L 2 +U 4 +L 3 +R 4 +D 4 +R 2 +D 2 +L 2 +R 2 +U 4 +L 3 +D 1 +R 1 +L 2 +D 1 +U 1 +L 2 +U 1 +L 1 +U 2 +D 4 +L 4 +U 2 +R 2 +L 2 +R 3 +U 2 +D 3 +U 4 +D 3 +R 2 +L 4 +U 2 +R 2 +U 3 +D 4 +R 4 +L 2 +R 4 +D 4 +U 3 +L 3 +D 4 +L 4 +R 2 +L 1 +R 3 +D 2 +U 4 +R 3 +U 1 +R 2 +U 1 +D 1 +R 1 +L 4 +U 4 +R 1 +D 4 +L 3 +U 1 +D 2 +R 2 +L 2 +D 2 +U 4 +R 3 +L 4 +D 1 +R 1 +U 3 +R 4 +L 2 +R 2 +U 3 +L 4 +R 1 +L 3 +D 3 +R 2 +D 2 +L 2 +D 2 +U 4 +D 5 +L 4 +U 2 +D 3 +L 1 +U 4 +R 5 +D 5 +U 4 +R 5 +L 2 +D 4 +R 2 +L 2 +R 1 +U 1 +D 5 +U 1 +D 2 +R 5 +L 4 +D 4 +R 2 +L 3 +R 3 +L 1 +U 4 +R 2 +L 4 +U 5 +R 5 +D 3 +U 4 +L 2 +U 5 +R 3 +U 5 +L 4 +R 2 +U 2 +R 3 +L 5 +D 2 +R 5 +L 2 +R 5 +D 4 +U 4 +L 5 +U 1 +D 4 +U 5 +L 5 +D 2 +L 2 +D 4 +L 2 +D 2 +R 4 +U 4 +D 2 +L 1 +D 3 +U 3 +R 2 +D 2 +L 5 +D 3 +R 2 +L 2 +U 3 +D 5 +R 1 +L 4 +D 1 +L 5 +R 3 +L 3 +D 3 +L 2 +U 5 +L 5 +R 4 +D 5 +U 2 +R 2 +L 3 +U 1 +D 1 +U 2 +R 3 +U 2 +L 4 +U 4 +L 3 +U 3 +D 3 +R 2 +L 5 +R 5 +U 2 +D 2 +U 4 +D 3 +U 1 +L 1 +D 4 +R 3 +L 1 +D 5 +R 3 +U 1 +L 6 +U 5 +D 4 +R 4 +L 5 +U 2 +D 6 +L 4 +R 2 +U 4 +L 2 +R 1 +U 6 +D 6 +R 1 +L 2 +U 4 +L 2 +D 6 +L 6 +R 3 +L 3 +D 5 +U 6 +D 5 +U 5 +L 6 +R 6 +U 3 +R 6 +U 2 +D 1 +U 3 +R 6 +D 5 +L 3 +R 1 +D 6 +R 3 +D 2 +U 2 +D 3 +L 6 +U 3 +L 3 +U 1 +R 6 +U 2 +D 3 +R 1 +U 3 +R 6 +L 2 +R 4 +L 1 +R 5 +L 1 +R 4 +U 6 +D 3 +U 2 +L 4 +R 1 +L 2 +R 4 +U 5 +R 1 +L 2 +U 1 +R 2 +U 6 +R 1 +D 2 +L 1 +U 2 +D 2 +L 1 +U 1 +R 4 +D 5 +L 4 +D 6 +L 2 +U 3 +D 3 +L 1 +R 3 +D 1 +L 6 +D 1 +U 6 +L 1 +D 6 +U 3 +R 5 +L 2 +R 4 +D 5 +L 4 +D 6 +U 1 +D 6 +L 6 +U 3 +D 3 +U 2 +L 1 +R 5 +U 5 +L 6 +U 5 +R 5 +D 4 +U 7 +R 7 +L 2 +D 3 +R 3 +L 1 +D 6 +R 3 +L 2 +U 2 +D 2 +U 2 +L 7 +R 4 +U 3 +L 3 +R 2 +L 5 +U 3 +R 6 +U 5 +L 7 +U 7 +L 4 +U 5 +L 7 +D 1 +L 1 +D 2 +U 3 +R 5 +D 1 +R 6 +L 3 +U 5 +D 6 +L 4 +D 3 +U 3 +R 3 +U 1 +R 2 +L 7 +D 7 +R 4 +L 6 +D 7 +L 7 +D 2 +U 1 +R 2 +U 3 +L 2 +D 2 +L 5 +D 4 +R 5 +D 7 +U 5 +D 1 +L 4 +U 2 +R 5 +D 6 +L 4 +R 7 +U 6 +D 2 +L 4 +D 4 +L 1 +R 4 +L 1 +R 5 +U 5 +R 5 +L 1 +D 2 +R 1 +U 5 +L 4 +D 2 +U 3 +L 2 +R 5 +U 4 +L 1 +R 5 +L 1 +D 5 +R 7 +L 5 +U 5 +L 7 +U 3 +D 6 +U 2 +L 2 +R 5 +U 7 +D 1 +R 2 +U 4 +R 7 +U 6 +L 3 +U 5 +D 3 +U 5 +D 6 +R 2 +U 8 +R 7 +L 5 +U 1 +D 3 +L 3 +U 6 +L 6 +U 5 +D 7 +U 3 +L 6 +U 1 +D 3 +R 5 +L 2 +R 1 +D 6 +R 2 +L 1 +R 5 +D 3 +L 1 +R 3 +L 6 +D 5 +U 5 +L 5 +D 3 +L 4 +R 7 +D 6 +L 8 +R 6 +U 8 +D 6 +R 3 +U 4 +R 1 +U 6 +R 3 +L 6 +D 2 +U 5 +R 2 +D 5 +U 7 +D 2 +U 2 +R 3 +L 3 +U 4 +R 3 +U 7 +L 2 +D 3 +R 2 +D 4 +L 4 +D 8 +R 2 +U 2 +L 7 +R 8 +U 8 +L 4 +U 3 +R 3 +U 8 +D 2 +U 5 +D 8 +R 8 +L 8 +R 4 +D 8 +L 7 +U 6 +L 4 +D 6 +U 2 +L 4 +U 8 +R 8 +U 6 +D 1 +R 5 +U 5 +L 8 +U 2 +R 3 +U 7 +L 5 +U 5 +L 7 +D 8 +R 7 +U 4 +D 7 +U 4 +L 3 +R 3 +D 5 +U 1 +L 6 +D 3 +U 5 +D 3 +R 1 +U 2 +L 3 +R 8 +U 1 +D 6 +R 6 +U 9 +D 4 +U 4 +D 2 +L 1 +R 2 +L 6 +U 6 +L 1 +R 1 +U 9 +D 1 +R 4 +L 3 +D 8 +U 7 +D 1 +R 7 +L 6 +U 3 +R 2 +L 2 +D 6 +U 5 +D 6 +L 6 +U 8 +L 5 +R 4 +U 6 +L 1 +U 8 +L 4 +R 1 +D 7 +R 9 +U 2 +D 3 +R 6 +L 8 +U 6 +R 4 +D 1 +U 7 +R 1 +D 9 +L 8 +D 9 +R 1 +U 6 +R 7 +D 2 +U 7 +R 4 +D 9 +R 7 +D 2 +U 1 +R 3 +D 4 +L 5 +U 7 +R 7 +D 2 +U 8 +R 8 +L 4 +U 6 +L 3 +D 8 +L 8 +D 9 +R 7 +L 5 +U 5 +R 4 +U 9 +R 3 +U 9 +R 1 +U 2 +R 9 +U 8 +L 8 +U 7 +R 1 +D 9 +U 4 +L 7 +R 3 +U 5 +L 6 +D 1 +L 4 +D 4 +U 6 +R 7 +L 7 +U 3 +L 8 +D 8 +L 7 +U 3 +D 4 +R 8 +D 1 +R 8 +U 10 +L 1 +U 2 +D 4 +U 3 +R 8 +U 3 +D 5 +R 8 +D 10 +R 8 +D 4 +R 9 +D 1 +L 3 +U 7 +R 7 +L 1 +D 8 +R 6 +D 4 +U 5 +L 2 +U 3 +R 7 +U 10 +L 1 +U 7 +R 1 +U 7 +D 2 +L 10 +U 2 +L 4 +D 6 +R 10 +D 4 +U 7 +L 6 +R 4 +U 6 +D 1 +U 6 +D 5 +U 6 +L 4 +D 2 +L 2 +U 7 +R 2 +U 9 +L 9 +D 2 +U 9 +R 9 +U 9 +D 3 +R 5 +D 3 +L 10 +U 3 +D 10 +L 10 +D 1 +U 2 +D 3 +R 8 +L 1 +U 6 +L 2 +R 9 +U 3 +D 5 +L 8 +U 4 +R 8 +D 5 +L 6 +U 7 +D 8 +R 9 +U 9 +R 8 +D 4 +R 5 +U 6 +L 8 +R 2 +D 3 +L 8 +D 6 +R 7 +L 10 +U 9 +R 6 +L 7 +U 8 +R 5 +L 1 +D 1 +R 6 +D 1 +R 9 +L 1 +U 5 +R 3 +D 7 +U 8 +D 6 +L 6 +U 11 +D 8 +L 6 +D 6 +L 7 +R 10 +U 5 +D 7 +R 5 +D 3 +L 4 +R 3 +D 2 +L 6 +U 6 +D 3 +L 4 +D 9 +L 6 +U 9 +L 3 +U 10 +R 5 +U 8 +R 2 +D 3 +L 6 +R 2 +U 6 +R 8 +D 2 +U 2 +R 5 +U 9 +L 5 +D 8 +R 2 +U 1 +R 1 +D 6 +U 4 +R 7 +L 7 +D 7 +U 11 +R 6 +U 11 +D 11 +R 6 +L 2 +D 10 +R 6 +D 5 +R 7 +D 11 +R 2 +U 10 +L 6 +D 4 +R 1 +L 3 +D 9 +U 8 +L 6 +U 1 +L 7 +D 10 +U 1 +L 1 +D 2 +U 3 +L 4 +R 6 +U 11 +R 6 +U 3 +L 8 +D 3 +R 7 +L 3 +D 4 +L 5 +U 8 +L 11 +R 1 +U 1 +L 9 +D 5 +U 3 +R 1 +L 6 +U 1 +L 3 +D 1 +L 8 +U 1 +D 9 +R 7 +U 11 +R 10 +U 8 +R 5 +U 3 +L 7 +R 3 +L 4 +U 6 +D 3 +U 3 +R 3 +D 1 +L 7 +U 5 +D 1 +U 6 +L 8 +D 3 +R 6 +U 10 +R 6 +D 1 +U 7 +R 5 +L 6 +R 5 +D 3 +R 9 +U 11 +L 8 +R 9 +U 5 +R 5 +L 1 +U 7 +L 11 +U 5 +R 3 +U 7 +R 9 +L 11 +D 11 +L 3 +U 11 +L 2 +U 3 +R 5 +D 1 +L 10 +R 8 +L 11 +U 1 +D 11 +L 4 +R 8 +L 9 +D 6 +U 10 +L 1 +R 12 +U 2 +D 8 +L 8 +U 1 +L 12 +D 9 +R 3 +U 3 +D 10 +U 11 +D 9 +U 8 +L 7 +D 10 +L 3 +U 9 +D 5 +R 12 +D 3 +R 9 +L 8 +R 12 +U 11 +D 5 +R 10 +D 8 +L 12 +U 7 +L 1 +R 7 +D 1 +R 12 +L 3 +R 7 +L 1 +R 2 +D 4 +U 3 +L 8 +U 2 +R 8 +U 5 +L 5 +R 7 +L 7 +R 7 +U 8 +R 3 +D 4 +L 7 +U 5 +L 5 +U 1 +D 12 +R 11 +L 5 +D 10 +R 8 +U 12 +L 11 +U 2 +R 2 +D 1 +U 4 +D 1 +U 1 +R 11 +D 1 +L 8 +U 5 +L 11 +D 11 +R 12 +L 6 +R 8 +L 13 +U 7 +R 7 +D 1 +R 13 +D 6 +L 5 +R 10 +U 4 +R 11 +D 6 +U 1 +D 6 +R 1 +U 1 +L 12 +U 8 +R 4 +U 9 +R 12 +D 1 +R 8 +D 2 +U 5 +L 7 +U 12 +L 5 +D 10 +R 8 +D 6 +R 13 +D 7 +U 7 +L 9 +D 12 +U 5 +L 7 +D 4 +U 2 +R 13 +U 11 +L 3 +R 6 +D 5 +R 6 +L 11 +U 6 +D 5 +U 6 +L 2 +D 8 +R 4 +U 4 +L 12 +D 6 +U 8 +D 8 +L 5 +D 12 +R 8 +U 11 +D 8 +L 7 +U 13 +L 11 +R 6 +U 5 +D 9 +L 11 +U 10 +D 13 +R 5 +D 8 +R 7 +D 6 +R 7 +D 2 +L 13 +R 11 +U 1 +D 7 +U 13 +R 9 +U 12 +R 13 +L 2 +U 13 +D 2 +U 6 +L 6 +D 5 +R 5 +L 2 +U 1 +R 4 +U 6 +L 10 +R 12 +L 3 +D 3 +L 8 +D 10 +U 2 +L 11 +U 2 +L 11 +R 8 +U 12 +R 3 +U 5 +L 7 +D 6 +U 6 +L 10 +R 4 +L 1 +U 8 +D 4 +R 13 +L 7 +U 6 +L 9 +U 13 +D 13 +L 8 +U 3 +L 13 +D 14 +L 1 +U 9 +D 1 +U 9 +R 12 +D 7 +L 9 +R 13 +D 12 +U 10 +D 4 +L 13 +R 11 +L 2 +D 9 +R 4 +U 10 +L 2 +D 8 +U 11 +L 14 +R 1 +U 2 +D 9 +U 8 +L 4 +D 14 +U 10 +R 3 +D 12 +U 12 +L 1 +U 1 +D 7 +U 8 +R 9 +D 7 +R 11 +D 11 +R 13 +D 14 +L 5 +D 1 +U 12 +D 7 +U 13 +D 9 +U 6 +R 5 +U 13 +L 4 +D 8 +L 3 +U 8 +D 4 +R 4 +D 2 +L 1 +D 12 +R 11 +U 11 +D 6 +R 12 +U 3 +D 2 +R 6 +D 1 +U 11 +L 7 +D 9 +L 8 +R 1 +U 13 +D 7 +L 9 +U 4 +D 8 +L 12 +D 6 +R 4 +D 5 +U 13 +L 2 +D 11 +R 4 +D 5 +L 4 +U 9 +L 12 +U 10 +D 3 +R 15 +L 3 +D 10 +L 4 +R 2 +D 10 +R 1 +U 10 +L 9 +D 7 +L 5 +R 8 +U 3 +D 9 +R 5 +D 8 +U 5 +D 5 +L 8 +U 2 +R 5 +U 4 +D 6 +R 3 +L 1 +U 15 +R 12 +D 14 +R 12 +U 14 +D 8 +U 10 +R 9 +D 8 +L 10 +R 4 +U 5 +D 15 +U 6 +D 4 +R 7 +D 1 +R 15 +U 15 +D 4 +R 6 +L 1 +R 7 +L 12 +U 3 +R 1 +L 6 +D 6 +R 5 +D 15 +R 1 +U 10 +R 4 +D 13 +L 5 +D 10 +L 7 +R 5 +U 15 +L 11 +U 4 +D 9 +U 12 +R 12 +L 9 +D 10 +U 7 +R 3 +L 10 +R 12 +D 2 +U 8 +L 7 +R 3 +U 1 +D 10 +L 11 +R 12 +L 8 +U 1 +D 12 +L 4 +D 4 +L 6 +D 7 +R 3 +L 7 +U 1 +R 4 +L 1 +U 2 +L 6 +D 4 +L 7 +R 7 +L 15 +U 4 +R 7 +D 8 +U 9 +D 3 +L 5 +U 6 +R 2 +D 10 +L 9 +U 16 +L 15 +U 1 +R 15 +U 13 +L 12 +D 10 +R 1 +D 6 +R 3 +D 1 +L 14 +R 10 +D 2 +R 10 +U 12 +R 10 +L 13 +U 14 +D 11 +U 16 +R 6 +U 4 +R 6 +U 13 +R 5 +D 1 +L 12 +U 14 +D 11 +R 11 +D 7 +L 3 +R 7 +L 9 +U 11 +D 6 +U 14 +D 2 +L 1 +R 16 +L 14 +D 10 +U 4 +R 15 +U 11 +R 10 +D 5 +R 8 +U 13 +D 11 +U 9 +R 8 +D 4 +L 11 +U 8 +R 7 +D 14 +U 8 +D 6 +L 13 +R 2 +L 16 +R 10 +U 7 +L 10 +U 2 +L 13 +U 8 +D 5 +U 3 +R 14 +D 15 +R 10 +D 4 +U 10 +D 15 +R 6 +U 13 +R 1 +U 16 +L 2 +U 6 +L 8 +D 2 +L 11 +U 15 +D 5 +U 1 +R 3 +D 16 +L 3 +R 4 +D 8 +R 10 +L 8 +D 1 +U 2 +R 4 +U 3 +D 16 +U 10 +R 11 +L 11 +R 7 +L 3 +U 17 +D 1 +L 10 +D 6 +L 6 +D 6 +R 8 +U 16 +D 15 +U 12 +L 12 +D 17 +U 9 +R 7 +U 12 +L 6 +D 5 +R 2 +L 17 +U 6 +R 1 +D 13 +R 11 +D 17 +R 5 +L 3 +D 3 +U 4 +D 4 +U 4 +L 11 +R 4 +L 15 +D 7 +U 13 +D 12 +U 1 +L 16 +D 2 +L 12 +R 15 +U 11 +R 15 +D 12 +R 4 +L 3 +R 3 +U 3 +L 13 +U 4 +L 16 +U 7 +D 17 +R 14 +U 11 +D 4 +L 11 +U 9 +D 8 +U 3 +R 10 +U 16 +R 5 +L 10 +D 3 +L 7 +U 9 +R 2 +U 14 +L 8 +R 9 +L 6 +D 14 +L 14 +U 3 +D 9 +L 8 +D 14 +U 6 +L 4 +R 7 +D 4 +L 6 +U 11 +R 8 +D 8 +R 5 +U 17 +R 15 +U 1 +L 17 +D 14 +L 2 +D 3 +L 16 +D 7 +L 16 +R 10 +D 6 +R 11 +U 10 +L 14 +R 2 +U 3 +D 1 +R 16 +L 5 +R 2 +D 15 +U 6 +L 3 +D 9 +R 12 +D 13 +U 17 +R 16 +D 15 +U 3 +D 13 +L 7 +R 12 +U 18 +L 12 +U 7 +L 18 +D 12 +L 17 +D 6 +L 8 +D 16 +L 9 +R 8 +U 9 +D 9 +U 16 +L 10 +U 12 +L 9 +U 10 +R 13 +L 7 +U 17 +L 13 +D 18 +L 6 +R 14 +L 9 +U 1 +R 8 +U 3 +R 13 +D 3 +L 14 +D 8 +L 12 +R 3 +L 11 +R 2 +D 7 +R 14 +L 9 +U 1 +D 5 +U 10 +R 5 +D 8 +U 2 +D 17 +L 16 +D 3 +U 15 +R 17 +D 10 +R 16 +L 3 +U 2 +R 5 +L 7 +U 7 +D 12 +L 8 +R 4 +L 18 +R 13 +L 18 +R 11 +U 1 +D 1 +L 12 +U 15 +L 4 +D 12 +U 13 +L 14 +D 14 +L 12 +D 14 +U 14 +L 6 +R 5 +D 6 +L 13 +U 16 +L 11 +U 7 +R 10 +D 6 +U 17 +L 12 +R 11 +D 11 +U 7 +R 2 +U 9 +R 16 +L 5 +D 16 +R 7 +U 4 +D 19 +L 2 +D 18 +R 1 +U 15 +R 13 +D 5 +R 2 +U 2 +D 12 +L 17 +D 11 +U 8 +R 13 +U 11 +R 2 +U 13 +R 11 +U 19 +L 17 +R 17 +D 16 +R 18 +U 9 +L 13 +D 1 +R 16 +D 13 +R 6 +D 9 +R 7 +U 10 +D 10 +U 8 +R 8 +L 2 +R 17 +D 13 +L 9 +U 19 +D 6 +L 14 +R 9 +L 19 +D 17 +R 17 +D 10 +L 1 +U 15 +D 17 +L 12 +R 10 +L 14 +U 16 +L 17 +U 8 +R 8 +U 4 +R 11 +U 14 +R 2 +L 9 +U 11 +D 14 +U 14 +D 9 +L 10 +U 19 +D 10 +R 5 +D 1 +L 3 +U 14 +R 11 +L 17 +R 7 +D 8 +R 1 +U 2 +R 4 +L 2 +R 13 +U 16 +D 2 +L 2 +R 2 +U 16 +L 3 +D 7 +R 7 +U 2 +L 5 +U 7 +R 17 +U 6 +D 12 +U 17 +D 13 +L 19 +R 19 +L 9 +D 14 +R 15 +L 7 +U 11 +R 2 +D 16 +U 6 +L 12 \ No newline at end of file diff --git a/rust/src/day09/main.rs b/rust/src/day09/main.rs new file mode 100644 index 0000000..5c86e84 --- /dev/null +++ b/rust/src/day09/main.rs @@ -0,0 +1,62 @@ +#![feature(exclusive_range_pattern)] +const INPUT: &str = include_str!("input.txt"); + +mod part_1; +use part_1::part_1; +mod part_2; +use part_2::part_2; + +#[derive(Clone, Copy, Debug)] +pub(crate) enum Direction { + Up, + Down, + Left, + Right, +} + +impl From for (i64, i64) { + fn from(value: Direction) -> Self { + match value { + Direction::Up => (0, 1), + Direction::Down => (0, -1), + Direction::Left => (-1, 0), + Direction::Right => (1, 0), + } + } +} + +pub(crate) struct Move(Direction, i64); + +impl Move { + fn from_string(string: &'static str) -> Self { + let (direction, distance) = string.split_at(2); + let direction = match direction.chars().next().unwrap() { + 'U' => Direction::Up, + 'D' => Direction::Down, + 'L' => Direction::Left, + 'R' => Direction::Right, + _ => panic!("Non-direction character found"), + }; + + Self( + direction, + distance + .parse() + .unwrap_or_else(|_| panic!("Found non-numeric input {distance}")), + ) + } +} + +pub(crate) fn distance_between_points(point_a: &(i64, i64), point_b: &(i64, i64)) -> (i64, i64) { + (point_a.0 - point_b.0, point_a.1 - point_b.1) +} + +pub(crate) fn parse_input(input: &'static str) -> Vec { + input.lines().map(Move::from_string).collect() +} + +pub fn main() { + let input = parse_input(INPUT); + part_1(&input); + part_2(&input); +} diff --git a/rust/src/day09/part_1.rs b/rust/src/day09/part_1.rs new file mode 100644 index 0000000..f749a63 --- /dev/null +++ b/rust/src/day09/part_1.rs @@ -0,0 +1,55 @@ +use std::collections::HashSet; + +use crate::Move; + +pub(crate) fn part_1(input: &Vec) -> usize { + let mut head_position = (0i64, 0i64); + let mut tail_position = (0i64, 0i64); + let mut visited_tail_positions = HashSet::new(); + + for head_movement in input.iter() { + for _ in 0..head_movement.1 { + match head_movement.0 { + crate::Direction::Up => head_position.1 += 1, + crate::Direction::Down => head_position.1 -= 1, + crate::Direction::Right => head_position.0 += 1, + crate::Direction::Left => head_position.0 -= 1, + } + + let point_distance = crate::distance_between_points(&head_position, &tail_position); + + match point_distance { + (2, 0) => tail_position.0 += 1, + (-2, 0) => tail_position.0 -= 1, + (0, 2) => tail_position.1 += 1, + (0, -2) => tail_position.1 -= 1, + (_, 2) => tail_position = (head_position.0, tail_position.1 + 1), + (2, _) => tail_position = (tail_position.0 + 1, head_position.1), + (_, -2) => tail_position = (head_position.0, tail_position.1 - 1), + (-2, _) => tail_position = (tail_position.0 - 1, head_position.1), + _ => {} + }; + + visited_tail_positions.insert(tail_position); + } + } + + println!("Part 1: {:?}", visited_tail_positions.len()); + + visited_tail_positions.len() +} + +#[cfg(test)] +mod tests { + const SAMPLE_INPUT: &str = include_str!("sample_input.txt"); + + #[test] + fn test_with_solution() { + assert_eq!(super::part_1(&crate::parse_input(crate::INPUT)), 0); + } + + #[test] + fn test_with_sample_solution() { + assert_eq!(super::part_1(&crate::parse_input(SAMPLE_INPUT)), 13); + } +} diff --git a/rust/src/day09/part_2.rs b/rust/src/day09/part_2.rs new file mode 100644 index 0000000..e5eaecf --- /dev/null +++ b/rust/src/day09/part_2.rs @@ -0,0 +1,82 @@ +use std::collections::HashSet; + +use crate::Move; +const TAIL_LENGTH: usize = 9; + +#[derive(Clone, Debug)] +pub(crate) struct Rope { + head: (i64, i64), + tails: [(i64, i64); N], + tail_history: HashSet<(i64, i64)>, +} +impl Rope { + fn new() -> Self { + Rope { + head: (0, 0), + tails: [(0, 0); N], + tail_history: HashSet::new(), + } + } + fn pos_diff(&self, index: usize) -> (i64, i64) { + let head = if index == 0 { + self.head + } else { + self.tails[index - 1] + }; + let tail = self.tails[index]; + (tail.0 - head.0, tail.1 - head.1) + } + fn execute(&mut self, Move(dir, count): &Move) { + let dir = <(i64, i64)>::from(*dir); + for _ in 0..*count { + self.head.0 += dir.0; + self.head.1 += dir.1; + + for i in 0..N { + let tail_movement = tail_update(self.pos_diff(i)); + self.tails[i].0 += tail_movement.0; + self.tails[i].1 += tail_movement.1; + } + self.tail_history.insert(self.tails[N - 1]); + } + } +} + +fn tail_update(diff: (i64, i64)) -> (i64, i64) { + let reaction = (-diff.0.signum(), -diff.1.signum()); + let distance = diff.0.abs() + diff.1.abs(); + let has_zero_component = diff.0.abs() == 0 || diff.1.abs() == 0; + match (has_zero_component, distance) { + (true, 2) | (_, 3..) => reaction, + _ => (0, 0), + } +} + +pub(crate) fn part_2(input: &Vec) -> usize { + let mut rope = Rope::::new(); + + for head_movement in input { + rope.execute(head_movement); + } + + let result = rope.tail_history.len(); + + println!("Part 2: {result}"); + + result +} + +#[cfg(test)] +mod tests { + const SAMPLE_INPUT: &str = include_str!("sample_input.txt"); + + #[test] + fn test_with_solution() { + assert_eq!(super::part_2(&crate::parse_input(crate::INPUT)), 2458); + } + + #[test] + fn test_with_sample_solution() { + assert_eq!(super::part_2(&crate::parse_input(SAMPLE_INPUT)), 1); + } +} diff --git a/rust/src/day09/sample_input.txt b/rust/src/day09/sample_input.txt new file mode 100644 index 0000000..cbea2b3 --- /dev/null +++ b/rust/src/day09/sample_input.txt @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 \ No newline at end of file