From ad2c82891331c8f6084718e35fbc1b2414eb0c91 Mon Sep 17 00:00:00 2001 From: Wesley Moore Date: Fri, 9 Dec 2022 17:58:29 +1000 Subject: [PATCH] Day 9 part 1 --- 2022/input/day_9.txt | 2000 ++++++++++++++++++++++++++++++++++++++++++ 2022/src/bin/day9.rs | 105 +++ 2 files changed, 2105 insertions(+) create mode 100644 2022/input/day_9.txt create mode 100644 2022/src/bin/day9.rs diff --git a/2022/input/day_9.txt b/2022/input/day_9.txt new file mode 100644 index 0000000..5a9a18f --- /dev/null +++ b/2022/input/day_9.txt @@ -0,0 +1,2000 @@ +U 1 +L 1 +R 2 +L 1 +D 2 +R 1 +U 2 +R 1 +U 1 +R 2 +D 2 +L 1 +R 1 +D 2 +R 1 +L 1 +R 1 +D 1 +U 1 +R 1 +L 1 +R 2 +U 1 +R 1 +D 2 +L 2 +U 1 +R 1 +D 1 +L 1 +R 1 +L 2 +D 1 +U 1 +D 2 +R 2 +D 2 +R 2 +D 2 +R 2 +U 1 +L 2 +R 2 +D 2 +L 2 +U 2 +R 1 +L 1 +U 1 +R 1 +D 1 +R 1 +L 1 +R 1 +D 2 +L 2 +U 1 +R 1 +L 1 +R 1 +U 2 +D 2 +U 2 +L 1 +U 2 +L 1 +R 2 +U 2 +D 1 +L 1 +R 1 +L 2 +U 1 +D 2 +R 2 +U 2 +R 1 +L 1 +U 2 +R 2 +L 1 +R 2 +D 1 +U 2 +D 2 +R 2 +L 1 +R 1 +U 2 +D 2 +U 2 +D 1 +U 1 +R 2 +D 1 +R 1 +L 1 +D 2 +L 2 +U 2 +R 2 +U 1 +R 2 +U 1 +D 1 +R 2 +U 1 +R 1 +U 2 +R 2 +D 2 +L 2 +D 3 +R 2 +U 2 +R 2 +U 2 +L 3 +U 1 +L 1 +R 3 +D 2 +R 2 +U 1 +L 2 +D 2 +L 3 +U 3 +D 2 +R 3 +U 3 +R 2 +D 2 +U 3 +L 1 +U 2 +R 2 +L 1 +D 3 +U 1 +R 3 +L 2 +D 1 +U 2 +L 3 +R 3 +U 3 +L 1 +D 1 +R 3 +D 3 +R 1 +U 2 +R 3 +L 2 +R 1 +U 2 +L 3 +D 1 +R 3 +U 2 +D 2 +R 2 +D 3 +L 3 +D 1 +L 2 +D 1 +R 2 +L 1 +D 2 +U 1 +D 3 +U 1 +R 1 +U 1 +R 3 +L 3 +U 2 +D 3 +R 3 +U 1 +L 1 +R 1 +U 3 +L 2 +U 2 +D 3 +L 2 +D 1 +R 2 +D 2 +L 1 +R 2 +U 1 +D 3 +R 3 +D 2 +R 3 +L 3 +R 3 +D 1 +U 1 +R 1 +U 2 +D 2 +L 2 +D 3 +R 2 +D 3 +U 2 +L 2 +R 1 +U 3 +L 1 +D 1 +U 1 +D 2 +U 1 +L 3 +R 2 +D 1 +L 3 +U 1 +R 3 +D 2 +U 4 +D 1 +L 4 +R 2 +L 2 +R 2 +U 4 +R 1 +U 3 +L 2 +U 2 +R 3 +L 3 +D 3 +R 4 +D 4 +R 3 +D 1 +L 4 +D 4 +U 3 +D 3 +L 4 +R 4 +L 2 +R 3 +L 4 +D 3 +L 3 +U 1 +R 2 +U 1 +L 3 +U 4 +D 1 +L 2 +U 2 +L 1 +D 1 +R 2 +L 4 +R 3 +U 4 +R 1 +D 1 +R 1 +U 3 +D 4 +R 1 +U 4 +R 2 +D 2 +U 2 +R 2 +U 4 +L 1 +D 3 +L 4 +D 2 +L 2 +D 2 +U 4 +L 4 +R 1 +D 1 +R 3 +D 3 +L 4 +R 3 +D 2 +R 1 +D 1 +R 1 +U 1 +D 1 +L 1 +D 1 +R 2 +L 3 +D 1 +R 1 +L 4 +D 4 +R 4 +L 3 +D 4 +U 2 +L 1 +D 3 +U 2 +D 1 +R 2 +D 2 +L 2 +U 1 +D 4 +R 3 +U 4 +D 1 +R 3 +U 1 +D 1 +U 1 +R 1 +D 1 +R 3 +U 4 +R 4 +U 2 +L 1 +U 1 +L 3 +R 5 +D 2 +U 1 +R 3 +D 3 +R 1 +D 1 +L 5 +R 1 +D 1 +R 2 +U 3 +R 2 +L 4 +U 3 +D 4 +U 1 +R 3 +D 1 +R 2 +L 3 +R 3 +U 2 +L 5 +U 3 +R 4 +D 4 +R 2 +D 3 +R 2 +U 4 +L 5 +R 2 +L 3 +U 4 +L 5 +R 3 +D 3 +U 4 +R 2 +U 5 +R 2 +U 5 +D 1 +L 2 +D 2 +U 3 +R 3 +L 3 +U 3 +D 5 +R 4 +D 4 +L 4 +D 5 +R 1 +U 4 +L 2 +R 1 +D 3 +L 2 +R 2 +L 3 +R 2 +L 2 +D 3 +U 5 +D 5 +L 3 +R 5 +U 3 +L 3 +D 5 +L 4 +D 1 +L 2 +D 4 +U 4 +D 1 +R 1 +L 4 +R 3 +U 2 +L 3 +U 4 +D 4 +R 2 +D 4 +U 2 +D 4 +U 2 +L 4 +D 5 +L 4 +R 1 +L 2 +R 3 +D 2 +R 5 +L 1 +U 5 +R 1 +D 5 +L 1 +D 2 +U 5 +D 2 +U 1 +D 6 +U 2 +L 5 +D 2 +R 1 +D 1 +R 1 +D 5 +U 1 +D 5 +R 4 +L 3 +R 4 +U 1 +D 5 +U 5 +L 4 +U 5 +L 4 +U 5 +R 2 +L 6 +D 4 +L 1 +U 1 +R 6 +D 4 +L 1 +D 2 +R 2 +U 5 +R 5 +U 4 +L 5 +R 4 +D 4 +U 4 +D 1 +R 2 +L 5 +U 3 +R 1 +L 3 +U 6 +R 5 +L 2 +D 4 +R 4 +U 5 +R 2 +U 6 +L 4 +U 6 +R 2 +L 6 +D 5 +R 6 +U 1 +L 3 +U 4 +R 2 +L 5 +D 4 +L 6 +U 1 +D 1 +R 2 +D 5 +L 1 +R 5 +L 3 +U 5 +D 4 +U 5 +D 4 +U 2 +R 4 +L 3 +D 4 +L 5 +R 6 +U 6 +D 5 +U 2 +R 4 +D 5 +L 5 +R 3 +L 3 +D 3 +U 6 +L 1 +D 3 +R 2 +L 3 +R 2 +L 6 +D 1 +L 6 +D 4 +L 6 +R 4 +D 5 +L 3 +U 6 +R 5 +U 4 +D 1 +L 5 +U 1 +D 2 +U 2 +D 5 +R 7 +L 3 +U 5 +R 4 +L 5 +U 1 +R 2 +D 6 +L 6 +D 2 +L 1 +D 6 +U 2 +D 2 +U 2 +D 6 +L 1 +R 6 +U 7 +D 2 +L 3 +R 3 +U 6 +D 3 +R 4 +U 3 +L 7 +D 3 +U 6 +D 2 +U 1 +R 4 +L 1 +R 3 +U 5 +D 6 +R 2 +L 4 +D 5 +R 6 +L 5 +D 1 +R 3 +D 2 +L 7 +U 1 +R 5 +D 6 +U 6 +D 4 +U 6 +D 2 +L 2 +U 7 +D 1 +R 3 +U 3 +R 1 +L 6 +D 7 +L 4 +R 1 +D 7 +L 2 +U 6 +D 2 +R 6 +D 7 +U 7 +R 5 +L 1 +U 3 +R 5 +D 4 +U 2 +D 2 +L 6 +D 2 +U 7 +R 4 +L 7 +U 4 +D 6 +U 2 +D 6 +L 3 +U 5 +R 5 +D 4 +R 1 +D 6 +U 6 +R 3 +L 2 +U 1 +R 7 +D 4 +L 2 +D 4 +L 5 +U 3 +R 6 +L 3 +D 7 +R 7 +L 1 +U 4 +L 6 +R 7 +U 3 +R 1 +D 8 +L 3 +D 3 +U 3 +R 2 +L 6 +U 4 +L 2 +D 7 +L 5 +D 1 +R 3 +U 2 +L 6 +R 2 +U 1 +D 6 +U 4 +D 1 +U 8 +D 7 +R 3 +L 3 +R 1 +D 1 +R 5 +L 5 +R 6 +U 4 +R 4 +U 3 +R 4 +L 6 +R 4 +U 6 +L 5 +U 8 +L 1 +D 1 +L 4 +U 8 +R 2 +U 7 +L 4 +U 7 +L 7 +D 5 +U 1 +R 7 +U 7 +D 6 +R 5 +U 5 +D 2 +R 8 +L 1 +D 3 +L 5 +D 5 +R 1 +U 1 +R 4 +D 3 +R 1 +U 4 +R 8 +D 3 +L 4 +R 7 +L 4 +R 7 +L 7 +R 1 +L 1 +D 2 +L 6 +R 7 +D 5 +U 7 +L 8 +U 1 +L 8 +U 2 +R 6 +L 4 +U 1 +R 1 +U 3 +L 6 +D 7 +L 3 +D 2 +R 4 +U 5 +D 1 +U 2 +D 6 +L 6 +U 4 +D 1 +L 2 +R 4 +U 2 +L 1 +R 5 +L 3 +R 5 +U 7 +R 4 +L 4 +R 2 +D 4 +L 1 +R 2 +D 1 +L 2 +R 2 +U 2 +R 5 +L 7 +U 3 +R 1 +D 5 +U 7 +D 8 +R 7 +D 5 +U 2 +L 5 +D 4 +L 2 +D 8 +U 7 +D 3 +U 4 +L 9 +D 2 +U 7 +R 7 +D 9 +U 3 +R 2 +L 7 +U 5 +L 9 +D 5 +R 6 +D 5 +R 1 +D 1 +R 5 +D 3 +U 2 +R 5 +D 8 +U 4 +R 9 +U 5 +L 2 +U 2 +R 5 +D 9 +U 2 +D 3 +R 4 +D 5 +U 7 +L 2 +U 8 +R 7 +L 1 +U 4 +D 6 +R 8 +U 3 +D 4 +U 1 +R 5 +U 8 +D 9 +U 5 +D 9 +R 7 +D 3 +L 1 +D 4 +R 8 +D 8 +U 5 +D 7 +L 5 +U 1 +D 6 +L 7 +D 1 +R 1 +U 2 +L 3 +R 4 +L 1 +D 7 +L 3 +U 9 +R 1 +U 9 +L 7 +R 1 +U 5 +L 4 +U 8 +D 9 +U 3 +D 9 +R 5 +U 8 +L 9 +U 9 +D 7 +R 7 +L 2 +U 9 +R 7 +U 10 +D 7 +L 1 +D 2 +R 4 +D 9 +L 4 +D 7 +R 9 +U 1 +D 4 +U 8 +L 9 +R 9 +D 3 +R 2 +D 7 +U 2 +D 7 +U 1 +R 3 +D 1 +U 10 +D 5 +U 6 +D 1 +R 5 +D 6 +U 1 +R 6 +U 2 +D 5 +U 8 +L 9 +D 1 +U 9 +D 6 +L 10 +R 4 +D 1 +L 6 +R 1 +L 3 +D 4 +R 9 +D 7 +R 4 +D 8 +R 8 +L 5 +U 7 +R 3 +U 5 +D 4 +L 5 +D 7 +L 10 +U 3 +D 9 +R 7 +U 4 +D 3 +R 7 +U 5 +D 10 +R 1 +L 7 +U 7 +R 5 +U 4 +L 7 +D 6 +R 1 +D 1 +R 4 +L 3 +R 4 +D 3 +L 7 +D 7 +L 6 +R 4 +L 1 +D 2 +U 4 +D 8 +L 8 +R 1 +U 4 +D 1 +U 2 +L 1 +R 4 +U 7 +D 9 +U 4 +D 10 +U 5 +R 3 +D 6 +U 7 +D 6 +L 7 +R 7 +L 7 +R 6 +D 4 +U 4 +L 7 +U 9 +L 6 +D 2 +L 2 +U 10 +L 4 +U 3 +D 3 +L 5 +U 10 +D 10 +R 8 +D 2 +L 6 +D 9 +R 7 +L 8 +R 3 +U 1 +D 4 +U 2 +R 4 +U 5 +D 8 +U 6 +L 4 +U 9 +R 5 +U 8 +L 11 +D 11 +U 6 +D 4 +U 3 +R 7 +L 8 +R 5 +D 5 +U 5 +R 1 +U 10 +L 4 +D 6 +U 11 +R 3 +D 10 +U 10 +L 7 +R 11 +U 9 +L 10 +U 10 +L 11 +D 2 +L 9 +D 3 +L 11 +D 2 +U 1 +D 5 +L 6 +U 3 +D 10 +R 8 +U 10 +R 9 +L 1 +D 6 +U 6 +D 6 +L 8 +R 3 +U 1 +D 2 +L 6 +R 10 +U 7 +D 2 +L 5 +D 10 +U 5 +D 9 +R 4 +L 9 +D 6 +U 9 +R 5 +L 9 +U 1 +D 2 +R 2 +L 5 +R 4 +D 8 +U 8 +D 11 +L 4 +D 3 +U 1 +L 9 +R 8 +L 10 +R 8 +L 10 +U 10 +D 5 +R 11 +U 2 +R 8 +U 1 +L 6 +U 5 +D 2 +U 2 +R 3 +L 4 +R 1 +D 6 +L 6 +U 5 +R 1 +L 6 +D 1 +R 5 +L 2 +R 11 +D 5 +L 6 +R 1 +D 11 +U 9 +D 12 +U 8 +R 7 +L 6 +R 9 +U 7 +D 2 +R 5 +D 12 +L 10 +D 7 +L 5 +U 7 +D 9 +R 7 +U 8 +D 3 +U 8 +D 5 +U 1 +L 10 +U 7 +L 2 +R 5 +L 2 +U 1 +L 8 +R 2 +D 8 +R 9 +D 9 +R 11 +D 4 +R 3 +U 2 +D 9 +R 12 +U 11 +D 8 +R 6 +D 9 +U 3 +L 5 +R 1 +U 4 +R 4 +U 10 +R 11 +U 5 +R 9 +U 1 +R 5 +D 3 +R 8 +U 3 +R 6 +U 4 +R 3 +D 2 +L 2 +U 7 +L 2 +U 12 +D 10 +L 7 +U 6 +R 7 +U 1 +L 11 +U 12 +R 12 +L 12 +D 10 +R 9 +U 12 +L 6 +U 2 +L 7 +U 11 +R 7 +U 6 +L 3 +U 3 +D 1 +U 11 +R 1 +D 4 +R 10 +L 10 +R 6 +D 11 +R 1 +D 5 +L 1 +R 1 +L 4 +R 7 +U 12 +R 6 +L 10 +D 12 +L 4 +R 8 +U 5 +L 7 +R 10 +D 13 +U 7 +D 1 +R 1 +D 9 +R 3 +D 1 +L 4 +D 3 +R 5 +U 9 +R 11 +L 4 +R 1 +D 11 +L 2 +R 4 +D 7 +R 3 +U 2 +D 6 +R 2 +L 13 +R 5 +L 4 +R 4 +U 13 +R 3 +U 4 +R 3 +D 1 +L 3 +U 6 +L 8 +U 5 +R 4 +D 10 +L 3 +U 10 +R 11 +D 11 +U 2 +D 2 +R 4 +U 2 +D 1 +R 10 +U 5 +L 9 +U 11 +R 10 +D 4 +L 1 +U 5 +R 4 +U 6 +R 9 +D 12 +L 10 +R 5 +L 5 +D 9 +U 2 +R 7 +U 2 +R 5 +L 8 +D 5 +R 1 +D 5 +R 8 +U 11 +R 7 +L 13 +U 10 +D 3 +U 1 +D 2 +L 1 +D 12 +L 9 +D 12 +R 5 +U 8 +R 6 +L 6 +R 5 +U 7 +L 10 +D 5 +U 11 +D 4 +U 8 +R 7 +U 8 +R 2 +L 10 +D 5 +L 10 +D 3 +U 13 +D 11 +U 3 +R 10 +U 9 +D 7 +U 6 +R 1 +U 9 +R 11 +D 7 +R 6 +U 9 +R 6 +U 12 +D 6 +R 13 +L 14 +U 10 +R 9 +L 13 +R 7 +D 9 +U 12 +L 8 +D 5 +R 3 +U 5 +R 10 +L 4 +D 5 +R 4 +D 2 +L 12 +R 8 +D 9 +R 5 +D 7 +U 5 +D 11 +L 13 +D 12 +R 2 +U 5 +L 1 +U 2 +L 6 +U 9 +D 10 +L 3 +D 8 +R 12 +U 9 +R 9 +U 9 +R 8 +U 6 +L 10 +U 5 +R 9 +D 2 +U 12 +D 3 +R 12 +L 10 +D 5 +L 7 +D 9 +L 5 +R 7 +D 8 +U 10 +L 11 +R 9 +L 13 +R 8 +U 9 +D 8 +U 9 +R 10 +L 4 +U 1 +D 10 +L 1 +D 4 +L 1 +U 13 +R 8 +L 3 +D 5 +R 5 +U 4 +R 5 +U 6 +L 14 +R 5 +U 8 +L 7 +D 7 +R 4 +U 4 +L 14 +U 7 +R 14 +D 3 +U 10 +L 7 +R 5 +L 5 +R 15 +L 3 +D 15 +L 6 +R 3 +L 10 +U 7 +L 2 +R 7 +L 1 +R 8 +U 12 +D 6 +U 11 +D 12 +U 9 +R 2 +D 14 +L 4 +U 9 +D 15 +R 8 +D 9 +L 9 +D 14 +U 5 +R 14 +D 15 +R 6 +L 3 +U 13 +R 13 +U 5 +D 14 +L 2 +D 12 +U 6 +R 5 +U 5 +L 6 +R 5 +D 12 +U 9 +L 7 +D 15 +R 5 +U 7 +D 1 +R 2 +L 11 +U 8 +R 3 +D 3 +U 6 +D 15 +U 2 +D 11 +R 6 +U 9 +D 7 +U 3 +L 13 +U 3 +L 15 +R 10 +L 6 +D 15 +L 3 +U 5 +R 13 +D 13 +L 5 +R 8 +D 2 +R 8 +L 9 +R 7 +L 5 +U 3 +D 11 +R 13 +U 15 +D 5 +R 4 +U 11 +R 14 +L 1 +U 6 +L 13 +R 14 +L 12 +D 5 +R 3 +D 4 +R 5 +U 8 +R 11 +D 8 +U 5 +R 9 +D 8 +R 4 +U 5 +L 7 +D 6 +U 4 +L 2 +D 15 +U 5 +R 16 +L 4 +R 1 +D 12 +L 2 +R 6 +D 6 +R 14 +U 6 +L 14 +R 12 +D 8 +R 1 +U 2 +R 3 +D 7 +R 4 +L 2 +U 6 +L 1 +U 7 +L 12 +R 11 +D 13 +U 16 +R 15 +D 14 +U 13 +D 15 +R 11 +U 12 +R 5 +D 8 +R 2 +L 14 +R 10 +L 16 +U 10 +D 13 +L 11 +U 10 +R 5 +D 7 +L 15 +D 12 +L 4 +R 16 +U 8 +R 8 +L 7 +U 9 +R 7 +U 16 +R 2 +U 5 +R 5 +D 4 +L 7 +D 5 +L 4 +U 13 +D 9 +R 2 +D 2 +U 5 +L 3 +D 16 +R 13 +L 10 +R 7 +L 9 +R 3 +L 5 +D 10 +L 10 +R 2 +L 13 +R 5 +L 11 +R 16 +U 12 +R 11 +D 12 +R 7 +L 2 +U 12 +D 11 +U 12 +L 1 +R 6 +U 3 +L 3 +D 1 +R 5 +U 6 +L 15 +R 8 +D 5 +L 16 +D 13 +R 15 +D 14 +R 4 +U 15 +R 5 +L 8 +D 12 +U 11 +D 13 +L 9 +D 13 +L 7 +U 9 +R 15 +U 13 +D 16 +R 6 +L 8 +R 7 +U 4 +R 10 +U 7 +D 10 +U 8 +D 7 +L 17 +R 7 +L 8 +D 5 +L 5 +U 15 +D 6 +L 1 +D 2 +R 17 +L 6 +D 15 +R 4 +L 2 +R 10 +D 4 +R 6 +D 11 +U 1 +L 17 +D 11 +U 6 +D 17 +R 15 +L 13 +D 9 +R 12 +U 13 +R 2 +L 12 +D 1 +R 17 +U 13 +D 15 +U 7 +R 8 +D 6 +R 8 +D 16 +U 16 +D 2 +U 1 +R 7 +U 15 +L 7 +R 12 +U 10 +D 4 +R 17 +D 11 +R 12 +D 8 +L 3 +R 3 +D 5 +R 17 +L 15 +U 11 +R 1 +L 4 +R 6 +D 6 +U 2 +L 1 +D 2 +U 1 +D 11 +L 1 +R 11 +D 7 +U 16 +L 14 +U 5 +R 13 +D 9 +U 17 +D 3 +R 12 +U 16 +R 10 +L 17 +D 5 +U 16 +D 12 +L 2 +R 16 +L 17 +U 4 +R 15 +D 4 +L 11 +U 3 +R 17 +D 8 +R 7 +D 15 +R 14 +D 6 +R 5 +L 1 +D 5 +L 11 +D 5 +U 13 +L 13 +U 8 +D 8 +L 13 +D 1 +L 10 +U 14 +R 7 +L 11 +D 4 +R 16 +D 3 +L 9 +R 3 +D 4 +L 4 +U 2 +R 13 +D 18 +U 15 +D 7 +L 18 +U 3 +D 17 +U 13 +R 9 +L 8 +R 9 +U 16 +R 14 +D 17 +L 16 +R 3 +U 4 +D 1 +R 8 +D 14 +L 14 +U 17 +L 16 +R 15 +D 9 +U 13 +R 14 +U 9 +D 13 +R 2 +L 3 +D 8 +U 5 +R 1 +L 5 +R 4 +U 8 +L 7 +U 5 +R 11 +D 17 +L 4 +U 3 +R 1 +U 18 +D 1 +U 6 +R 2 +D 16 +U 15 +D 8 +L 13 +R 2 +U 16 +L 9 +D 1 +U 9 +R 5 +L 16 +D 2 +L 2 +R 8 +D 17 +R 13 +U 5 +R 6 +U 2 +L 12 +R 2 +D 14 +R 14 +L 11 +R 1 +L 9 +D 18 +L 4 +U 4 +D 15 +L 14 +R 15 +U 6 +D 3 +R 15 +L 12 +U 3 +D 12 +U 13 +L 6 +U 17 +D 6 +L 10 +R 16 +L 7 +U 2 +D 1 +R 10 +U 11 +R 1 +U 19 +D 5 +L 11 +D 14 +L 17 +U 16 +L 13 +R 4 +L 16 +D 10 +L 4 +D 9 +R 19 +L 19 +R 12 +L 12 +D 8 +L 6 +D 14 +U 7 +D 13 +U 18 +D 13 +U 6 +D 6 +R 18 +U 18 +D 15 +L 14 +R 7 +D 11 +R 4 +L 14 +R 5 +D 4 +L 12 +D 16 +R 17 +U 15 +L 9 +U 10 +R 7 +D 10 +L 3 +U 15 +L 1 +D 15 +U 1 +D 12 +L 4 +D 10 +U 6 +R 6 +L 11 +D 5 +R 1 +D 11 +U 16 +L 16 +R 19 +U 8 +R 11 +D 17 +L 19 +R 6 +U 7 +R 2 +D 9 +R 11 +D 17 +U 17 +D 4 +R 8 +D 6 +U 10 +R 3 +L 17 +D 5 +R 19 +U 1 +L 5 +U 5 +D 6 +U 6 +L 18 +R 18 +L 4 +R 12 +D 14 +L 17 +R 8 +L 13 +R 6 +L 14 +D 3 +R 13 +L 16 +D 14 +U 6 +D 6 diff --git a/2022/src/bin/day9.rs b/2022/src/bin/day9.rs new file mode 100644 index 0000000..f2d2a78 --- /dev/null +++ b/2022/src/bin/day9.rs @@ -0,0 +1,105 @@ +use std::collections::HashSet; +use std::error::Error; + +type Pos = (i32, i32); + +fn main() -> Result<(), Box> { + let input = std::fs::read_to_string("input/day_9.txt")?; + + part1(&input)?; + part2(&input)?; + + Ok(()) +} + +fn part1(input: &str) -> Result<(), Box> { + let mut tail_visited = HashSet::new(); + let mut head = (0, 0); + let mut tail = (0, 0); + + for line in input.lines() { + execute(line, &mut head, &mut tail, &mut tail_visited)?; + } + + println!("Part 1: tail visited {} positions", tail_visited.len()); + + Ok(()) +} + +fn part2(input: &str) -> Result<(), Box> { + Ok(()) +} + +fn execute( + line: &str, + head: &mut Pos, + tail: &mut Pos, + visited: &mut HashSet, +) -> Result<(), Box> { + // let h = *head; + // let t = *tail; + let instruction = line + .split_once(' ') + .and_then(|(x, count)| count.parse().ok().map(|count: u32| (x, count))); + let (delta, count) = match instruction { + Some(("U", count)) => ((0, 1), count), + Some(("D", count)) => ((0, -1), count), + Some(("L", count)) => ((-1, 0), count), + Some(("R", count)) => ((1, 0), count), + _ => Err(format!("invalid line: '{}'", line))?, + }; + (0..count).for_each(|_| do_move(delta, head, tail, visited)); + // println!("{}: H{:?} T{:?} -> H{:?} T{:?}", line, h, t, head, tail); + Ok(()) +} + +fn do_move(delta: Pos, head: &mut Pos, tail: &mut Pos, visited: &mut HashSet) { + *head = add(*head, delta); + *tail = move_tail(*head, *tail); + visited.insert(*tail); +} + +fn move_tail(head: Pos, tail: Pos) -> Pos { + match sub(head, tail) { + // No movement if tail is within 1 unit of head + (x, y) if x.abs() <= 1 && y.abs() <= 1 => tail, + // Left-right plane + (x, 0) if x.abs() == 2 => add(tail, (one(x), 0)), + // Up-down plane + (0, y) if y.abs() == 2 => add(tail, (0, one(y))), + // Diagonal + (x, y) if x.abs() <= 2 && y.abs() <= 2 => add(tail, (one(x), one(y))), + _ => unreachable!("head is more than 2 units away"), + } +} + +fn add(a: Pos, b: Pos) -> Pos { + (a.0 + b.0, a.1 + b.1) +} + +fn sub(a: Pos, b: Pos) -> Pos { + (a.0 - b.0, a.1 - b.1) +} + +fn one(n: i32) -> i32 { + if n.is_negative() { + -1 + } else { + 1 + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_move_tail() { + assert_eq!(move_tail((0, 0), (-1, -2)), (0, -1)); + assert_eq!(move_tail((0, 0), (-2, -2)), (-1, -1)); + assert_eq!(move_tail((0, 0), (1, 2)), (0, 1)); + assert_eq!(move_tail((0, 0), (2, 2)), (1, 1)); + assert_eq!(move_tail((0, 0), (0, 2)), (0, 1)); + assert_eq!(move_tail((0, 0), (2, 0)), (1, 0)); + } +}