From c8ea1f9fa2055e62f5b5649afe1a0c90f6309b2d Mon Sep 17 00:00:00 2001 From: Jur van den Berg Date: Fri, 9 Dec 2022 19:09:51 +0100 Subject: [PATCH] day 9 --- inputs/day09.txt | 2000 ++++++++++++++++++++++++++++++++++++++++++++ src/bin/day09_1.rs | 8 + src/bin/day09_2.rs | 8 + src/day09.rs | 115 +++ src/lib.rs | 1 + 5 files changed, 2132 insertions(+) create mode 100644 inputs/day09.txt create mode 100644 src/bin/day09_1.rs create mode 100644 src/bin/day09_2.rs create mode 100644 src/day09.rs diff --git a/inputs/day09.txt b/inputs/day09.txt new file mode 100644 index 0000000..b87df75 --- /dev/null +++ b/inputs/day09.txt @@ -0,0 +1,2000 @@ +U 1 +D 2 +U 1 +L 1 +R 1 +L 1 +D 1 +L 2 +U 2 +L 2 +D 2 +L 2 +D 2 +L 1 +R 1 +D 1 +U 1 +D 1 +R 1 +U 2 +D 2 +R 2 +L 2 +R 2 +D 2 +L 2 +D 2 +R 1 +L 2 +D 2 +R 2 +D 1 +R 1 +L 1 +D 1 +U 1 +L 2 +D 2 +R 1 +L 2 +R 1 +U 1 +R 1 +L 1 +R 2 +D 1 +U 1 +D 1 +R 1 +U 2 +R 2 +D 1 +R 2 +D 1 +U 1 +D 1 +R 2 +U 2 +D 1 +U 2 +D 1 +L 1 +D 1 +U 2 +R 1 +L 1 +R 1 +D 2 +U 1 +D 2 +L 1 +R 2 +U 2 +R 1 +D 1 +R 1 +U 1 +R 1 +U 2 +R 2 +L 1 +U 1 +D 2 +U 1 +D 2 +L 2 +D 1 +U 2 +L 1 +U 1 +D 1 +U 1 +L 1 +D 2 +L 2 +R 1 +D 1 +L 2 +D 2 +R 2 +L 1 +D 1 +L 2 +U 2 +L 1 +R 2 +U 1 +D 1 +L 1 +U 2 +L 1 +D 1 +U 3 +D 3 +L 3 +U 2 +R 1 +U 2 +R 1 +U 2 +L 2 +U 3 +R 2 +L 1 +U 1 +D 3 +R 3 +U 1 +D 3 +L 2 +R 1 +L 1 +U 3 +R 3 +D 3 +U 2 +L 3 +D 3 +U 1 +L 1 +U 2 +D 1 +L 3 +D 3 +R 3 +U 1 +L 2 +R 1 +L 3 +U 2 +D 2 +R 3 +D 3 +L 1 +R 2 +D 1 +L 3 +U 1 +D 3 +U 3 +D 1 +U 1 +R 1 +U 2 +L 1 +D 3 +R 3 +D 1 +U 2 +D 2 +L 3 +D 3 +U 1 +D 2 +R 2 +L 1 +D 3 +L 1 +U 2 +L 2 +D 1 +L 3 +R 1 +L 1 +R 3 +U 1 +L 3 +R 2 +L 1 +D 1 +R 3 +D 1 +R 1 +D 1 +L 3 +D 1 +U 2 +R 3 +D 1 +U 1 +R 2 +U 1 +R 3 +L 3 +U 3 +D 2 +R 3 +L 1 +D 2 +R 2 +L 2 +U 1 +L 3 +R 2 +L 2 +U 3 +L 1 +D 1 +U 2 +R 1 +U 3 +R 2 +D 3 +L 3 +U 4 +D 4 +R 3 +L 3 +R 3 +U 2 +R 3 +L 4 +R 2 +U 1 +R 3 +U 3 +R 4 +U 2 +D 3 +L 3 +D 4 +U 3 +D 4 +U 3 +D 2 +R 2 +D 1 +R 4 +U 2 +D 4 +L 3 +D 4 +U 1 +L 2 +R 1 +L 3 +R 1 +L 3 +U 3 +D 3 +U 4 +L 2 +D 4 +L 4 +U 4 +L 3 +D 1 +R 2 +U 4 +R 2 +L 1 +R 3 +D 2 +L 3 +U 2 +R 1 +U 1 +D 3 +L 4 +D 3 +L 3 +D 3 +U 4 +D 3 +R 4 +L 1 +U 2 +R 4 +D 2 +U 3 +L 4 +R 2 +L 1 +D 4 +U 3 +R 2 +L 2 +R 4 +L 4 +D 1 +L 3 +D 4 +L 3 +U 2 +R 2 +D 4 +R 2 +U 2 +D 1 +U 4 +D 2 +R 4 +D 1 +U 1 +D 1 +R 1 +L 1 +R 2 +U 4 +R 4 +D 3 +R 4 +L 1 +D 2 +U 1 +L 3 +U 4 +R 3 +D 4 +L 1 +D 1 +L 4 +D 3 +R 1 +D 4 +L 3 +R 2 +D 3 +L 2 +D 4 +U 2 +L 2 +D 4 +L 2 +U 5 +R 3 +D 2 +U 5 +R 3 +L 3 +R 1 +D 4 +R 1 +D 3 +U 3 +R 2 +D 5 +U 4 +L 1 +D 1 +R 5 +D 5 +U 1 +L 3 +D 2 +L 4 +U 3 +L 2 +U 1 +R 1 +U 2 +D 5 +L 1 +R 4 +L 1 +U 3 +L 5 +U 2 +L 1 +R 1 +L 1 +R 1 +U 5 +D 5 +R 2 +D 4 +L 1 +R 4 +L 3 +U 5 +L 4 +U 3 +R 5 +D 1 +L 3 +R 1 +U 5 +R 2 +L 4 +U 1 +L 2 +U 5 +L 3 +U 1 +R 3 +D 4 +U 1 +R 5 +L 5 +R 1 +D 1 +R 5 +U 1 +R 2 +L 5 +R 2 +L 2 +R 1 +U 5 +D 2 +L 2 +R 4 +L 3 +U 5 +R 2 +L 3 +R 2 +D 1 +R 5 +L 4 +D 2 +U 1 +R 4 +D 3 +R 4 +D 2 +R 2 +D 5 +L 3 +D 1 +U 2 +L 1 +U 5 +D 4 +U 2 +R 5 +U 3 +D 4 +R 2 +U 2 +R 4 +D 6 +L 6 +D 1 +U 2 +D 4 +R 3 +D 6 +R 4 +L 6 +R 4 +D 2 +U 4 +D 3 +U 2 +L 4 +R 6 +U 5 +R 3 +U 1 +L 3 +D 2 +R 5 +D 4 +U 6 +D 4 +R 2 +U 6 +D 6 +U 5 +R 1 +U 4 +R 5 +L 6 +U 2 +D 2 +R 5 +U 3 +L 3 +U 2 +D 4 +L 5 +R 2 +D 5 +L 3 +U 4 +D 3 +U 5 +L 2 +U 3 +L 2 +U 3 +L 3 +U 1 +L 2 +U 1 +L 6 +D 1 +R 4 +D 4 +L 4 +U 4 +D 4 +R 2 +D 1 +U 1 +R 4 +D 2 +R 4 +L 6 +R 5 +U 2 +R 2 +U 1 +R 6 +L 1 +U 6 +R 5 +D 4 +L 2 +U 4 +R 3 +D 5 +L 5 +D 2 +R 6 +U 5 +R 3 +D 1 +L 2 +D 1 +R 4 +L 5 +U 6 +R 4 +D 3 +U 3 +R 1 +D 3 +U 2 +L 1 +U 1 +R 5 +L 4 +D 1 +R 2 +U 1 +L 3 +R 5 +D 5 +U 5 +L 1 +U 2 +R 7 +D 5 +L 7 +D 2 +R 7 +L 2 +D 6 +U 1 +L 5 +U 5 +D 2 +R 4 +U 3 +L 7 +R 5 +L 3 +D 6 +U 2 +D 5 +L 3 +R 4 +U 6 +D 5 +L 5 +U 2 +D 5 +R 4 +U 2 +L 2 +D 5 +U 2 +R 5 +L 4 +R 5 +U 6 +D 3 +U 7 +L 6 +D 4 +U 2 +R 7 +L 5 +D 5 +R 6 +L 1 +D 2 +L 2 +R 2 +U 3 +R 7 +D 1 +U 3 +R 2 +U 3 +R 5 +U 3 +L 7 +D 6 +L 7 +D 5 +L 5 +R 5 +U 2 +L 4 +U 7 +L 2 +D 7 +U 5 +L 4 +R 4 +L 2 +U 5 +L 4 +D 5 +R 7 +U 2 +L 1 +D 6 +R 1 +U 6 +D 1 +L 7 +U 3 +D 2 +L 3 +U 4 +R 4 +L 5 +U 7 +L 1 +D 5 +L 7 +D 1 +R 6 +L 1 +R 5 +L 3 +U 5 +D 2 +U 6 +D 4 +U 1 +R 2 +D 8 +R 8 +D 1 +R 4 +D 6 +L 8 +R 5 +D 5 +R 6 +D 5 +U 1 +L 1 +D 2 +L 4 +R 1 +D 1 +R 7 +L 8 +U 1 +D 8 +U 6 +L 7 +R 4 +U 1 +L 2 +U 1 +L 7 +D 2 +R 8 +L 1 +U 8 +R 8 +D 6 +U 2 +L 8 +D 7 +U 4 +R 8 +L 7 +U 6 +D 6 +U 2 +L 4 +D 3 +L 2 +D 3 +R 7 +U 3 +L 3 +U 3 +D 8 +L 2 +D 3 +L 1 +R 2 +U 8 +L 4 +D 7 +L 8 +R 3 +L 7 +U 2 +R 8 +D 3 +R 7 +U 3 +L 8 +U 5 +D 5 +U 5 +D 8 +U 8 +D 2 +L 4 +U 3 +D 2 +R 6 +U 3 +R 2 +U 4 +R 2 +L 6 +U 7 +R 6 +L 5 +D 6 +L 8 +U 5 +R 3 +L 5 +U 7 +D 7 +L 1 +U 6 +R 7 +D 3 +R 2 +L 7 +R 6 +D 7 +U 4 +D 2 +L 2 +U 3 +R 1 +U 5 +R 6 +D 2 +R 8 +U 7 +L 7 +U 8 +L 4 +R 9 +U 7 +D 6 +L 6 +R 4 +D 9 +L 1 +D 5 +U 2 +L 3 +R 9 +D 2 +U 1 +R 4 +L 8 +R 1 +L 1 +U 4 +R 4 +U 4 +R 3 +D 2 +U 5 +R 8 +D 1 +U 5 +L 4 +D 5 +U 3 +L 1 +D 4 +L 3 +U 8 +R 3 +L 3 +R 9 +U 3 +D 1 +R 4 +U 2 +L 8 +R 7 +L 4 +R 4 +L 7 +U 6 +L 2 +U 9 +R 7 +D 6 +U 5 +L 9 +U 7 +L 5 +D 1 +U 8 +R 4 +D 1 +L 8 +D 8 +L 7 +R 1 +L 7 +R 3 +U 2 +R 5 +D 1 +U 9 +R 1 +L 5 +U 5 +R 6 +L 4 +D 3 +R 9 +D 7 +R 3 +D 2 +R 6 +U 2 +D 5 +L 7 +U 1 +D 8 +R 2 +D 3 +R 3 +L 6 +R 2 +L 7 +D 8 +R 6 +D 6 +R 9 +U 6 +R 9 +D 3 +R 8 +U 7 +L 5 +D 2 +R 5 +U 6 +R 7 +D 7 +U 6 +L 2 +U 6 +R 4 +D 2 +L 9 +U 2 +L 9 +U 9 +R 8 +D 1 +U 9 +R 7 +U 5 +L 3 +D 5 +U 9 +L 2 +R 1 +U 3 +D 4 +L 1 +R 10 +D 9 +U 3 +R 6 +L 1 +D 5 +U 1 +D 10 +U 6 +L 3 +U 7 +D 10 +L 2 +U 10 +D 5 +R 1 +L 1 +R 3 +L 7 +D 4 +L 7 +D 10 +R 8 +L 7 +U 2 +R 6 +U 3 +L 6 +D 4 +R 8 +D 3 +R 8 +D 10 +L 3 +D 5 +L 5 +R 10 +U 6 +L 10 +R 1 +L 7 +D 3 +U 2 +D 6 +R 3 +D 6 +L 4 +R 10 +U 8 +D 4 +L 8 +U 7 +D 3 +L 3 +D 2 +R 8 +U 9 +L 1 +U 8 +D 8 +R 4 +U 9 +D 3 +R 10 +U 3 +L 4 +R 5 +U 3 +R 7 +D 9 +R 4 +U 9 +D 5 +R 8 +L 9 +U 1 +L 8 +R 4 +D 1 +L 4 +D 6 +U 5 +L 4 +R 9 +U 2 +D 7 +R 1 +L 1 +R 7 +D 6 +L 10 +R 10 +D 4 +R 11 +L 8 +U 9 +L 6 +R 4 +U 3 +L 1 +D 7 +L 8 +D 6 +L 3 +R 5 +U 1 +D 9 +U 3 +D 4 +U 11 +D 2 +U 1 +L 4 +R 11 +L 9 +R 6 +U 6 +L 4 +U 11 +L 4 +R 5 +L 10 +R 6 +U 8 +R 8 +L 4 +D 11 +L 11 +R 2 +U 9 +R 6 +D 8 +U 6 +L 1 +R 11 +L 1 +R 1 +D 7 +L 2 +U 11 +D 7 +L 9 +R 7 +U 2 +R 5 +D 10 +R 4 +D 4 +U 2 +R 7 +U 9 +L 10 +U 11 +L 3 +R 10 +D 9 +L 6 +U 10 +L 7 +R 11 +U 5 +D 11 +R 8 +D 1 +U 7 +R 2 +U 8 +D 4 +R 6 +D 4 +U 6 +R 6 +L 7 +U 5 +R 4 +U 5 +R 3 +L 2 +R 5 +D 8 +L 11 +U 2 +R 8 +L 4 +U 11 +R 2 +D 8 +L 3 +D 2 +R 10 +L 2 +R 2 +L 8 +D 8 +L 8 +R 1 +L 1 +U 9 +D 7 +U 6 +R 2 +L 9 +U 11 +D 3 +R 10 +U 5 +R 5 +L 4 +R 10 +L 6 +U 10 +R 2 +U 2 +L 7 +R 10 +L 2 +U 3 +L 9 +U 6 +L 12 +R 8 +U 3 +R 10 +U 12 +L 6 +U 11 +R 2 +D 5 +R 12 +D 10 +R 9 +L 5 +R 9 +L 6 +R 3 +U 4 +R 6 +U 8 +L 3 +U 10 +R 5 +L 3 +U 6 +R 4 +U 10 +R 8 +D 8 +R 3 +L 5 +U 4 +D 9 +U 12 +D 10 +L 10 +R 3 +D 4 +R 2 +D 6 +L 2 +R 3 +L 10 +U 3 +D 6 +L 8 +R 9 +D 4 +L 3 +U 10 +L 11 +R 5 +U 11 +R 11 +D 11 +L 6 +R 5 +D 6 +R 4 +U 9 +R 11 +D 2 +U 9 +L 1 +R 12 +D 8 +R 11 +D 4 +R 3 +U 10 +D 5 +U 9 +R 10 +L 4 +R 9 +L 10 +D 7 +R 8 +L 8 +R 11 +L 3 +U 4 +D 10 +R 2 +L 2 +U 1 +L 12 +U 9 +R 2 +D 7 +R 2 +L 6 +D 8 +L 3 +U 7 +R 6 +D 6 +L 6 +R 5 +L 12 +D 13 +U 9 +L 1 +R 11 +D 4 +U 10 +D 7 +L 8 +U 13 +L 12 +R 3 +L 2 +D 1 +U 4 +D 9 +R 9 +L 12 +D 13 +U 9 +R 8 +L 3 +U 2 +L 1 +U 12 +D 12 +U 5 +L 5 +U 10 +R 3 +D 8 +R 10 +L 9 +R 1 +U 4 +D 12 +R 11 +U 8 +L 9 +U 10 +R 8 +U 13 +D 13 +U 10 +D 5 +R 6 +U 11 +R 4 +U 6 +L 2 +U 13 +L 2 +U 8 +R 13 +U 4 +D 5 +U 3 +R 8 +U 8 +L 6 +U 11 +R 10 +U 8 +D 8 +L 10 +D 9 +U 13 +R 12 +L 10 +R 3 +U 3 +D 10 +R 3 +D 3 +L 6 +R 3 +U 5 +L 3 +R 10 +D 6 +L 10 +D 10 +R 13 +D 1 +R 9 +L 7 +D 12 +U 6 +R 4 +L 1 +U 7 +L 8 +U 7 +L 11 +U 11 +D 1 +U 5 +R 2 +D 1 +L 9 +U 13 +R 10 +L 3 +R 9 +D 10 +R 10 +U 2 +L 4 +R 5 +L 12 +R 7 +D 7 +R 9 +D 6 +L 10 +D 12 +R 10 +D 9 +L 13 +R 13 +L 3 +U 6 +D 8 +L 7 +R 4 +U 7 +L 10 +D 8 +R 12 +L 3 +R 6 +L 14 +R 7 +L 4 +U 8 +D 10 +L 9 +D 10 +R 6 +L 5 +R 8 +U 13 +L 2 +R 13 +L 10 +D 12 +U 4 +R 1 +D 1 +R 10 +L 9 +R 12 +U 10 +D 4 +L 3 +R 7 +D 13 +L 11 +D 3 +U 11 +D 12 +U 4 +R 11 +D 9 +R 3 +D 14 +U 3 +L 10 +D 5 +L 14 +R 13 +L 12 +D 14 +R 2 +U 13 +D 10 +L 13 +U 11 +R 9 +D 4 +L 13 +U 13 +R 5 +L 1 +R 14 +D 4 +U 8 +D 2 +R 2 +U 6 +D 10 +L 1 +U 9 +R 7 +D 2 +L 13 +R 8 +L 12 +R 12 +U 8 +L 14 +D 11 +R 6 +L 5 +R 10 +U 5 +D 12 +L 6 +U 13 +R 3 +D 8 +U 11 +L 7 +D 5 +R 12 +D 8 +R 13 +L 9 +U 4 +D 3 +L 3 +D 15 +L 14 +U 2 +L 10 +R 14 +U 1 +D 11 +L 2 +R 11 +L 12 +R 7 +L 4 +U 15 +D 15 +R 9 +L 9 +R 1 +D 11 +L 1 +U 3 +R 12 +D 7 +U 2 +D 6 +R 1 +D 13 +R 3 +U 10 +D 4 +L 6 +U 8 +L 8 +D 7 +L 6 +U 15 +D 7 +U 1 +D 1 +L 14 +D 3 +U 10 +L 2 +U 14 +D 2 +L 5 +R 3 +U 1 +D 13 +U 13 +D 9 +L 12 +R 5 +L 14 +U 3 +D 11 +R 9 +U 8 +D 5 +R 3 +L 13 +U 2 +L 10 +D 3 +U 2 +L 12 +D 13 +R 14 +U 10 +D 8 +L 8 +R 14 +L 6 +D 14 +L 8 +R 15 +D 10 +R 1 +L 2 +D 6 +L 9 +R 1 +L 4 +D 9 +U 8 +L 1 +R 9 +L 1 +D 5 +L 6 +U 9 +L 6 +R 3 +U 5 +R 12 +D 6 +R 8 +D 3 +U 13 +D 2 +U 2 +L 4 +U 11 +R 4 +L 13 +U 6 +L 12 +U 4 +D 6 +U 11 +D 5 +U 8 +L 10 +D 13 +L 5 +U 15 +L 4 +R 12 +D 1 +L 9 +U 8 +L 4 +U 8 +D 10 +U 12 +L 12 +D 5 +R 10 +D 3 +U 1 +L 6 +R 10 +L 5 +D 8 +U 8 +D 8 +R 6 +U 13 +D 8 +L 16 +R 11 +L 14 +D 15 +R 15 +L 8 +D 1 +U 6 +D 15 +R 9 +L 12 +D 13 +U 9 +D 15 +L 6 +R 9 +U 8 +D 15 +U 7 +L 4 +R 9 +D 2 +R 5 +U 6 +D 14 +L 11 +D 9 +R 2 +U 12 +L 2 +R 15 +U 2 +L 15 +R 9 +U 6 +L 2 +D 4 +U 1 +L 13 +D 5 +R 14 +D 1 +R 13 +U 9 +R 5 +L 4 +U 9 +D 6 +U 7 +R 16 +D 11 +U 8 +R 13 +D 7 +L 12 +D 8 +U 15 +D 11 +U 14 +L 14 +U 10 +L 8 +R 16 +L 3 +U 13 +D 5 +L 2 +R 8 +L 10 +D 6 +R 15 +D 11 +U 3 +D 12 +R 12 +L 15 +U 13 +L 14 +D 2 +R 6 +L 5 +R 2 +U 2 +D 11 +U 14 +L 9 +R 14 +D 17 +R 10 +D 1 +U 11 +L 3 +U 1 +D 17 +L 10 +R 6 +L 14 +U 4 +D 2 +U 17 +L 2 +R 10 +D 14 +L 5 +U 7 +D 7 +R 13 +U 9 +D 9 +U 7 +D 17 +U 15 +D 1 +L 4 +D 11 +L 16 +U 8 +L 6 +R 5 +L 9 +D 14 +L 13 +D 11 +R 3 +L 15 +D 9 +L 10 +D 11 +L 11 +U 2 +L 17 +D 10 +R 13 +L 11 +U 16 +L 8 +U 5 +D 7 +U 11 +D 1 +L 17 +U 12 +L 4 +R 12 +U 4 +R 10 +L 4 +U 11 +D 8 +L 5 +D 6 +U 4 +D 16 +U 6 +D 12 +L 3 +U 3 +L 16 +R 2 +U 14 +R 1 +L 14 +U 11 +L 7 +D 11 +R 2 +D 2 +L 6 +U 10 +L 10 +D 15 +R 12 +D 16 +L 3 +U 15 +R 15 +D 17 +U 17 +L 13 +R 5 +D 12 +L 9 +R 10 +D 4 +L 2 +D 14 +U 8 +R 6 +U 5 +D 1 +L 11 +R 12 +L 17 +U 2 +L 17 +D 2 +R 17 +L 17 +U 3 +D 14 +U 8 +L 14 +D 12 +R 17 +L 18 +D 3 +U 10 +L 7 +U 10 +R 5 +L 15 +D 10 +L 3 +R 12 +D 10 +U 6 +L 17 +D 9 +U 18 +R 7 +U 1 +D 1 +L 9 +U 2 +L 5 +U 9 +L 8 +U 17 +D 17 +L 17 +D 15 +R 13 +U 15 +D 8 +R 13 +D 17 +L 18 +R 5 +D 7 +R 6 +D 1 +R 3 +L 10 +U 10 +D 12 +L 8 +R 11 +U 6 +R 5 +L 9 +R 6 +U 15 +D 4 +R 8 +U 1 +R 18 +L 18 +U 10 +R 17 +D 10 +R 10 +U 16 +R 16 +U 5 +R 7 +D 15 +U 15 +R 2 +U 17 +L 14 +R 1 +U 2 +L 10 +R 17 +L 14 +U 13 +D 1 +L 16 +D 4 +U 9 +L 17 +U 9 +D 9 +L 18 +D 9 +U 5 +L 18 +U 6 +L 5 +U 10 +L 18 +D 13 +R 8 +L 17 +U 9 +L 14 +D 12 +U 2 +D 5 +U 2 +D 17 +L 18 +R 8 +L 7 +R 1 +D 13 +R 11 +D 10 +R 18 +D 2 +U 17 +D 17 +L 4 +R 16 +D 16 +L 2 +D 5 +R 4 +U 9 +R 6 +D 7 +L 13 +U 19 +R 7 +U 17 +L 9 +U 6 +D 1 +L 19 +U 7 +R 6 +L 11 +R 12 +D 6 +L 17 +R 18 +D 17 +L 2 +D 8 +U 15 +D 13 +L 10 +D 10 +L 17 +D 4 +L 12 +U 11 +L 3 +D 6 +U 18 +R 18 +U 16 +L 5 +D 9 +R 17 +L 17 +D 16 +R 12 +D 18 +U 14 +R 1 +U 12 +R 4 +L 6 +U 14 +R 18 +D 6 +U 2 +D 13 +U 15 +L 14 +R 3 +D 7 +L 6 +D 15 +U 17 +L 12 +D 2 +L 12 +R 10 +L 16 +D 15 +L 18 +U 9 +L 7 +U 13 +R 11 +U 9 +L 4 +U 12 +R 14 +D 11 +R 8 +U 4 +L 17 +R 14 +D 15 +R 1 +U 5 +R 3 +L 4 +R 9 +U 1 +D 10 +R 3 +U 16 +D 6 +L 1 +U 15 +D 9 +U 10 +L 11 +U 7 +L 5 +D 19 +L 8 +U 10 +L 19 diff --git a/src/bin/day09_1.rs b/src/bin/day09_1.rs new file mode 100644 index 0000000..4c633bc --- /dev/null +++ b/src/bin/day09_1.rs @@ -0,0 +1,8 @@ +use std::fs; + +use aoc2022::day09::process_part_1; + +fn main() { + let file = fs::read_to_string("./inputs/day09.txt").unwrap(); + println!("{}", process_part_1(&file)); +} diff --git a/src/bin/day09_2.rs b/src/bin/day09_2.rs new file mode 100644 index 0000000..a11f298 --- /dev/null +++ b/src/bin/day09_2.rs @@ -0,0 +1,8 @@ +use std::fs; + +use aoc2022::day09::process_part_2; + +fn main() { + let file = fs::read_to_string("./inputs/day09.txt").unwrap(); + println!("{}", process_part_2(&file)); +} diff --git a/src/day09.rs b/src/day09.rs new file mode 100644 index 0000000..cd72e41 --- /dev/null +++ b/src/day09.rs @@ -0,0 +1,115 @@ +use std::collections::BTreeSet; +use std::str::FromStr; + +use nom::bytes::complete::tag; +use nom::character::complete; +use nom::character::complete::{alpha1, newline}; +use nom::combinator::map_res; +use nom::multi::separated_list1; +use nom::IResult; + +pub fn process_part_1(input: &str) -> usize { + let (_, moves) = parse(input).unwrap(); + let visited = simulate_rope(moves, 2); + return visited.len(); +} + +pub fn process_part_2(input: &str) -> usize { + let (_, moves) = parse(input).unwrap(); + let visited = simulate_rope(moves, 10); + return visited.len(); +} + +fn simulate_rope(moves: Vec<(Direction, usize)>, rope_size: usize) -> BTreeSet<(i32, i32)> { + let all_moves = moves + .iter() + .flat_map(|&(dir, count)| itertools::repeat_n(dir, count)); + + let mut knots: Vec<(i32, i32)> = vec![(0, 0); rope_size]; + let mut visited = BTreeSet::new(); + + for dir in all_moves { + match dir { + Direction::Left => knots[0].0 -= 1, + Direction::Right => knots[0].0 += 1, + Direction::Up => knots[0].1 += 1, + Direction::Down => knots[0].1 -= 1, + } + + for i in 1..rope_size { + let dist_h = knots[i - 1].0 - knots[i].0; + let dist_v = knots[i - 1].1 - knots[i].1; + if dist_h.abs() > 1 || dist_v.abs() > 1 { + knots[i].0 += dist_h.signum(); + knots[i].1 += dist_v.signum(); + } + } + + visited.insert(*knots.last().unwrap()); + } + visited +} + +#[derive(Copy, Clone, Debug)] +enum Direction { + Left, + Right, + Up, + Down, +} +impl FromStr for Direction { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "L" => Ok(Direction::Left), + "R" => Ok(Direction::Right), + "U" => Ok(Direction::Up), + "D" => Ok(Direction::Down), + _ => Err("Invalid direction".into()), + } + } +} + +fn parse(input: &str) -> IResult<&str, Vec<(Direction, usize)>> { + separated_list1(newline, parse_line)(input) +} + +fn parse_line(input: &str) -> IResult<&str, (Direction, usize)> { + let (input, direction) = map_res(alpha1, Direction::from_str)(input)?; + let (input, _) = tag(" ")(input)?; + let (input, count) = complete::u32(input)?; + Ok((input, (direction, count as usize))) +} + +#[cfg(test)] +mod tests { + use super::*; + + const INPUT: &str = "R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2"; + const INPUT2: &str = "R 5 +U 8 +L 8 +D 3 +R 17 +D 10 +L 25 +U 20"; + + #[test] + fn day1() { + assert_eq!(process_part_1(INPUT), 13); + } + + #[test] + fn day2() { + assert_eq!(process_part_2(INPUT2), 36); + } +} diff --git a/src/lib.rs b/src/lib.rs index afac4e2..c2c0017 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,3 +9,4 @@ pub mod day05; pub mod day06; pub mod day07; pub mod day08; +pub mod day09;