From e1a993e56b6ef91fa128426b74f43f8426920222 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Fri, 9 Dec 2022 21:18:03 +0100 Subject: [PATCH] 2022 - Day 9 --- 2022/input/9/input | 2000 ++++++++++++++++++++++++++++++++++++++++++ 2022/input/9/test-1 | 8 + 2022/input/9/test-2 | 8 + 2022/src/bin/day9.rs | 222 +++++ 4 files changed, 2238 insertions(+) create mode 100644 2022/input/9/input create mode 100644 2022/input/9/test-1 create mode 100644 2022/input/9/test-2 create mode 100644 2022/src/bin/day9.rs diff --git a/2022/input/9/input b/2022/input/9/input new file mode 100644 index 0000000..db7d58e --- /dev/null +++ b/2022/input/9/input @@ -0,0 +1,2000 @@ +D 2 +U 2 +L 2 +R 1 +L 1 +U 1 +L 2 +D 1 +L 2 +D 1 +L 2 +D 2 +L 1 +R 2 +U 1 +R 1 +U 2 +R 1 +U 2 +D 1 +L 2 +U 1 +D 1 +L 1 +D 1 +U 1 +R 2 +D 2 +L 1 +R 1 +L 2 +D 1 +R 2 +D 1 +U 2 +D 2 +R 2 +L 2 +U 2 +R 2 +L 1 +D 1 +R 1 +U 1 +R 2 +L 1 +D 1 +R 1 +L 2 +D 2 +U 1 +L 1 +R 1 +U 1 +L 2 +D 2 +L 2 +U 1 +L 2 +R 1 +L 1 +R 1 +D 1 +R 2 +D 1 +R 1 +D 1 +U 1 +L 1 +R 1 +L 1 +R 1 +D 2 +L 1 +D 2 +R 1 +D 1 +U 2 +R 2 +U 2 +L 1 +U 1 +R 1 +L 2 +D 2 +R 1 +U 1 +L 1 +U 2 +L 1 +D 2 +R 1 +U 1 +R 1 +U 2 +R 1 +U 2 +L 1 +R 1 +U 2 +R 2 +U 1 +L 2 +R 1 +L 2 +U 2 +L 2 +U 2 +R 2 +D 1 +U 2 +L 2 +D 3 +U 1 +L 1 +R 1 +D 3 +U 1 +L 3 +R 1 +U 1 +R 3 +D 2 +U 1 +R 2 +L 2 +U 1 +D 1 +U 1 +D 1 +L 2 +U 2 +R 3 +D 2 +L 2 +D 2 +U 3 +D 3 +U 2 +L 1 +U 2 +R 3 +D 2 +R 2 +D 1 +U 3 +L 3 +D 1 +U 3 +R 3 +D 1 +L 1 +D 3 +U 3 +D 1 +U 2 +R 1 +D 2 +U 3 +D 1 +R 2 +D 3 +L 3 +R 1 +D 3 +L 2 +D 3 +U 3 +R 1 +U 3 +L 2 +U 2 +L 2 +D 3 +L 3 +U 2 +R 2 +L 3 +R 2 +U 3 +R 3 +L 1 +U 3 +D 3 +L 2 +D 2 +U 2 +D 3 +L 3 +D 2 +L 1 +U 3 +D 2 +R 3 +L 3 +R 1 +U 1 +D 1 +R 2 +L 3 +U 2 +D 1 +R 3 +L 1 +R 1 +L 2 +R 1 +U 3 +R 2 +U 1 +L 1 +R 3 +D 3 +U 2 +R 2 +D 1 +R 3 +D 2 +L 3 +R 1 +U 3 +R 2 +U 4 +L 2 +D 1 +U 1 +R 4 +U 2 +R 2 +U 3 +R 1 +L 3 +U 3 +R 3 +U 4 +R 4 +D 1 +U 2 +R 1 +L 1 +R 2 +U 4 +L 1 +U 2 +L 1 +R 3 +L 2 +D 4 +R 4 +D 3 +R 4 +U 1 +D 4 +R 2 +D 1 +R 4 +U 3 +R 4 +L 1 +U 4 +D 2 +L 1 +D 3 +L 1 +R 2 +L 2 +D 4 +U 3 +D 1 +L 3 +D 3 +U 3 +L 4 +R 3 +U 1 +R 2 +D 1 +U 4 +D 4 +R 4 +U 2 +R 4 +L 4 +D 2 +L 4 +D 2 +U 3 +D 2 +U 4 +R 1 +U 1 +L 1 +U 1 +L 1 +D 3 +U 4 +L 3 +U 1 +L 4 +R 4 +L 3 +R 2 +U 2 +L 3 +D 2 +U 1 +D 1 +U 4 +R 2 +L 2 +D 1 +L 4 +D 3 +U 3 +L 2 +U 4 +R 4 +L 2 +R 3 +L 1 +D 4 +U 1 +L 2 +D 4 +L 2 +D 3 +U 4 +R 4 +U 2 +R 2 +U 4 +D 3 +U 3 +L 4 +D 2 +R 1 +U 4 +R 1 +U 1 +D 3 +U 1 +L 5 +U 5 +R 2 +D 3 +U 5 +D 5 +U 1 +D 2 +L 2 +U 5 +L 1 +R 5 +L 1 +D 5 +L 4 +D 4 +R 4 +L 1 +R 1 +U 1 +R 4 +U 2 +R 5 +L 4 +R 3 +U 4 +R 2 +U 4 +L 4 +U 3 +L 3 +U 1 +L 4 +R 1 +U 3 +R 3 +L 5 +U 5 +L 4 +D 1 +L 2 +U 1 +D 2 +L 1 +U 5 +D 4 +U 1 +R 2 +D 2 +U 5 +R 5 +U 1 +L 3 +U 5 +L 4 +R 3 +U 4 +L 2 +R 4 +D 2 +L 2 +R 4 +U 2 +D 4 +R 3 +D 4 +U 1 +L 3 +R 4 +L 3 +U 1 +R 2 +U 3 +L 3 +D 2 +U 4 +R 1 +L 3 +D 4 +L 1 +R 1 +D 5 +R 1 +U 2 +D 1 +U 4 +L 2 +U 2 +R 4 +U 3 +R 3 +D 2 +R 5 +D 2 +U 5 +D 5 +U 2 +D 1 +R 5 +U 3 +L 3 +U 1 +R 5 +L 4 +D 6 +L 1 +U 2 +D 4 +U 6 +D 6 +R 1 +U 3 +L 5 +R 5 +U 2 +R 2 +L 5 +D 4 +L 3 +R 1 +U 4 +D 3 +L 2 +D 5 +L 3 +R 3 +D 2 +L 1 +U 5 +L 5 +D 6 +U 3 +R 5 +L 5 +U 2 +L 3 +U 5 +D 6 +R 4 +L 5 +U 6 +L 2 +R 1 +L 1 +U 5 +D 3 +U 2 +R 1 +U 2 +R 2 +D 5 +R 1 +D 5 +R 5 +U 2 +L 3 +R 1 +U 5 +D 5 +R 2 +L 5 +D 6 +L 1 +U 1 +D 6 +U 4 +D 5 +L 5 +D 3 +L 4 +D 1 +L 4 +D 6 +R 5 +D 6 +U 6 +D 2 +L 3 +D 3 +R 5 +U 6 +D 2 +U 4 +L 1 +U 6 +L 2 +U 4 +D 6 +R 1 +D 1 +U 2 +L 3 +D 3 +R 2 +L 6 +U 3 +D 5 +U 3 +L 4 +U 5 +L 5 +U 6 +L 3 +R 1 +U 3 +R 1 +U 4 +L 4 +D 5 +L 6 +R 1 +L 3 +D 4 +L 3 +R 1 +L 4 +R 3 +D 3 +L 1 +U 4 +D 2 +U 5 +L 3 +D 6 +U 2 +R 3 +D 5 +L 1 +D 1 +L 3 +U 2 +R 3 +L 3 +U 7 +R 2 +D 1 +L 3 +R 4 +D 2 +R 5 +L 1 +D 5 +L 2 +R 2 +U 7 +L 7 +D 2 +L 7 +D 5 +U 2 +L 2 +U 2 +D 4 +U 1 +D 4 +L 1 +D 2 +R 5 +D 3 +L 2 +U 4 +R 7 +D 4 +R 3 +U 2 +R 4 +L 1 +U 4 +L 4 +U 7 +R 1 +L 6 +D 5 +R 5 +L 1 +R 4 +L 1 +U 3 +L 7 +R 7 +D 4 +L 3 +R 3 +D 1 +U 7 +R 3 +D 2 +U 4 +D 2 +R 3 +D 1 +R 3 +D 3 +U 1 +R 6 +L 2 +D 2 +U 4 +D 5 +L 7 +R 1 +L 7 +U 6 +D 2 +R 3 +D 5 +U 1 +L 7 +D 6 +U 3 +D 6 +L 1 +R 2 +L 6 +D 7 +R 5 +U 1 +L 7 +U 2 +D 2 +L 5 +R 7 +D 4 +U 3 +R 7 +L 4 +U 8 +D 8 +R 2 +U 2 +R 7 +U 1 +D 7 +R 1 +L 7 +R 7 +L 8 +D 3 +R 5 +L 4 +D 3 +L 6 +R 6 +D 6 +L 3 +D 5 +R 1 +U 5 +D 7 +R 8 +U 3 +D 5 +U 8 +L 8 +R 6 +D 8 +U 5 +R 1 +D 1 +R 5 +U 2 +R 8 +D 7 +L 3 +D 3 +U 7 +D 3 +U 7 +R 7 +L 4 +D 7 +U 2 +L 3 +U 7 +L 1 +D 3 +L 1 +R 4 +D 8 +L 5 +U 5 +D 3 +L 5 +D 6 +L 1 +R 5 +U 4 +R 4 +D 1 +R 6 +L 1 +D 7 +R 4 +L 2 +R 3 +U 4 +L 8 +D 1 +R 6 +L 6 +R 8 +D 8 +U 4 +R 1 +D 2 +R 5 +D 1 +U 8 +L 5 +D 5 +U 5 +R 8 +L 6 +R 4 +U 1 +R 5 +U 8 +D 1 +U 1 +D 5 +L 7 +R 6 +L 3 +R 1 +U 2 +L 6 +R 5 +D 4 +R 6 +D 4 +R 2 +L 7 +R 8 +L 6 +D 2 +L 8 +U 4 +R 4 +U 3 +D 8 +U 8 +L 8 +D 5 +R 2 +D 5 +U 7 +L 9 +R 8 +U 9 +R 9 +U 6 +L 6 +D 1 +U 3 +L 1 +D 7 +R 6 +L 6 +D 7 +U 1 +R 9 +D 7 +U 8 +R 6 +U 1 +D 5 +U 5 +D 1 +L 1 +D 9 +U 1 +R 6 +U 9 +R 6 +U 6 +D 7 +R 1 +L 1 +D 8 +L 3 +D 7 +U 8 +L 7 +D 2 +U 6 +D 4 +L 8 +U 3 +D 1 +U 6 +D 3 +R 8 +L 9 +R 3 +L 6 +U 9 +D 9 +L 3 +U 1 +D 2 +R 4 +L 5 +R 2 +U 3 +D 5 +R 5 +L 4 +U 3 +L 7 +U 5 +D 9 +U 6 +R 5 +D 3 +U 8 +L 6 +D 5 +R 9 +U 8 +L 5 +D 1 +R 8 +L 4 +R 2 +L 3 +R 9 +D 9 +R 7 +D 5 +R 6 +U 2 +D 4 +L 8 +D 2 +L 1 +D 2 +U 3 +L 2 +R 3 +D 9 +U 3 +R 4 +D 1 +L 8 +R 3 +U 4 +L 4 +R 3 +L 5 +D 4 +R 2 +D 4 +R 4 +U 4 +R 7 +L 6 +R 9 +D 1 +R 8 +L 5 +U 4 +D 10 +L 6 +D 3 +R 2 +U 1 +D 5 +R 2 +U 6 +L 9 +U 7 +L 10 +U 4 +L 8 +D 3 +U 7 +D 7 +U 9 +L 2 +R 6 +U 4 +R 9 +L 5 +U 3 +L 4 +R 1 +D 8 +U 10 +D 10 +R 3 +U 3 +D 2 +L 5 +U 3 +D 4 +U 1 +R 9 +L 3 +D 8 +L 5 +U 8 +R 3 +U 10 +L 10 +R 4 +D 5 +U 9 +R 8 +L 5 +U 9 +L 6 +U 10 +D 8 +U 2 +L 8 +D 7 +U 2 +D 5 +U 8 +L 2 +D 3 +U 8 +R 8 +D 10 +R 3 +L 3 +U 4 +R 3 +U 4 +L 6 +U 4 +R 3 +D 9 +L 9 +U 5 +D 1 +R 3 +D 2 +L 9 +U 9 +R 9 +U 6 +R 7 +L 8 +U 2 +L 4 +D 10 +L 4 +D 9 +L 9 +R 10 +L 3 +R 7 +U 2 +L 3 +R 1 +D 4 +L 2 +R 10 +D 5 +L 2 +D 2 +L 4 +U 6 +D 9 +R 6 +U 9 +D 4 +L 6 +U 8 +D 1 +R 1 +L 10 +U 4 +R 6 +U 11 +R 8 +U 1 +D 5 +R 7 +D 8 +L 5 +R 6 +U 5 +R 1 +U 7 +L 4 +D 6 +U 8 +R 10 +D 1 +L 8 +R 3 +U 7 +R 2 +U 9 +D 9 +R 9 +L 3 +R 4 +U 10 +L 7 +R 1 +L 5 +D 11 +R 4 +U 10 +R 10 +L 3 +D 2 +L 4 +U 9 +L 1 +D 10 +L 7 +R 11 +D 5 +U 3 +D 10 +U 5 +L 2 +R 9 +D 10 +U 1 +R 10 +U 1 +L 11 +R 10 +L 8 +D 10 +L 5 +R 2 +L 3 +U 4 +L 10 +R 3 +D 5 +R 8 +L 2 +U 1 +D 7 +U 7 +L 1 +U 11 +D 2 +L 2 +D 11 +L 6 +R 9 +U 10 +R 7 +L 11 +R 7 +D 1 +R 3 +U 6 +R 7 +D 8 +U 3 +L 1 +D 11 +U 7 +R 1 +L 7 +R 2 +L 7 +D 3 +U 10 +D 9 +U 10 +R 5 +D 4 +U 7 +L 11 +U 1 +L 12 +R 10 +U 7 +R 3 +L 2 +U 11 +R 6 +U 8 +D 2 +R 2 +L 8 +U 7 +D 10 +U 3 +D 1 +U 8 +R 2 +D 9 +L 8 +R 10 +L 1 +U 8 +R 11 +U 8 +R 12 +D 10 +L 5 +U 6 +L 11 +D 12 +L 5 +U 4 +L 8 +U 11 +D 2 +U 4 +L 6 +R 1 +L 4 +U 2 +L 5 +R 2 +D 7 +L 12 +R 4 +L 1 +D 7 +L 11 +U 3 +D 9 +R 12 +U 10 +D 9 +U 10 +L 6 +R 6 +D 10 +R 10 +D 5 +U 9 +R 2 +D 4 +L 9 +U 2 +R 5 +L 8 +R 1 +D 9 +L 7 +D 11 +R 3 +L 8 +U 3 +D 7 +U 3 +R 8 +U 7 +L 1 +U 10 +D 8 +R 11 +U 10 +D 11 +U 8 +R 12 +U 9 +D 12 +U 4 +D 11 +R 8 +D 1 +L 4 +R 9 +L 7 +U 8 +R 6 +D 5 +R 8 +D 2 +R 6 +L 4 +D 7 +L 3 +U 11 +R 2 +L 10 +D 13 +R 2 +D 10 +U 9 +D 5 +U 5 +D 5 +L 11 +U 3 +R 5 +U 7 +L 6 +D 4 +L 3 +R 2 +D 9 +U 7 +D 9 +U 1 +D 8 +L 11 +D 7 +U 7 +R 3 +L 6 +D 6 +R 5 +L 6 +R 3 +U 10 +L 13 +U 9 +R 11 +L 13 +R 9 +D 3 +U 3 +L 12 +U 4 +L 3 +D 12 +R 13 +D 7 +U 6 +L 11 +U 4 +L 2 +D 7 +L 8 +R 10 +U 13 +R 9 +U 8 +R 11 +U 8 +R 7 +U 11 +L 8 +D 3 +L 4 +U 6 +D 12 +R 13 +U 10 +L 4 +R 12 +U 13 +L 11 +R 10 +L 8 +U 6 +L 1 +D 11 +U 12 +L 8 +U 2 +L 6 +U 2 +L 1 +U 3 +D 5 +U 2 +D 10 +U 11 +L 9 +D 9 +R 7 +L 3 +U 3 +D 2 +U 2 +R 10 +D 1 +R 5 +L 1 +D 3 +R 8 +U 4 +R 1 +D 13 +L 12 +U 1 +D 13 +R 4 +D 3 +R 8 +D 2 +U 3 +D 8 +L 3 +U 9 +R 4 +D 8 +U 9 +D 3 +L 8 +D 11 +L 8 +U 1 +D 13 +U 14 +D 10 +U 9 +R 4 +D 14 +L 10 +D 10 +U 6 +D 7 +R 8 +U 5 +L 8 +R 9 +D 12 +L 9 +D 8 +R 13 +L 7 +U 11 +R 8 +D 5 +U 14 +D 5 +U 9 +L 7 +D 12 +R 2 +L 14 +U 1 +R 9 +U 10 +R 4 +U 4 +R 14 +D 10 +L 3 +R 4 +L 13 +U 3 +R 6 +L 2 +U 6 +R 2 +D 10 +U 4 +L 10 +U 8 +L 6 +D 2 +R 1 +D 5 +U 14 +L 4 +D 5 +L 5 +U 10 +D 5 +R 13 +D 14 +U 14 +R 4 +D 13 +U 10 +R 13 +D 12 +R 10 +L 12 +U 8 +D 10 +U 12 +D 5 +L 11 +D 13 +R 8 +D 10 +R 13 +L 13 +D 1 +U 10 +L 4 +U 14 +D 12 +U 4 +D 5 +R 10 +L 8 +R 13 +D 13 +U 5 +D 4 +L 1 +D 9 +L 14 +U 14 +R 3 +U 6 +R 14 +L 4 +R 7 +D 3 +R 8 +D 5 +L 2 +U 5 +D 8 +U 3 +R 7 +D 13 +U 14 +R 11 +U 6 +L 15 +R 4 +U 12 +R 1 +L 8 +U 15 +R 5 +L 2 +D 1 +R 12 +D 1 +R 12 +D 1 +L 1 +R 9 +U 11 +D 2 +U 12 +D 3 +U 6 +D 12 +U 11 +R 6 +D 11 +L 5 +R 3 +D 1 +U 7 +L 10 +D 4 +L 7 +R 2 +U 8 +D 11 +L 12 +R 6 +L 7 +D 13 +U 11 +R 5 +D 1 +L 11 +D 2 +U 15 +L 11 +R 3 +L 9 +D 12 +U 8 +D 9 +L 14 +D 10 +L 12 +R 13 +D 3 +L 9 +D 13 +R 8 +D 15 +U 14 +R 9 +U 12 +R 2 +D 3 +U 5 +L 3 +R 7 +U 15 +R 10 +L 6 +R 6 +D 12 +R 14 +L 7 +U 8 +L 11 +R 13 +U 8 +L 8 +R 5 +D 3 +U 8 +D 4 +L 1 +D 11 +U 15 +L 14 +R 8 +L 1 +R 13 +L 2 +R 13 +U 9 +D 12 +L 14 +R 13 +L 5 +R 7 +D 13 +U 15 +R 2 +L 12 +D 12 +R 13 +U 2 +D 4 +R 14 +L 1 +U 12 +D 3 +U 6 +R 6 +L 6 +U 9 +L 16 +U 16 +D 8 +R 8 +U 1 +D 14 +R 13 +D 3 +U 14 +R 7 +U 7 +R 7 +D 12 +U 1 +D 2 +U 2 +R 7 +D 11 +U 4 +R 13 +U 2 +L 16 +U 12 +L 15 +D 10 +U 11 +L 1 +D 1 +L 3 +D 15 +L 12 +R 2 +D 12 +U 16 +R 16 +U 11 +D 15 +R 11 +U 13 +L 3 +R 15 +D 16 +R 9 +D 1 +L 3 +U 9 +D 12 +U 11 +L 13 +R 10 +D 4 +U 12 +L 2 +R 8 +L 1 +U 9 +L 1 +D 7 +R 14 +U 12 +L 9 +R 5 +D 7 +R 10 +D 14 +L 2 +U 2 +L 4 +D 15 +U 7 +D 9 +L 4 +R 1 +L 8 +D 14 +U 9 +D 1 +R 15 +U 9 +R 10 +D 11 +L 14 +R 12 +L 12 +U 13 +R 12 +L 1 +R 10 +D 14 +R 3 +U 5 +D 10 +L 13 +U 11 +R 16 +L 14 +U 6 +D 5 +R 16 +D 7 +L 16 +U 12 +R 14 +U 7 +R 6 +U 17 +R 3 +U 15 +R 17 +U 3 +R 4 +U 6 +D 13 +U 7 +R 12 +U 10 +R 7 +L 13 +U 16 +D 13 +U 2 +L 13 +R 2 +D 1 +U 10 +R 6 +D 11 +R 10 +D 6 +R 2 +L 1 +R 1 +L 5 +D 16 +U 1 +L 13 +U 3 +R 9 +L 10 +D 12 +R 9 +U 17 +R 10 +U 1 +D 13 +L 13 +R 6 +L 5 +D 5 +R 15 +D 15 +L 7 +U 11 +D 1 +U 11 +L 17 +R 5 +L 11 +R 15 +U 16 +D 2 +L 5 +D 9 +R 13 +D 14 +U 6 +L 10 +U 15 +D 15 +R 5 +D 4 +L 13 +R 11 +D 15 +U 13 +R 8 +U 6 +R 8 +U 3 +R 12 +U 11 +L 6 +U 9 +D 6 +L 1 +U 4 +L 6 +R 4 +D 2 +L 6 +U 11 +L 1 +U 10 +R 2 +U 6 +R 1 +U 7 +R 16 +L 12 +U 9 +D 9 +U 6 +R 13 +U 8 +L 6 +U 2 +R 17 +L 6 +U 5 +D 14 +R 15 +D 13 +L 5 +U 18 +R 9 +L 10 +R 9 +D 6 +L 8 +U 3 +D 8 +R 17 +L 4 +R 9 +L 13 +U 3 +R 12 +D 4 +R 11 +U 13 +L 15 +R 13 +D 18 +R 8 +L 7 +R 10 +D 11 +U 8 +R 4 +L 7 +U 15 +L 3 +D 15 +R 3 +U 6 +L 17 +D 17 +L 12 +D 16 +R 14 +L 1 +R 7 +D 15 +U 2 +L 5 +U 16 +D 7 +L 11 +U 1 +R 2 +D 4 +L 13 +U 17 +R 5 +D 17 +R 14 +L 1 +D 11 +U 11 +R 8 +U 12 +D 12 +U 17 +R 15 +L 4 +D 7 +U 8 +R 4 +L 14 +U 11 +L 3 +R 1 +L 14 +U 3 +L 3 +D 15 +L 14 +D 7 +R 2 +L 6 +U 6 +R 12 +U 17 +D 1 +R 15 +D 1 +U 14 +D 6 +U 4 +R 4 +L 3 +U 14 +L 1 +R 4 +U 13 +D 18 +L 11 +U 4 +D 9 +R 10 +U 17 +R 8 +D 12 +R 9 +L 5 +D 6 +L 9 +R 9 +L 17 +D 9 +R 2 +L 4 +R 8 +D 8 +R 8 +D 13 +R 12 +L 13 +U 8 +D 8 +L 16 +D 15 +U 11 +L 8 +R 7 +D 2 +R 6 +U 19 +D 4 +U 7 +L 17 +R 9 +U 18 +D 4 +R 19 +L 14 +U 8 +D 19 +L 12 +R 14 +U 13 +D 3 +L 8 +D 4 +R 9 +U 18 +D 1 +U 2 +L 16 +U 2 +D 12 +U 5 +L 4 +D 6 +U 14 +R 1 +L 7 +D 7 +L 19 +D 5 +U 16 +D 15 +R 14 +U 19 +D 19 +L 6 +R 3 +L 14 +R 16 +L 1 +U 4 +R 19 +U 2 +L 3 +D 19 +L 17 +U 13 +D 5 +L 10 +U 18 +R 13 +D 6 +L 17 +D 9 +R 10 +D 8 +R 19 +L 6 +D 7 +R 18 +U 8 +L 6 +U 18 +L 18 +D 16 +R 8 +L 10 +R 6 +D 1 +L 6 +U 8 +L 19 +D 18 +U 3 +D 17 +U 9 +R 13 +D 18 +R 2 +L 10 +D 17 +L 17 +U 8 +L 13 +D 5 +L 1 +U 10 +L 3 +R 3 +D 12 +U 11 +L 15 +D 15 diff --git a/2022/input/9/test-1 b/2022/input/9/test-1 new file mode 100644 index 0000000..9874df2 --- /dev/null +++ b/2022/input/9/test-1 @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/2022/input/9/test-2 b/2022/input/9/test-2 new file mode 100644 index 0000000..60bd43b --- /dev/null +++ b/2022/input/9/test-2 @@ -0,0 +1,8 @@ +R 5 +U 8 +L 8 +D 3 +R 17 +D 10 +L 25 +U 20 diff --git a/2022/src/bin/day9.rs b/2022/src/bin/day9.rs new file mode 100644 index 0000000..8db6234 --- /dev/null +++ b/2022/src/bin/day9.rs @@ -0,0 +1,222 @@ +#![feature(test)] +use core::fmt; +use std::{collections::HashSet, str::FromStr}; + +use anyhow::Result; +use aoc::Solver; + +// -- Runners -- +fn main() -> Result<()> { + Day::solve() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_test1() -> Result<()> { + Day::test(aoc::Part::ONE, "test-1", 13) + } + #[test] + fn part1_solution() -> Result<()> { + Day::test(aoc::Part::ONE, "input", 5695) + } + #[test] + fn part2_test1() -> Result<()> { + Day::test(aoc::Part::TWO, "test-1", 1) + } + #[test] + fn part2_test2() -> Result<()> { + Day::test(aoc::Part::TWO, "test-2", 36) + } + #[test] + fn part2_solution() -> Result<()> { + Day::test(aoc::Part::TWO, "input", 2434) + } + + // Benchmarks + extern crate test; + #[bench] + #[ignore] + fn part1_bench(b: &mut test::Bencher) { + Day::benchmark(aoc::Part::ONE, b) + } + #[bench] + #[ignore] + fn part2_bench(b: &mut test::Bencher) { + Day::benchmark(aoc::Part::TWO, b) + } +} + +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +struct Position { + x: i32, + y: i32, +} + +impl Position { + fn new(x: i32, y: i32) -> Self { + Self { x, y } + } + + /// Calculates the distance apart on either axis and then returns the largest + fn distance(&self, other: &Self) -> i32 { + std::cmp::max((self.x - other.x).abs(), (self.y - other.y).abs()) + } +} + +#[derive(Debug, PartialEq, Copy, Clone)] +enum Direction { + Up, + Right, + Down, + Left, +} + +impl FromStr for Direction { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + match s { + "U" => Ok(Direction::Up), + "R" => Ok(Direction::Right), + "D" => Ok(Direction::Down), + "L" => Ok(Direction::Left), + _ => Err(anyhow::anyhow!("Invalid input")), + } + } +} + +#[derive(Debug)] +struct Rope { + elements: Vec, + visited: HashSet, +} + +impl Rope { + fn new(length: usize) -> Self { + let start = Position::new(0, 0); + let mut visited = HashSet::new(); + visited.insert(start); + + let mut elements = Vec::new(); + for _ in 0..length { + elements.push(start); + } + + Self {elements, visited} + } + + fn step(&mut self, d: Direction) { + // Get a &mut to the first element + let mut head = self.elements.first_mut().unwrap(); + + // Update the first element + match d { + Direction::Up => head.y += 1, + Direction::Right => head.x += 1, + Direction::Down => head.y -= 1, + Direction::Left => head.x -= 1, + } + + // Head is now a copy of the position of the first element + let mut head = *head; + + // Update all remaining elements of the rope + for tail in self.elements.iter_mut().skip(1) { + // Check if tail is touching the head + if tail.distance(&head) > 1 { + if tail.x < head.x { + tail.x += 1; + } else if tail.x > head.x { + tail.x -= 1; + } + + if tail.y < head.y { + tail.y += 1; + } else if tail.y > head.y { + tail.y -= 1; + } + } + + head = *tail; + } + + // Mark the location of the last element as visited + self.visited.insert(*self.elements.last().unwrap()); + + } +} + +impl fmt::Display for Rope { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // @TODO Automatically pick the right value for this + let xmin = -15; + let xmax = 15; + let ymin = -10; + let ymax = 10; + + for y in (ymin..ymax).rev() { + for x in xmin..xmax { + let pos = Position::new(x, y); + let c; + if *self.elements.first().unwrap() == pos { + c = 'H'; + } else if self.elements.contains(&pos) { + let index = self.elements.iter().position(|p| *p == pos).unwrap(); + c = char::from(index as u8 + b'0'); + } else if self.visited.contains(&pos) { + c = '#'; + } else { + c = '.' + } + + write!(f, "{}", c)?; + } + writeln!(f, "")?; + } + + writeln!(f, "") + } +} + +fn parse(input: &str) -> Vec<(Direction, usize)> { + input + .lines() + .map(|line| line.split_once(" ").unwrap()) + .map(|(d, c)| (d.parse().unwrap(), c.parse().unwrap())) + .collect() +} + +fn solution(input: &str, length: usize) -> usize { + let instructions = parse(input); + + let mut rope = Rope::new(length); + + for instruction in instructions { + for _ in 0..instruction.1 { + rope.step(instruction.0); + } + } + + + rope.visited.len() +} + +// -- Solution -- +pub struct Day; +impl aoc::Solver for Day { + type Output = usize; + fn day() -> u8 { + 9 + } + + fn part1(input: &str) -> Self::Output { + solution(input, 2) + } + + fn part2(input: &str) -> Self::Output { + solution(input, 10) + } +}