From 2ce2edca0daf3c69f1c5b1e6d685049ac5c1ca94 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Wed, 14 Dec 2022 16:55:27 -0800 Subject: [PATCH] Day 9, parts 1 + 2! --- 2022/Data/day9-input.txt | 2000 ++++++++++++++++++++++++++++++++++++++ 2022/aoc2022/src/day9.rs | 98 ++ 2022/aoc2022/src/grid.rs | 125 +++ 2022/aoc2022/src/main.rs | 3 + 4 files changed, 2226 insertions(+) create mode 100644 2022/Data/day9-input.txt create mode 100644 2022/aoc2022/src/day9.rs create mode 100644 2022/aoc2022/src/grid.rs diff --git a/2022/Data/day9-input.txt b/2022/Data/day9-input.txt new file mode 100644 index 0000000..bbd1f5c --- /dev/null +++ b/2022/Data/day9-input.txt @@ -0,0 +1,2000 @@ +D 2 +R 1 +L 2 +U 1 +R 2 +L 2 +R 2 +L 1 +R 1 +L 1 +R 2 +L 2 +R 1 +D 2 +U 1 +R 1 +L 2 +U 2 +R 2 +U 2 +R 2 +D 1 +L 1 +U 1 +R 2 +L 1 +D 1 +U 1 +L 1 +U 1 +D 2 +U 1 +R 2 +U 1 +L 1 +D 1 +L 1 +U 1 +R 1 +L 1 +U 2 +L 2 +D 2 +L 2 +R 2 +U 1 +R 1 +U 2 +D 2 +R 2 +L 1 +R 1 +D 1 +U 2 +R 1 +L 1 +U 2 +L 2 +U 1 +L 2 +U 1 +R 1 +L 1 +D 2 +U 2 +R 2 +D 1 +R 1 +U 2 +R 2 +L 2 +U 1 +L 1 +D 2 +R 2 +L 1 +R 1 +D 1 +R 1 +L 1 +D 2 +R 1 +U 1 +L 1 +R 1 +L 1 +D 2 +L 1 +U 1 +R 1 +D 1 +R 1 +D 1 +L 2 +U 1 +D 1 +R 2 +D 2 +R 2 +L 2 +U 2 +L 1 +U 1 +L 1 +R 1 +L 1 +U 2 +L 2 +U 2 +L 1 +U 1 +D 1 +U 3 +R 2 +D 2 +R 1 +U 2 +L 2 +D 1 +U 1 +R 2 +U 3 +D 1 +L 3 +U 2 +D 2 +R 1 +D 1 +L 1 +D 2 +L 2 +U 1 +L 2 +R 3 +U 3 +L 1 +U 3 +L 1 +D 1 +U 3 +R 1 +U 3 +D 2 +L 3 +R 3 +L 2 +U 1 +D 1 +U 1 +L 1 +D 1 +R 2 +U 3 +D 3 +L 3 +R 1 +U 3 +D 1 +U 3 +L 1 +D 3 +R 3 +U 2 +D 1 +R 2 +U 1 +R 3 +U 1 +D 1 +U 1 +L 1 +R 3 +U 2 +D 3 +U 2 +R 2 +L 1 +D 3 +R 3 +L 2 +U 1 +L 2 +U 2 +R 3 +U 3 +D 2 +U 2 +D 3 +R 1 +D 1 +R 3 +D 1 +L 3 +R 2 +D 1 +L 1 +D 1 +L 3 +D 1 +L 3 +D 2 +L 2 +D 2 +R 1 +U 2 +D 1 +U 3 +L 3 +D 1 +R 3 +L 2 +D 2 +U 2 +R 1 +U 2 +R 3 +L 1 +R 3 +L 1 +D 1 +U 2 +L 3 +U 3 +R 2 +L 1 +R 2 +U 4 +R 1 +U 2 +L 2 +D 3 +U 1 +L 2 +U 1 +L 2 +D 3 +U 1 +D 3 +U 1 +D 3 +L 2 +R 1 +L 3 +R 2 +U 2 +L 2 +D 3 +L 2 +U 3 +R 4 +L 3 +D 4 +L 3 +U 2 +L 2 +U 4 +R 2 +D 4 +R 1 +D 4 +U 4 +D 3 +R 2 +D 4 +U 1 +D 4 +U 4 +R 2 +D 3 +R 4 +D 2 +L 2 +R 4 +L 1 +D 2 +U 4 +R 4 +U 4 +L 4 +U 2 +D 3 +L 3 +U 3 +R 1 +L 2 +D 2 +L 3 +R 2 +U 3 +D 4 +L 1 +D 4 +U 3 +L 3 +U 4 +D 1 +U 2 +D 4 +L 4 +D 3 +R 3 +U 1 +L 4 +D 2 +R 4 +U 4 +L 4 +U 3 +L 4 +R 3 +D 3 +L 1 +U 2 +R 1 +U 2 +D 3 +U 4 +L 1 +D 2 +U 1 +D 1 +L 1 +D 1 +U 1 +D 3 +L 1 +D 4 +L 2 +R 3 +L 2 +R 4 +L 4 +U 2 +R 3 +L 2 +D 3 +L 2 +U 2 +R 3 +U 1 +D 3 +U 5 +D 4 +U 3 +L 1 +D 4 +U 3 +D 2 +L 1 +R 3 +U 5 +L 5 +R 1 +D 2 +R 2 +D 3 +L 4 +D 4 +U 2 +D 3 +R 5 +D 3 +U 2 +D 4 +L 1 +D 5 +R 2 +D 1 +U 2 +L 1 +R 5 +U 4 +L 5 +D 2 +U 4 +D 5 +U 4 +L 4 +U 3 +D 2 +L 2 +R 2 +D 1 +U 1 +R 5 +L 3 +R 4 +D 5 +R 5 +D 4 +L 1 +R 2 +U 3 +R 5 +D 5 +R 3 +D 1 +R 3 +D 2 +U 4 +D 1 +U 5 +L 1 +U 3 +L 3 +D 1 +R 3 +U 1 +L 3 +R 2 +L 4 +R 4 +U 1 +D 5 +R 2 +L 5 +R 5 +U 3 +D 1 +R 4 +D 5 +L 5 +R 4 +U 5 +R 4 +D 3 +R 4 +D 2 +R 2 +U 1 +D 2 +L 1 +R 1 +L 3 +D 3 +L 5 +D 4 +R 5 +D 2 +L 5 +U 3 +R 3 +L 5 +U 3 +L 5 +R 5 +L 2 +U 4 +D 2 +R 1 +L 5 +R 1 +U 5 +L 2 +R 2 +U 6 +L 6 +U 2 +R 5 +U 3 +R 2 +D 3 +U 3 +D 1 +L 1 +U 2 +R 5 +L 1 +R 5 +D 6 +R 4 +L 4 +U 1 +R 3 +D 5 +U 3 +L 6 +U 1 +D 6 +R 6 +L 4 +R 4 +U 6 +R 6 +U 3 +R 6 +U 2 +R 6 +U 4 +R 2 +L 5 +U 2 +D 6 +L 4 +U 5 +L 4 +R 6 +L 1 +R 3 +L 3 +D 1 +L 5 +D 1 +L 5 +R 2 +D 3 +L 1 +U 6 +R 6 +U 2 +L 3 +R 4 +U 6 +R 3 +L 4 +U 1 +R 1 +D 1 +L 4 +D 6 +U 1 +R 2 +L 6 +U 3 +R 1 +L 1 +D 3 +R 1 +U 4 +D 2 +L 1 +D 3 +R 2 +D 5 +L 3 +R 6 +U 4 +D 4 +L 4 +U 2 +D 2 +L 4 +D 6 +U 5 +D 5 +R 6 +D 1 +L 4 +R 2 +U 3 +D 5 +R 4 +U 6 +R 4 +U 6 +L 7 +U 6 +D 1 +U 2 +D 6 +R 4 +U 7 +D 2 +L 6 +R 2 +U 7 +R 7 +L 1 +U 2 +L 5 +R 4 +L 7 +R 3 +D 5 +U 7 +D 4 +L 6 +U 5 +L 4 +D 2 +U 2 +D 2 +U 5 +R 7 +D 3 +U 3 +D 6 +U 4 +D 2 +R 6 +L 5 +U 3 +R 1 +D 7 +R 7 +U 4 +R 7 +U 2 +R 1 +L 4 +U 6 +L 1 +D 1 +U 3 +R 7 +U 1 +R 3 +L 3 +R 2 +U 6 +L 6 +D 7 +L 7 +R 3 +U 5 +L 5 +D 4 +L 7 +R 5 +U 7 +D 5 +R 2 +U 2 +L 4 +U 4 +D 5 +L 6 +R 3 +D 4 +U 3 +D 6 +L 5 +U 1 +L 4 +R 2 +L 2 +U 7 +R 4 +U 4 +L 4 +D 1 +U 1 +D 3 +U 3 +D 3 +R 6 +L 5 +R 6 +D 1 +U 4 +L 5 +U 2 +D 6 +L 1 +U 5 +D 5 +R 5 +D 1 +L 4 +D 2 +U 1 +R 3 +U 3 +L 3 +D 5 +U 2 +R 4 +U 1 +D 8 +R 2 +U 4 +L 4 +D 8 +R 2 +U 6 +D 4 +R 5 +U 4 +R 2 +L 2 +U 4 +D 8 +R 7 +L 5 +R 5 +U 6 +R 6 +U 7 +D 2 +U 6 +D 1 +R 5 +U 1 +D 6 +R 7 +L 1 +R 1 +D 1 +R 3 +D 8 +R 1 +U 2 +L 4 +R 4 +L 6 +R 2 +U 7 +R 1 +L 3 +D 1 +L 3 +U 7 +R 8 +L 7 +D 1 +R 1 +L 7 +D 7 +U 5 +D 5 +L 1 +U 7 +D 7 +R 5 +D 5 +U 5 +R 6 +L 8 +R 6 +L 1 +R 3 +D 1 +L 2 +U 7 +R 5 +L 4 +U 3 +L 6 +U 6 +R 6 +L 4 +U 6 +R 5 +U 2 +R 7 +U 8 +R 5 +U 2 +R 4 +L 5 +R 1 +D 4 +L 8 +R 3 +L 2 +U 7 +R 4 +L 6 +R 5 +U 2 +L 3 +D 8 +R 8 +D 7 +L 4 +D 4 +R 6 +L 7 +U 8 +L 5 +R 4 +D 4 +R 8 +D 2 +L 7 +D 6 +U 3 +L 4 +R 6 +U 8 +L 2 +R 6 +L 7 +U 4 +L 3 +D 2 +R 8 +U 3 +D 2 +U 5 +R 7 +D 7 +L 6 +U 8 +D 6 +U 5 +D 6 +U 2 +L 7 +R 4 +L 9 +R 2 +U 3 +R 7 +U 6 +L 3 +U 8 +L 9 +U 5 +R 1 +L 5 +D 5 +R 8 +L 3 +U 1 +L 2 +D 5 +U 1 +D 8 +U 5 +D 7 +L 9 +U 6 +D 4 +R 5 +U 3 +L 1 +D 9 +R 4 +D 7 +U 2 +R 2 +D 4 +L 2 +U 9 +R 7 +U 1 +R 2 +D 7 +R 3 +D 6 +L 7 +U 5 +R 9 +U 4 +L 7 +R 5 +U 7 +L 4 +D 4 +R 9 +D 5 +L 5 +D 1 +R 2 +D 6 +L 8 +U 8 +L 6 +D 7 +L 5 +U 2 +L 3 +D 9 +U 8 +D 3 +L 8 +R 2 +D 7 +R 5 +D 3 +U 1 +R 3 +L 9 +U 3 +D 2 +L 4 +D 7 +R 8 +U 7 +D 5 +U 5 +R 7 +L 8 +D 7 +L 7 +D 8 +U 5 +R 9 +U 10 +R 5 +U 6 +R 7 +D 9 +L 2 +R 1 +D 2 +R 9 +L 4 +U 4 +R 5 +D 9 +U 4 +L 7 +D 9 +L 4 +D 4 +L 10 +U 9 +L 8 +R 10 +U 9 +L 10 +U 2 +R 8 +L 2 +D 6 +R 1 +D 1 +L 5 +U 2 +R 9 +U 2 +R 1 +U 1 +L 6 +D 1 +R 2 +D 10 +L 7 +R 2 +U 7 +D 4 +R 9 +L 7 +D 8 +U 5 +R 10 +L 10 +D 2 +U 2 +R 8 +U 9 +D 1 +R 2 +L 10 +U 5 +R 8 +L 7 +D 1 +R 7 +D 3 +U 8 +L 4 +D 3 +U 4 +R 5 +U 9 +R 10 +U 3 +R 10 +L 6 +R 5 +U 8 +D 9 +R 4 +U 9 +L 1 +U 7 +R 4 +U 2 +L 7 +D 9 +U 8 +L 7 +U 8 +L 3 +R 7 +D 7 +L 7 +D 6 +L 2 +D 5 +U 4 +R 8 +L 6 +R 7 +D 4 +U 10 +L 8 +R 10 +D 2 +R 1 +U 7 +L 5 +R 5 +L 10 +D 5 +R 10 +U 7 +L 7 +R 9 +D 2 +L 8 +R 11 +D 4 +R 6 +L 5 +R 8 +U 1 +L 6 +U 3 +L 1 +D 10 +L 9 +D 3 +U 10 +L 9 +U 8 +D 11 +U 11 +L 1 +R 2 +U 1 +L 3 +U 2 +D 1 +U 4 +R 6 +L 6 +R 7 +L 9 +R 8 +L 4 +D 11 +L 4 +U 10 +D 6 +L 10 +U 2 +R 3 +L 10 +D 5 +L 1 +D 2 +R 6 +U 2 +L 2 +U 9 +R 10 +L 4 +D 2 +R 10 +L 5 +U 2 +L 1 +D 6 +L 4 +U 5 +D 8 +U 11 +D 5 +U 10 +L 8 +R 5 +L 6 +R 5 +L 2 +R 7 +D 4 +L 9 +D 2 +R 11 +D 5 +U 6 +D 2 +L 4 +R 9 +L 2 +D 5 +R 2 +D 9 +R 8 +L 3 +U 8 +R 9 +D 8 +R 4 +D 5 +U 7 +D 7 +R 4 +D 10 +L 1 +D 5 +U 11 +L 11 +U 11 +L 10 +U 9 +L 6 +D 4 +R 6 +D 8 +U 6 +D 11 +R 2 +U 9 +L 6 +U 5 +R 10 +D 8 +L 9 +R 8 +D 6 +L 8 +D 12 +U 2 +R 1 +L 1 +U 1 +R 6 +D 3 +U 6 +D 5 +R 9 +L 12 +U 7 +R 6 +L 9 +U 1 +R 12 +D 11 +R 6 +U 11 +D 4 +L 2 +R 12 +U 5 +R 3 +U 11 +D 6 +U 9 +L 10 +U 2 +L 9 +U 9 +R 6 +L 12 +D 2 +U 10 +R 3 +U 12 +L 12 +R 4 +L 11 +D 1 +L 3 +D 11 +U 5 +D 1 +U 12 +L 12 +U 5 +R 8 +L 1 +D 1 +L 3 +U 1 +R 4 +D 4 +L 6 +R 11 +U 11 +D 2 +U 7 +L 3 +D 3 +R 10 +D 1 +U 8 +D 7 +U 6 +L 10 +R 3 +L 6 +D 10 +L 2 +U 6 +D 8 +R 2 +L 5 +U 1 +D 5 +U 10 +D 5 +L 7 +U 3 +R 6 +D 2 +U 5 +D 10 +L 5 +D 2 +R 9 +L 11 +D 3 +L 6 +R 11 +U 10 +L 12 +D 12 +U 8 +D 5 +R 1 +L 6 +D 11 +U 12 +R 11 +D 12 +L 5 +D 7 +R 10 +U 4 +L 1 +R 3 +U 9 +L 13 +U 8 +R 3 +D 4 +R 8 +D 3 +R 8 +D 13 +U 1 +R 12 +U 12 +L 8 +R 5 +D 1 +U 3 +R 9 +D 6 +U 11 +R 3 +D 12 +R 8 +L 6 +D 8 +U 6 +R 13 +L 10 +U 6 +R 5 +L 11 +U 9 +L 12 +R 8 +L 6 +R 3 +D 12 +L 9 +D 3 +U 5 +L 6 +R 7 +L 13 +D 4 +R 7 +U 5 +D 13 +R 4 +U 11 +D 8 +R 5 +D 5 +U 3 +L 6 +U 4 +R 8 +D 8 +U 9 +L 8 +U 2 +R 7 +L 2 +U 1 +D 12 +R 3 +L 2 +R 8 +D 4 +L 7 +R 8 +D 6 +U 10 +R 7 +L 9 +D 5 +R 12 +U 2 +R 10 +U 4 +L 13 +R 9 +L 12 +U 3 +R 10 +U 3 +L 8 +R 12 +U 8 +R 11 +U 5 +L 3 +D 10 +R 8 +D 4 +R 4 +U 9 +L 13 +U 5 +R 11 +L 12 +U 11 +D 9 +L 5 +R 13 +U 2 +L 1 +U 12 +R 13 +L 1 +R 2 +U 6 +R 12 +D 11 +L 8 +U 13 +L 14 +U 13 +L 3 +U 9 +L 10 +R 11 +D 6 +U 8 +D 11 +U 5 +L 11 +U 8 +L 3 +R 2 +D 11 +L 12 +U 14 +R 3 +D 1 +U 14 +R 7 +D 14 +R 4 +D 5 +L 13 +R 2 +L 13 +U 8 +L 7 +D 14 +L 2 +U 13 +D 2 +L 13 +D 13 +U 5 +L 12 +U 3 +L 6 +D 2 +U 3 +L 9 +D 14 +R 3 +L 1 +R 6 +D 3 +U 6 +D 9 +L 5 +D 11 +L 1 +D 11 +L 9 +D 8 +U 13 +D 4 +R 5 +D 14 +L 10 +U 14 +D 14 +R 1 +L 8 +U 5 +D 11 +U 8 +D 14 +L 4 +D 13 +U 13 +R 6 +U 11 +L 9 +U 6 +D 11 +R 11 +U 11 +D 14 +R 6 +L 13 +U 1 +R 11 +L 9 +R 11 +L 4 +R 14 +L 2 +D 14 +R 3 +U 9 +D 6 +U 12 +R 7 +U 9 +L 4 +D 9 +R 11 +L 9 +R 14 +L 12 +U 1 +L 10 +U 7 +R 13 +D 3 +R 8 +L 4 +R 4 +L 3 +U 1 +R 14 +D 4 +R 9 +U 3 +L 12 +U 11 +R 5 +U 4 +L 11 +D 14 +L 12 +R 7 +L 15 +R 14 +D 12 +U 10 +R 11 +D 9 +U 14 +R 5 +D 13 +L 14 +D 9 +U 1 +R 10 +U 15 +R 12 +D 13 +L 9 +R 9 +U 8 +R 2 +U 3 +R 3 +D 8 +U 14 +R 4 +L 7 +U 11 +D 6 +L 14 +D 6 +R 8 +U 8 +R 5 +L 13 +R 9 +D 6 +R 6 +L 9 +U 2 +R 13 +U 4 +D 9 +U 14 +R 15 +D 2 +R 6 +D 7 +L 3 +U 14 +D 5 +U 13 +R 8 +D 15 +U 3 +R 9 +D 10 +R 11 +U 12 +D 8 +R 3 +L 5 +D 15 +L 1 +U 6 +R 15 +D 1 +R 13 +D 1 +U 2 +R 15 +D 3 +L 4 +U 9 +D 1 +L 13 +R 11 +U 15 +R 5 +U 15 +R 13 +L 5 +U 2 +R 5 +D 11 +U 11 +L 12 +D 15 +R 11 +L 7 +D 2 +L 11 +D 2 +L 7 +U 7 +R 5 +D 8 +R 6 +L 10 +U 5 +R 3 +U 7 +R 1 +U 7 +L 5 +U 11 +R 14 +U 9 +D 8 +R 10 +L 9 +R 11 +U 6 +R 14 +U 16 +D 13 +U 16 +L 1 +D 2 +R 13 +D 11 +U 9 +R 4 +L 11 +U 2 +L 7 +R 2 +U 14 +L 11 +R 10 +L 1 +R 15 +U 9 +L 16 +R 11 +D 15 +U 10 +L 7 +R 9 +L 9 +D 16 +U 7 +D 10 +R 11 +L 3 +R 16 +L 6 +R 7 +L 7 +R 13 +L 5 +R 6 +D 15 +R 11 +D 7 +U 5 +D 11 +U 13 +R 13 +U 12 +D 10 +L 11 +D 10 +R 6 +U 10 +D 9 +U 1 +L 13 +U 13 +L 11 +U 15 +L 7 +R 2 +D 2 +U 9 +D 1 +L 15 +U 6 +D 3 +U 7 +D 6 +L 6 +U 14 +L 3 +U 16 +L 8 +D 8 +R 4 +D 1 +U 13 +L 4 +U 1 +R 15 +U 3 +D 6 +L 4 +D 12 +L 16 +D 7 +U 10 +L 3 +R 6 +L 12 +R 9 +D 1 +U 7 +L 14 +D 5 +U 15 +D 14 +L 5 +R 6 +D 4 +U 10 +L 17 +R 9 +D 1 +R 12 +U 17 +R 14 +U 4 +R 14 +U 2 +D 13 +R 6 +L 12 +D 10 +L 9 +D 17 +R 14 +D 12 +L 5 +D 17 +L 8 +U 16 +D 9 +U 7 +L 11 +R 13 +U 2 +D 15 +R 2 +L 5 +U 6 +L 5 +U 15 +D 13 +U 17 +R 17 +L 4 +U 17 +R 1 +D 16 +L 16 +R 7 +U 14 +L 3 +D 12 +L 2 +D 6 +R 10 +U 11 +R 8 +D 8 +U 3 +R 5 +U 12 +D 5 +U 14 +R 13 +U 12 +R 1 +U 4 +D 12 +L 6 +R 8 +D 9 +U 4 +D 16 +L 4 +D 7 +L 2 +U 13 +L 7 +D 16 +U 1 +D 14 +U 14 +L 10 +U 2 +D 11 +L 5 +D 14 +U 14 +L 11 +R 17 +D 3 +R 7 +D 6 +R 17 +D 4 +R 14 +L 7 +U 17 +L 6 +D 7 +L 9 +U 10 +L 4 +D 1 +L 17 +R 4 +D 13 +L 4 +D 9 +U 12 +L 6 +R 18 +L 8 +R 16 +L 14 +D 9 +L 18 +D 2 +U 4 +D 7 +R 8 +D 13 +L 17 +U 3 +D 10 +R 10 +L 13 +D 15 +L 14 +D 11 +R 7 +L 3 +R 17 +U 13 +R 14 +D 5 +L 12 +U 4 +R 17 +D 2 +U 7 +R 9 +U 16 +L 18 +D 13 +R 6 +D 8 +L 18 +D 7 +L 11 +R 9 +U 18 +L 10 +U 11 +D 10 +L 7 +D 9 +R 17 +L 4 +R 2 +U 1 +D 9 +U 16 +D 1 +U 5 +R 9 +U 13 +D 10 +U 10 +L 5 +D 1 +U 11 +L 3 +D 15 +U 2 +R 15 +D 1 +L 15 +R 16 +U 14 +L 9 +D 4 +R 15 +L 9 +U 6 +L 4 +R 13 +U 17 +D 6 +L 14 +D 18 +L 17 +D 2 +L 12 +D 11 +R 14 +U 3 +R 12 +L 9 +R 14 +L 16 +U 14 +L 9 +D 1 +L 7 +D 2 +R 2 +L 18 +D 3 +L 10 +D 15 +L 14 +U 11 +L 11 +D 3 +L 4 +R 14 +D 11 +R 8 +D 8 +L 2 +U 15 +L 15 +D 6 +U 1 +D 19 +U 5 +L 5 +U 17 +D 6 +R 5 +L 10 +R 19 +D 9 +R 12 +L 10 +R 1 +L 17 +U 14 +L 1 +D 1 +U 14 +D 14 +L 8 +D 10 +U 12 +L 18 +U 3 +D 17 +U 4 +L 13 +D 3 +R 16 +U 7 +R 19 +U 14 +D 7 +R 15 +L 19 +R 15 +U 11 +L 9 +U 15 +D 16 +U 3 +L 10 +U 1 +D 4 +U 13 +R 7 +U 15 +D 13 +R 18 +L 4 +U 11 +D 3 +L 14 +R 9 +L 8 +R 8 +U 10 +R 17 +L 16 +U 17 +D 15 +U 8 +D 5 +L 8 +R 9 +D 12 +L 2 +U 19 +L 11 +R 18 +D 14 +R 6 +D 4 +L 3 +D 15 +L 3 +R 1 +U 4 +L 6 +U 14 +L 18 +D 13 +R 12 +U 4 +L 12 +U 15 +L 15 +D 2 +L 13 +R 15 +L 3 +U 13 +R 6 +D 1 +U 12 +D 19 +U 10 +L 13 +D 9 +L 18 +U 3 +D 13 +U 2 +L 10 +D 18 +U 16 +D 9 +U 12 diff --git a/2022/aoc2022/src/day9.rs b/2022/aoc2022/src/day9.rs new file mode 100644 index 0000000..ac399a8 --- /dev/null +++ b/2022/aoc2022/src/day9.rs @@ -0,0 +1,98 @@ +use crate::grid::{Direction, Point}; +use std::collections::HashSet; + +const INPUT: &'static str = include_str!("../../Data/day9-input.txt"); + +type SignedPoint = Point; + +struct Rope { + nodes: Vec, +} + +impl Rope { + fn with_length(length: usize) -> Rope { + Rope { + nodes: vec![SignedPoint::zero(); length], + } + } + + fn move_head(&mut self, direction: Direction) { + if let Some(head) = self.nodes.first_mut() { + head.move_by_one_in(direction); + println!("{}", &head); + for i in 1..self.nodes.len() { + let first = self.nodes[i - 1].clone(); + let mut second = self.nodes.get_mut(i).unwrap(); + + let distance = second.distance_to(&first); + if distance.0 == 2 { + second.x += 1; + if distance.1 < 0 { + second.y -= 1; + } else if distance.1 > 0 { + second.y += 1; + } + } else if distance.0 == -2 { + second.x -= 1; + if distance.1 < 0 { + second.y -= 1; + } else if distance.1 > 0 { + second.y += 1; + } + } else if distance.1 == 2 { + second.y += 1; + if distance.0 < 0 { + second.x -= 1; + } else if distance.0 > 0 { + second.x += 1; + } + } else if distance.1 == -2 { + second.y -= 1; + if distance.0 < 0 { + second.x -= 1; + } else if distance.0 > 0 { + second.x += 1; + } + } + } + } + } +} + +pub fn main(_filename: &str) -> std::io::Result<()> { + let mut visited_points: HashSet = HashSet::new(); + let mut long_rope_visited_points: HashSet = HashSet::new(); + + let mut rope = Rope::with_length(2); + let mut long_rope = Rope::with_length(10); + + for line in INPUT.lines() { + let mut split_line = line.split(" "); + + let direction = Direction::from_relative_direction(split_line.next().unwrap()).unwrap(); + let count = u8::from_str_radix(split_line.next().unwrap(), 10).unwrap(); + + for _ in 0..count { + rope.move_head(direction); + if let Some(last_node) = rope.nodes.last() { + visited_points.insert(last_node.clone()); + } + + long_rope.move_head(direction); + if let Some(last_node) = long_rope.nodes.last() { + long_rope_visited_points.insert(last_node.clone()); + } + } + } + + println!( + "Part 1: number of points tail node visited: {}", + &visited_points.len() + ); + println!( + "Part 2: number of points tail node of long rope visited: {}", + &long_rope_visited_points.len() + ); + + Ok(()) +} diff --git a/2022/aoc2022/src/grid.rs b/2022/aoc2022/src/grid.rs new file mode 100644 index 0000000..28fbac6 --- /dev/null +++ b/2022/aoc2022/src/grid.rs @@ -0,0 +1,125 @@ +#[derive(Clone, Copy, Debug)] +pub enum Direction { + North, + East, + South, + West, +} + +impl Direction { + pub fn all() -> &'static [Direction] { + &[ + Direction::North, + Direction::East, + Direction::South, + Direction::West, + ] + } + + pub fn from_relative_direction(letter: &str) -> Option { + match letter { + "U" | "u" => Some(Direction::North), + "R" | "r" => Some(Direction::East), + "D" | "d" => Some(Direction::South), + "L" | "l" => Some(Direction::West), + _ => None, + } + } +} + +#[derive(Debug)] +struct Grid { + grid: Vec>, +} + +impl Grid +where + T: Clone + Copy, +{ + pub fn new(size: usize, item: T) -> Grid { + let vectors = (0..size).map(|_| vec![item; size]).collect::>>(); + Grid { grid: vectors } + } + + pub fn height(&self) -> usize { + self.grid.len() + } + + pub fn width(&self) -> usize { + self.grid[0].len() + } + + pub fn get_at(&self, pt: &Point) -> Option<&T> { + if let Some(row) = self.grid.get(pt.y as usize) { + row.get(pt.x as usize) + } else { + None + } + } + + pub fn set_at(&mut self, pt: &Point, value: T) -> Result<(), &str> { + if let Some(row) = self.grid.get_mut(pt.y as usize) { + if pt.x < row.len() as i32 { + row[pt.x as usize] = value; + Ok(()) + } else { + Err("Unable to set") + } + } else { + Err("Unable to set") + } + } + + pub fn iter_points(&self) -> Box> { + let width = self.width(); + Box::new( + (0..self.height()) + .map(move |y| (0..width).map(move |x| Point::new(x as i32, y as i32))) + .flatten(), + ) + } +} + +impl From>> for Grid { + fn from(grid: Vec>) -> Grid { + Grid { grid } + } +} + +/** + * A point in standard coordinates, where Y values grow in the positively in the North direction. + */ +#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] +pub struct Point { + pub x: i32, + pub y: i32, +} + +impl Point { + pub fn zero() -> Point { + Point::new(0, 0) + } + + pub fn new(x: i32, y: i32) -> Point { + Point { x, y } + } + + pub fn distance_to(&self, other: &Point) -> (i32, i32) { + (other.x - self.x, other.y - self.y) + } + + pub fn move_by_one_in(&mut self, direction: Direction) { + match direction { + Direction::North => self.y += 1, + Direction::East => self.x += 1, + Direction::South => self.y -= 1, + Direction::West => self.x -= 1, + } + } +} + +impl std::fmt::Display for Point { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "({}, {})", self.x, self.y) + } +} diff --git a/2022/aoc2022/src/main.rs b/2022/aoc2022/src/main.rs index 8222157..5766941 100644 --- a/2022/aoc2022/src/main.rs +++ b/2022/aoc2022/src/main.rs @@ -9,7 +9,9 @@ mod day5; mod day6; mod day7; mod day8; +mod day9; mod file; +mod grid; fn main() { let days = [ @@ -21,6 +23,7 @@ fn main() { day6::main, day7::main, day8::main, + day9::main, ]; let args: Vec = env::args().collect();