From 33a7618e7d02331edccec4841b08d6efe8272dff Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 9 Dec 2022 03:27:01 -0500 Subject: day 9 --- data/2022/9.txt | 2000 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/2022/9/mod.rs | 240 +++++++ src/2022/mod.rs | 4 + src/grid.rs | 4 +- 4 files changed, 2246 insertions(+), 2 deletions(-) create mode 100644 data/2022/9.txt create mode 100644 src/2022/9/mod.rs diff --git a/data/2022/9.txt b/data/2022/9.txt new file mode 100644 index 0000000..b249a09 --- /dev/null +++ b/data/2022/9.txt @@ -0,0 +1,2000 @@ +D 1 +U 2 +R 2 +U 1 +R 1 +U 2 +L 2 +D 1 +L 2 +R 1 +L 1 +R 1 +U 2 +D 2 +L 2 +R 2 +L 2 +R 1 +L 1 +D 1 +U 1 +R 1 +U 2 +D 1 +U 1 +D 1 +R 2 +D 1 +U 1 +R 1 +L 2 +R 2 +U 2 +R 2 +L 2 +R 2 +U 2 +D 2 +R 1 +U 2 +D 2 +U 2 +D 1 +L 1 +D 1 +L 1 +R 2 +D 2 +R 2 +D 1 +R 2 +L 1 +R 1 +L 2 +D 2 +U 1 +D 1 +R 2 +L 2 +D 2 +L 2 +D 2 +L 1 +R 2 +L 1 +D 1 +L 2 +D 1 +U 1 +R 1 +U 1 +R 2 +D 2 +R 1 +U 2 +D 1 +L 2 +D 2 +L 1 +D 1 +L 1 +D 1 +R 1 +L 1 +U 1 +D 2 +U 1 +D 2 +R 1 +D 2 +L 2 +U 1 +L 1 +R 1 +D 1 +U 1 +D 1 +R 1 +U 2 +L 1 +D 1 +U 2 +R 2 +D 2 +R 1 +D 1 +R 1 +L 1 +R 2 +U 1 +D 1 +L 1 +U 3 +L 2 +U 2 +L 2 +D 2 +L 1 +R 3 +D 1 +U 1 +L 3 +D 3 +U 1 +L 2 +U 1 +R 2 +U 3 +D 2 +L 3 +U 2 +R 2 +D 2 +U 1 +R 1 +L 3 +D 2 +L 3 +D 1 +U 3 +R 3 +U 3 +D 3 +U 3 +L 3 +U 1 +D 1 +U 1 +D 3 +R 3 +D 3 +U 3 +R 3 +L 3 +R 2 +U 3 +D 3 +L 1 +R 2 +D 2 +U 1 +R 1 +L 2 +D 3 +R 3 +D 1 +U 1 +D 1 +U 2 +D 1 +R 1 +D 2 +R 2 +L 1 +D 2 +L 1 +R 2 +L 3 +R 3 +L 1 +U 3 +R 3 +U 3 +D 1 +L 3 +R 1 +L 1 +R 2 +L 1 +U 2 +R 1 +D 2 +R 3 +L 3 +R 2 +U 3 +R 3 +L 1 +R 1 +L 1 +U 1 +L 2 +R 2 +L 3 +D 2 +L 2 +R 3 +D 3 +U 1 +L 2 +D 3 +U 3 +D 3 +R 1 +U 1 +L 2 +U 1 +L 1 +R 1 +U 3 +L 2 +R 1 +D 4 +R 3 +D 3 +L 3 +D 4 +R 4 +L 3 +R 2 +D 2 +R 4 +U 2 +D 3 +L 1 +R 2 +U 4 +R 3 +D 2 +U 1 +D 4 +R 1 +D 3 +U 3 +L 2 +R 2 +L 3 +R 3 +L 4 +D 3 +L 2 +U 3 +L 1 +R 2 +D 4 +R 3 +U 3 +L 2 +U 3 +D 2 +L 4 +D 4 +L 4 +U 4 +R 1 +D 1 +R 3 +U 3 +R 3 +D 3 +L 1 +U 1 +R 3 +L 2 +R 2 +D 2 +R 4 +U 4 +L 4 +D 3 +L 2 +R 4 +L 2 +D 1 +L 2 +R 4 +U 2 +L 2 +U 3 +L 4 +R 2 +L 4 +D 2 +L 1 +D 4 +L 3 +U 2 +D 1 +R 4 +U 2 +D 1 +R 4 +D 4 +U 3 +R 3 +U 4 +L 1 +D 3 +U 1 +D 3 +R 2 +U 1 +R 3 +L 4 +R 1 +L 4 +D 3 +R 4 +U 2 +L 1 +D 4 +L 2 +R 4 +L 2 +R 3 +L 3 +U 2 +R 3 +L 2 +R 1 +D 4 +L 3 +D 3 +L 5 +D 1 +R 3 +D 4 +L 4 +R 2 +D 5 +R 2 +L 2 +D 5 +U 2 +D 1 +U 2 +D 3 +L 2 +D 1 +L 3 +U 1 +D 3 +R 2 +U 4 +R 5 +D 5 +U 3 +R 1 +D 5 +U 1 +D 4 +R 1 +U 4 +D 4 +R 4 +U 5 +D 4 +R 1 +L 1 +D 5 +L 1 +D 4 +U 1 +D 2 +U 1 +D 1 +R 1 +D 2 +R 2 +D 1 +L 5 +R 3 +L 4 +D 3 +R 5 +D 4 +U 2 +R 2 +U 2 +D 2 +U 5 +L 4 +D 5 +L 5 +R 3 +D 2 +U 4 +D 2 +L 3 +R 2 +L 1 +U 2 +R 4 +L 5 +R 4 +D 1 +U 5 +D 4 +L 5 +R 2 +U 4 +D 3 +L 3 +D 3 +L 1 +U 5 +L 4 +R 1 +U 5 +D 4 +R 2 +L 1 +D 2 +R 3 +L 2 +R 5 +D 5 +R 2 +L 1 +U 3 +D 2 +L 1 +U 1 +R 4 +U 1 +D 1 +U 1 +R 2 +U 3 +R 4 +L 4 +R 1 +U 3 +R 3 +D 1 +L 3 +R 4 +L 1 +U 5 +D 6 +U 2 +L 4 +D 2 +U 1 +D 4 +R 5 +L 2 +R 6 +L 6 +U 1 +D 4 +L 3 +D 5 +U 4 +L 4 +R 2 +D 2 +L 3 +D 1 +U 6 +L 6 +R 2 +D 2 +U 3 +L 6 +R 1 +U 5 +R 5 +U 5 +D 1 +L 2 +U 1 +R 1 +D 5 +L 6 +R 1 +D 4 +R 3 +L 3 +D 2 +U 5 +D 6 +U 3 +D 6 +U 4 +L 2 +R 1 +U 5 +D 2 +L 1 +D 4 +U 1 +R 2 +L 2 +R 4 +D 1 +L 6 +D 5 +L 6 +R 6 +L 3 +U 5 +R 4 +D 4 +L 3 +D 2 +L 1 +R 4 +U 3 +R 2 +U 2 +R 5 +D 1 +U 5 +D 4 +R 4 +L 5 +D 5 +U 3 +R 1 +U 4 +L 5 +U 1 +D 2 +U 4 +D 4 +L 1 +U 2 +L 3 +U 5 +R 1 +L 5 +U 1 +R 4 +D 2 +L 6 +U 6 +R 6 +U 5 +R 6 +U 6 +L 5 +U 1 +L 5 +D 3 +R 1 +D 4 +L 3 +D 7 +U 1 +D 4 +R 2 +U 4 +D 4 +U 7 +D 3 +L 3 +D 3 +R 4 +D 7 +R 4 +D 5 +U 3 +L 5 +R 5 +D 5 +L 2 +R 3 +L 2 +R 4 +U 2 +L 4 +U 7 +L 2 +U 6 +D 3 +U 6 +R 2 +D 2 +U 6 +L 2 +R 4 +U 5 +D 2 +R 4 +L 2 +D 2 +R 1 +D 3 +R 1 +D 3 +U 4 +D 2 +L 4 +D 1 +L 5 +U 1 +R 2 +D 3 +U 4 +D 4 +L 5 +R 2 +D 2 +U 1 +D 7 +L 7 +R 2 +L 6 +D 4 +R 7 +L 3 +U 2 +D 2 +U 4 +L 5 +D 4 +U 4 +R 5 +L 5 +D 2 +R 5 +L 7 +U 1 +D 7 +L 3 +R 4 +L 5 +D 5 +L 2 +R 5 +L 3 +R 2 +L 4 +R 1 +D 3 +L 5 +R 2 +D 4 +U 3 +R 3 +L 5 +D 3 +R 1 +D 5 +R 5 +L 1 +D 6 +R 5 +D 4 +U 2 +L 4 +U 1 +D 3 +L 2 +D 7 +R 4 +L 1 +U 6 +R 8 +L 2 +U 2 +R 1 +U 7 +D 6 +L 7 +R 3 +U 5 +R 4 +L 8 +D 2 +R 4 +U 8 +L 6 +R 1 +L 7 +D 5 +L 3 +R 6 +U 1 +D 7 +L 2 +U 7 +R 1 +U 6 +L 3 +R 8 +D 5 +L 4 +R 4 +L 6 +D 6 +R 3 +L 2 +U 5 +R 3 +D 1 +R 7 +L 1 +U 8 +D 2 +U 3 +D 1 +L 2 +U 6 +L 1 +U 4 +R 6 +U 7 +R 1 +D 1 +U 8 +R 1 +D 7 +L 1 +U 4 +D 1 +U 2 +R 8 +U 1 +D 6 +R 1 +U 1 +R 5 +L 7 +R 3 +D 3 +U 8 +L 6 +D 7 +U 8 +L 4 +R 1 +L 7 +U 4 +D 3 +L 3 +R 6 +D 3 +U 8 +L 5 +D 8 +L 1 +U 7 +R 6 +L 5 +U 8 +R 2 +L 8 +R 7 +L 8 +U 7 +D 7 +U 3 +D 4 +U 8 +D 5 +U 3 +L 4 +D 4 +U 8 +R 7 +U 7 +L 7 +R 4 +L 1 +D 8 +R 9 +D 4 +R 8 +L 5 +R 9 +U 5 +D 1 +L 5 +D 7 +U 3 +R 5 +U 1 +R 3 +U 2 +D 9 +U 5 +R 3 +U 4 +R 3 +D 4 +U 7 +D 9 +L 7 +D 3 +U 1 +R 3 +U 4 +L 3 +R 8 +L 3 +U 8 +R 6 +L 6 +D 7 +L 7 +D 4 +L 3 +U 5 +L 2 +R 5 +D 3 +U 6 +L 9 +R 9 +D 9 +U 9 +R 4 +D 8 +R 8 +D 5 +L 7 +U 2 +R 4 +L 8 +R 4 +L 2 +R 3 +L 7 +R 1 +U 1 +L 5 +D 5 +R 9 +D 8 +U 7 +L 3 +R 5 +D 1 +U 1 +R 5 +D 6 +U 9 +D 8 +R 4 +D 7 +L 1 +U 5 +D 8 +L 4 +D 4 +L 7 +D 8 +R 5 +U 9 +D 2 +L 1 +R 2 +U 8 +D 4 +L 6 +D 1 +L 5 +D 6 +R 9 +U 1 +L 9 +U 4 +D 6 +R 8 +L 5 +R 1 +L 2 +R 7 +D 8 +L 4 +R 3 +U 2 +L 7 +U 2 +D 1 +R 8 +U 8 +L 1 +R 1 +D 2 +U 3 +L 5 +D 6 +L 3 +U 6 +R 2 +L 5 +U 6 +L 5 +D 3 +L 6 +D 2 +L 4 +U 10 +R 4 +D 7 +U 4 +D 4 +L 5 +U 3 +L 9 +R 7 +D 1 +L 4 +U 4 +D 5 +R 5 +D 4 +U 1 +D 3 +R 1 +L 6 +U 1 +D 1 +L 4 +U 5 +D 10 +R 4 +U 5 +R 1 +U 2 +R 4 +D 6 +L 7 +U 1 +R 2 +D 1 +L 7 +D 4 +U 9 +L 6 +D 8 +R 3 +U 7 +R 8 +U 2 +D 5 +R 3 +U 10 +D 3 +R 3 +U 1 +R 8 +D 10 +R 3 +D 1 +U 10 +L 5 +U 8 +D 6 +L 9 +D 5 +U 1 +R 9 +U 3 +D 3 +R 8 +L 9 +D 8 +U 3 +R 2 +D 3 +L 7 +D 3 +R 10 +L 9 +U 2 +R 8 +U 8 +R 5 +U 3 +L 9 +U 1 +D 7 +L 7 +R 5 +L 8 +U 8 +L 9 +R 10 +U 1 +R 5 +L 5 +D 7 +L 8 +D 5 +U 4 +L 4 +U 6 +D 4 +L 8 +U 8 +L 10 +D 1 +L 2 +D 3 +U 8 +L 7 +R 7 +U 6 +D 4 +U 8 +L 2 +R 6 +L 7 +D 11 +R 4 +D 9 +L 10 +U 3 +L 9 +U 10 +L 11 +U 11 +D 2 +U 4 +D 5 +L 11 +D 4 +L 6 +U 2 +D 8 +R 4 +U 4 +D 5 +U 8 +L 3 +U 2 +R 7 +U 10 +R 5 +L 3 +R 11 +U 2 +D 8 +U 3 +R 10 +U 10 +L 3 +R 7 +L 8 +D 5 +U 9 +D 9 +R 3 +U 4 +L 6 +D 9 +R 10 +L 2 +R 8 +U 11 +L 2 +R 1 +U 11 +R 2 +D 3 +U 9 +R 3 +L 2 +R 1 +L 6 +R 10 +L 2 +U 6 +R 4 +L 9 +U 11 +L 1 +R 11 +U 8 +L 4 +R 11 +L 6 +D 5 +L 11 +U 3 +D 5 +R 5 +U 2 +L 3 +R 4 +L 9 +R 7 +U 11 +R 7 +U 7 +D 10 +R 11 +D 10 +L 3 +D 5 +U 2 +L 1 +U 2 +R 2 +U 8 +R 1 +L 10 +R 10 +U 5 +D 4 +U 4 +R 4 +L 8 +R 6 +U 9 +R 5 +L 3 +U 9 +L 3 +D 4 +R 10 +D 11 +L 12 +R 1 +U 11 +L 10 +R 11 +D 10 +R 10 +L 4 +U 11 +D 2 +R 8 +L 6 +U 7 +D 7 +L 12 +U 1 +L 3 +D 8 +R 6 +L 7 +R 11 +L 2 +R 6 +U 2 +R 2 +L 2 +U 5 +R 12 +U 12 +D 12 +U 1 +D 6 +L 5 +U 3 +D 3 +L 4 +R 10 +L 5 +U 2 +D 8 +R 4 +D 5 +L 7 +U 2 +R 10 +D 12 +R 9 +U 11 +D 10 +R 4 +U 2 +D 1 +U 10 +D 8 +R 2 +L 9 +D 12 +U 12 +D 2 +U 8 +R 5 +L 8 +D 5 +U 9 +D 8 +U 7 +R 3 +L 10 +U 11 +L 5 +U 12 +L 2 +U 9 +D 7 +R 12 +U 9 +R 2 +L 3 +U 10 +D 9 +L 7 +U 5 +R 3 +D 3 +L 11 +D 1 +R 5 +L 1 +U 5 +L 6 +D 8 +L 2 +D 5 +U 8 +D 9 +R 8 +L 7 +D 6 +L 6 +D 1 +U 5 +L 4 +R 6 +U 9 +L 3 +U 3 +D 7 +L 1 +D 4 +L 9 +R 9 +U 6 +D 8 +U 12 +L 5 +D 4 +R 7 +L 2 +D 4 +U 7 +R 7 +U 2 +R 13 +D 5 +L 1 +R 5 +D 6 +U 2 +L 1 +U 5 +D 2 +R 9 +L 8 +U 9 +D 9 +U 12 +R 10 +U 9 +L 13 +R 5 +D 10 +L 9 +U 4 +D 12 +U 12 +R 13 +D 12 +U 7 +R 12 +D 8 +L 8 +U 2 +D 10 +L 2 +D 5 +U 3 +R 11 +D 4 +R 4 +L 1 +R 1 +D 9 +U 6 +R 10 +U 12 +L 10 +R 13 +D 7 +R 12 +L 5 +R 10 +D 4 +R 11 +L 7 +R 7 +U 7 +D 7 +U 11 +L 3 +R 9 +L 12 +D 11 +R 5 +D 5 +R 7 +D 7 +U 3 +L 11 +D 11 +L 10 +U 7 +L 13 +R 6 +L 10 +U 10 +D 10 +L 4 +R 5 +U 5 +D 2 +L 6 +D 8 +U 1 +R 12 +D 11 +U 3 +L 9 +R 10 +U 8 +R 10 +D 2 +R 3 +U 9 +D 7 +L 6 +R 9 +D 2 +U 11 +R 3 +D 1 +R 4 +L 11 +U 13 +R 12 +U 12 +R 8 +L 13 +U 7 +D 10 +R 11 +L 2 +U 9 +L 3 +R 5 +L 4 +R 11 +D 5 +R 1 +L 11 +U 10 +R 4 +L 1 +U 2 +D 8 +L 7 +U 1 +L 4 +D 1 +R 1 +L 11 +U 8 +R 11 +U 4 +R 10 +L 6 +D 7 +U 9 +L 14 +U 1 +R 10 +U 12 +R 1 +L 6 +D 9 +U 10 +L 10 +D 5 +R 14 +U 3 +R 13 +U 3 +L 13 +U 8 +L 10 +U 7 +R 12 +U 11 +R 6 +U 6 +D 6 +R 2 +L 7 +R 8 +U 8 +D 3 +R 8 +L 12 +U 11 +D 9 +U 6 +R 8 +D 8 +U 9 +R 12 +L 11 +U 10 +L 14 +R 9 +D 8 +U 14 +L 9 +D 11 +U 2 +R 2 +U 4 +R 7 +U 11 +L 8 +D 12 +L 11 +U 13 +L 1 +D 8 +U 8 +L 10 +U 12 +R 11 +U 3 +D 12 +L 1 +D 8 +L 4 +D 3 +L 2 +U 8 +D 9 +L 1 +U 9 +D 15 +U 5 +L 9 +D 2 +U 4 +L 2 +U 15 +L 8 +R 2 +U 1 +L 3 +D 10 +L 15 +U 2 +R 14 +D 1 +U 13 +D 4 +R 8 +D 6 +R 5 +D 13 +L 5 +R 6 +U 14 +L 15 +D 15 +U 12 +L 1 +D 3 +L 6 +D 2 +R 4 +D 10 +U 12 +R 13 +L 3 +R 15 +D 13 +U 15 +D 14 +U 8 +D 10 +U 5 +D 11 +R 15 +D 7 +R 1 +D 2 +L 5 +U 11 +L 14 +U 9 +D 13 +R 12 +U 10 +R 11 +D 9 +R 6 +D 7 +L 7 +U 14 +D 12 +L 6 +D 15 +U 11 +R 1 +U 3 +L 11 +R 3 +L 9 +R 9 +L 11 +R 12 +U 6 +R 13 +D 13 +L 9 +U 3 +D 6 +L 4 +D 3 +U 15 +D 13 +U 9 +D 1 +U 13 +D 12 +L 4 +U 6 +R 11 +D 2 +R 7 +U 9 +R 11 +U 3 +L 7 +U 4 +R 2 +D 14 +U 3 +D 14 +R 13 +L 4 +R 1 +U 12 +D 10 +L 8 +D 2 +L 15 +U 1 +D 4 +U 16 +R 15 +D 1 +R 8 +U 14 +L 12 +U 2 +R 1 +D 16 +L 10 +R 11 +D 10 +L 15 +R 7 +U 10 +L 3 +U 11 +D 1 +L 5 +D 3 +U 8 +R 3 +U 5 +R 2 +D 11 +L 2 +D 7 +L 2 +U 3 +L 12 +D 13 +L 12 +U 7 +R 11 +L 4 +R 11 +L 8 +U 16 +L 1 +R 11 +L 4 +U 15 +L 16 +R 15 +U 6 +R 4 +U 3 +D 16 +R 9 +U 8 +R 5 +U 6 +L 2 +R 2 +D 10 +R 7 +D 13 +U 13 +R 14 +D 3 +L 15 +R 3 +D 11 +L 4 +U 12 +D 1 +U 8 +R 8 +L 4 +D 6 +L 15 +U 7 +D 15 +L 11 +U 14 +D 8 +U 15 +L 12 +R 6 +U 13 +R 5 +U 2 +L 1 +R 13 +D 10 +R 7 +L 9 +U 14 +R 1 +D 13 +L 11 +U 9 +L 13 +R 5 +D 14 +R 16 +U 5 +D 9 +R 2 +D 5 +R 8 +L 8 +U 16 +D 12 +R 3 +U 3 +D 5 +U 12 +D 14 +L 9 +U 12 +R 6 +L 9 +U 3 +D 16 +U 15 +R 6 +D 11 +R 10 +D 3 +U 16 +L 11 +R 2 +L 2 +R 9 +D 12 +L 8 +D 8 +R 13 +L 5 +D 17 +L 7 +D 10 +U 13 +L 11 +U 17 +L 13 +R 2 +D 6 +R 14 +D 14 +L 15 +R 8 +D 4 +U 7 +L 6 +R 6 +U 7 +D 12 +R 9 +L 8 +D 15 +L 14 +R 1 +U 8 +L 13 +D 16 +R 2 +U 2 +L 2 +D 13 +U 8 +D 6 +U 10 +L 9 +R 2 +L 7 +U 5 +R 6 +U 12 +D 3 +R 1 +U 4 +R 17 +U 11 +L 3 +U 13 +L 12 +U 6 +R 5 +D 12 +R 4 +U 4 +R 3 +D 11 +U 7 +L 10 +D 12 +U 12 +D 9 +R 4 +L 2 +R 9 +L 13 +D 16 +L 14 +D 5 +L 8 +D 6 +L 13 +U 1 +R 7 +U 5 +R 2 +U 11 +L 10 +D 14 +R 11 +L 5 +D 16 +U 9 +D 3 +U 11 +D 1 +U 5 +D 3 +U 8 +L 1 +D 1 +U 5 +L 17 +D 9 +L 14 +R 8 +D 15 +R 10 +U 4 +R 1 +U 3 +R 5 +L 13 +D 6 +L 15 +U 10 +L 5 +R 14 +L 1 +R 6 +D 10 +L 13 +D 3 +L 1 +U 10 +D 6 +R 16 +D 6 +R 4 +D 9 +U 9 +D 4 +R 1 +D 10 +R 7 +D 14 +R 10 +D 14 +U 14 +D 15 +R 11 +L 16 +D 18 +R 6 +U 8 +D 18 +R 18 +D 14 +U 9 +R 18 +U 14 +L 18 +U 1 +R 14 +D 1 +U 6 +R 3 +L 13 +D 4 +L 9 +D 2 +U 5 +D 6 +U 9 +L 13 +U 12 +R 11 +D 17 +U 17 +L 8 +U 15 +R 16 +L 9 +D 2 +R 16 +D 2 +L 9 +D 9 +R 15 +D 10 +L 12 +R 14 +L 4 +R 17 +D 15 +U 16 +R 7 +D 4 +U 4 +L 7 +D 16 +R 11 +D 2 +U 2 +L 7 +U 15 +L 5 +U 14 +L 7 +U 15 +D 9 +L 14 +D 13 +U 11 +R 10 +U 15 +L 5 +U 16 +D 13 +U 15 +L 18 +R 1 +D 17 +U 18 +R 19 +L 4 +R 15 +U 12 +D 19 +R 5 +D 18 +L 14 +U 5 +L 4 +R 6 +U 15 +L 7 +R 11 +L 15 +U 12 +D 3 +R 14 +U 1 +L 4 +R 3 +U 15 +L 15 +R 6 +L 3 +U 2 +D 6 +L 6 +D 16 +L 19 +U 9 +L 2 +R 13 +U 8 +R 17 +D 17 +L 4 +R 2 +L 7 +R 11 +D 5 +L 14 +D 7 +R 13 +D 2 +L 18 +U 11 +R 2 +D 18 +U 2 +D 6 +L 4 +U 2 +L 15 +R 4 +D 8 +R 1 +U 16 +L 4 +R 5 +U 16 +D 14 +U 2 +D 19 +L 6 +D 14 +U 17 +L 3 +R 11 +L 2 +R 11 +U 11 +D 4 +U 13 +L 6 +U 14 +D 17 +U 15 +D 7 +R 8 +U 3 +R 15 +D 17 +U 16 +R 3 +D 17 +L 9 +U 15 +R 15 +L 11 +R 18 +D 16 +R 17 +D 3 +L 17 +D 4 +L 10 +U 2 +R 2 +D 9 +L 17 +R 19 diff --git a/src/2022/9/mod.rs b/src/2022/9/mod.rs new file mode 100644 index 0000000..b4f5f0a --- /dev/null +++ b/src/2022/9/mod.rs @@ -0,0 +1,240 @@ +#![allow(dead_code)] +#![allow(unused_variables)] + +use crate::prelude::*; + +#[derive(Debug)] +enum Direction { + Up, + Down, + Left, + Right, +} + +impl std::str::FromStr for Direction { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(match s { + "U" => Self::Up, + "D" => Self::Down, + "L" => Self::Left, + "R" => Self::Right, + _ => return Err(()), + }) + } +} + +#[derive(Debug)] +pub struct Move { + dir: Direction, + count: usize, +} + +impl Move { + fn parse(line: &str) -> Self { + let mut parts = line.split_whitespace(); + let dir = parts.next().unwrap().parse().unwrap(); + let count = parts.next().unwrap().parse().unwrap(); + Self { dir, count } + } +} + +pub struct Rope { + knots: Vec<(Row, Col)>, +} + +impl Rope { + pub fn new(len: usize) -> Self { + Self { + knots: vec![Default::default(); len], + } + } + + pub fn at(&self, pos: (Row, Col)) -> Option { + for (i, knot) in self.knots.iter().enumerate() { + if knot == &pos { + return Some(i); + } + } + None + } +} + +pub struct Map { + grid: std::collections::VecDeque>, + size: (Row, Col), + rope: Rope, +} + +impl std::fmt::Debug for Map { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "({}, {})", self.size.0 .0, self.size.1 .0)?; + for row in (0..self.size.0 .0).rev() { + for col in 0..self.size.1 .0 { + write!( + f, + "{}", + if let Some(idx) = self.rope.at((Row(row), Col(col))) { + char::from(b'0' + u8::try_from(idx).unwrap()) + } else if self.grid[row][col] { + '#' + } else { + '.' + } + )?; + } + writeln!(f)?; + } + Ok(()) + } +} + +impl Map { + fn new(len: usize) -> Self { + let mut grid = std::collections::VecDeque::new(); + grid.push_back(std::collections::VecDeque::new()); + grid[0].push_back(true); + Self { + grid, + size: (Row(1), Col(1)), + rope: Rope::new(len), + } + } + + fn mv(&mut self, mv: &Move) { + // println!("{:?}", mv); + for _ in 0..mv.count { + self.step(&mv.dir); + } + } + + fn step(&mut self, dir: &Direction) { + let (Row(row), Col(col)) = self.rope.knots[0]; + match dir { + Direction::Up => { + if row == self.size.0 .0 - 1 { + let mut row_contents = std::collections::VecDeque::new(); + row_contents + .resize_with(self.size.1 .0, Default::default); + self.grid.push_back(row_contents); + self.size.0 = Row(self.size.0 .0 + 1); + } + self.rope.knots[0].0 = Row(self.rope.knots[0].0 .0 + 1); + } + Direction::Down => { + if row == 0 { + let mut row_contents = std::collections::VecDeque::new(); + row_contents + .resize_with(self.size.1 .0, Default::default); + self.grid.push_front(row_contents); + for knot in &mut self.rope.knots { + knot.0 = Row(knot.0 .0 + 1); + } + self.size.0 = Row(self.size.0 .0 + 1); + } + self.rope.knots[0].0 = Row(self.rope.knots[0].0 .0 - 1); + } + Direction::Left => { + if col == 0 { + for i in 0..self.size.0 .0 { + self.grid[i].push_front(Default::default()); + } + for knot in &mut self.rope.knots { + knot.1 = Col(knot.1 .0 + 1); + } + self.size.1 = Col(self.size.1 .0 + 1); + } + self.rope.knots[0].1 = Col(self.rope.knots[0].1 .0 - 1); + } + Direction::Right => { + if col == self.size.1 .0 - 1 { + for i in 0..self.size.0 .0 { + self.grid[i].push_back(Default::default()); + } + self.size.1 = Col(self.size.1 .0 + 1); + } + self.rope.knots[0].1 = Col(self.rope.knots[0].1 .0 + 1); + } + } + + for i in 0..(self.rope.knots.len() - 1) { + if self.rope.knots[i + 1] + .0 + .0 + .abs_diff(self.rope.knots[i].0 .0) + > 1 + || self.rope.knots[i + 1] + .1 + .0 + .abs_diff(self.rope.knots[i].1 .0) + > 1 + { + if self.rope.knots[i + 1].0 .0 < self.rope.knots[i].0 .0 { + self.rope.knots[i + 1].0 .0 += 1; + } + if self.rope.knots[i + 1].0 .0 > self.rope.knots[i].0 .0 { + self.rope.knots[i + 1].0 .0 -= 1; + } + if self.rope.knots[i + 1].1 .0 < self.rope.knots[i].1 .0 { + self.rope.knots[i + 1].1 .0 += 1; + } + if self.rope.knots[i + 1].1 .0 > self.rope.knots[i].1 .0 { + self.rope.knots[i + 1].1 .0 -= 1; + } + } + } + self.grid[self.rope.knots.last().unwrap().0 .0] + [self.rope.knots.last().unwrap().1 .0] = true; + } +} + +pub fn parse(fh: File) -> Result> { + Ok(parse::lines(fh).map(|line| Move::parse(&line))) +} + +pub fn part1(moves: impl Iterator) -> Result { + let mut map = Map::new(2); + for mv in moves { + // println!("{:?}", map); + map.mv(&mv); + } + // println!("{:?}", map); + Ok(map + .grid + .iter() + .flat_map(|row| row.iter().copied()) + .filter(|cell| *cell) + .count() + .try_into() + .unwrap()) +} + +pub fn part2(moves: impl Iterator) -> Result { + let mut map = Map::new(10); + for mv in moves { + // println!("{:?}", map); + map.mv(&mv); + } + // println!("{:?}", map); + Ok(map + .grid + .iter() + .flat_map(|row| row.iter().copied()) + .filter(|cell| *cell) + .count() + .try_into() + .unwrap()) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2022, 9).unwrap()).unwrap()).unwrap(), + 0 + ); + assert_eq!( + part2(parse(parse::data(2022, 9).unwrap()).unwrap()).unwrap(), + 0 + ); +} diff --git a/src/2022/mod.rs b/src/2022/mod.rs index e6faf0c..2be116a 100644 --- a/src/2022/mod.rs +++ b/src/2022/mod.rs @@ -16,6 +16,8 @@ mod day6; mod day7; #[path = "8/mod.rs"] mod day8; +#[path = "9/mod.rs"] +mod day9; // NEXT MOD pub fn run(day: u8, puzzle: u8) -> Result { @@ -37,6 +39,8 @@ pub fn run(day: u8, puzzle: u8) -> Result { (7, 2) => day7::part2(day7::parse(parse::data(2022, 7)?)?), (8, 1) => day8::part1(day8::parse(parse::data(2022, 8)?)?), (8, 2) => day8::part2(day8::parse(parse::data(2022, 8)?)?), + (9, 1) => day9::part1(day9::parse(parse::data(2022, 9)?)?), + (9, 2) => day9::part2(day9::parse(parse::data(2022, 9)?)?), // NEXT PART _ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)), } diff --git a/src/grid.rs b/src/grid.rs index f360932..4720fdb 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -1,6 +1,6 @@ -#[derive(Copy, Clone, Hash, Eq, PartialEq, Debug)] +#[derive(Copy, Clone, Hash, Eq, PartialEq, Debug, Default)] pub struct Row(pub usize); -#[derive(Copy, Clone, Hash, Eq, PartialEq, Debug)] +#[derive(Copy, Clone, Hash, Eq, PartialEq, Debug, Default)] pub struct Col(pub usize); impl std::ops::Add for Row { -- cgit v1.2.3-54-g00ecf