diff options
-rw-r--r-- | 2022/inputs/day_9.txt | 2000 | ||||
-rw-r--r-- | 2022/src/bin/day_9.rs | 134 |
2 files changed, 2134 insertions, 0 deletions
diff --git a/2022/inputs/day_9.txt b/2022/inputs/day_9.txt new file mode 100644 index 0000000..b249a09 --- /dev/null +++ b/2022/inputs/day_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/2022/src/bin/day_9.rs b/2022/src/bin/day_9.rs new file mode 100644 index 0000000..ccbb66a --- /dev/null +++ b/2022/src/bin/day_9.rs @@ -0,0 +1,134 @@ +use nom::{ + branch::alt, + bytes::complete::tag, + character::complete::{i32, line_ending}, + combinator::{map, value}, + multi::separated_list1, + sequence::tuple, + IResult, +}; +use std::{collections::BTreeSet, fs}; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("inputs/day_9.txt")?; + let movements = Movements::parser(&input).unwrap().1; + + let mut game_board_part_1 = GameBoard::new(2); + for instruction in &movements.0 { + game_board_part_1.step(instruction); + } + dbg!(game_board_part_1.tail_visited.len()); + + let mut game_board_part_2 = GameBoard::new(10); + for instruction in &movements.0 { + game_board_part_2.step(instruction); + } + dbg!(game_board_part_2.tail_visited.len()); + + Ok(()) +} + +#[derive(Debug)] +struct Movements(Vec<Instruction>); + +#[derive(Debug)] +struct Instruction { + direction: Direction, + distance: i32, +} + +#[derive(Debug, Clone, Copy)] +enum Direction { + Down, + Up, + Left, + Right, +} + +impl Movements { + fn parser(input: &str) -> IResult<&str, Self> { + map(separated_list1(line_ending, Instruction::parser), Movements)(input) + } +} + +impl Instruction { + fn parser(input: &str) -> IResult<&str, Self> { + map( + tuple((Direction::parser, tag(" "), i32)), + |(direction, _, distance)| Instruction { + direction, + distance, + }, + )(input) + } +} + +impl Direction { + fn parser(input: &str) -> IResult<&str, Self> { + alt(( + value(Direction::Down, tag("D")), + value(Direction::Up, tag("U")), + value(Direction::Left, tag("L")), + value(Direction::Right, tag("R")), + ))(input) + } +} + +#[derive(Debug)] +struct GameBoard { + rope: Vec<Position>, + tail_visited: BTreeSet<Position>, +} + +#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +struct Position { + x: i32, + y: i32, +} + +impl GameBoard { + fn new(length: usize) -> GameBoard { + let mut tail_visited = BTreeSet::new(); + tail_visited.insert(Position::default()); + GameBoard { + rope: vec![Position::default(); length], + tail_visited, + } + } + + fn step(&mut self, instruction: &Instruction) { + for _ in 0..instruction.distance { + match instruction.direction { + Direction::Down => self.rope[0].y -= 1, + Direction::Up => self.rope[0].y += 1, + Direction::Left => self.rope[0].x -= 1, + Direction::Right => self.rope[0].x += 1, + }; + + for tail_i in 1..self.rope.len() { + let head_i = tail_i - 1; + let head = self.rope[head_i].clone(); + let tail = &mut self.rope[tail_i]; + + let tail_must_move = (head.x - tail.x).abs() > 1 || (head.y - tail.y).abs() > 1; + + if tail_must_move { + if head.x > tail.x { + tail.x += 1; + } else if head.x < tail.x { + tail.x -= 1; + } + + if head.y > tail.y { + tail.y += 1; + } else if head.y < tail.y { + tail.y -= 1; + } + } + } + + self.tail_visited + .insert(self.rope[self.rope.len() - 1].clone()); + } + } +} |