summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-12-11 13:55:01 -0600
committerToby Vincent <tobyv13@gmail.com>2022-12-12 11:27:23 -0600
commit3d9bd88f830ed71836d26d36f315c84b17a1331a (patch)
treeacb4949507156d75e008706f2f1a19d49d2a897c
parent10af8f400de0f24f073309ef0ea27cca786cb832 (diff)
feat: impl day 9
-rw-r--r--aoc_2022/input/day_9.txt2000
-rw-r--r--aoc_2022/src/day_9.rs182
-rw-r--r--aoc_2022/src/lib.rs2
-rw-r--r--aoc_2022/src/main.rs3
4 files changed, 2186 insertions, 1 deletions
diff --git a/aoc_2022/input/day_9.txt b/aoc_2022/input/day_9.txt
new file mode 100644
index 0000000..d5e15df
--- /dev/null
+++ b/aoc_2022/input/day_9.txt
@@ -0,0 +1,2000 @@
+U 2
+L 1
+U 1
+D 2
+L 2
+D 1
+L 2
+R 2
+D 2
+U 2
+L 2
+D 1
+L 2
+U 1
+R 2
+D 2
+R 1
+U 1
+R 1
+L 1
+D 2
+R 1
+D 2
+R 2
+D 2
+L 2
+U 1
+R 1
+L 1
+D 2
+L 1
+R 1
+U 1
+D 1
+R 1
+D 2
+R 2
+L 1
+R 2
+L 2
+U 1
+L 1
+D 2
+U 2
+D 1
+R 2
+L 2
+D 1
+R 1
+D 2
+U 1
+D 2
+R 2
+U 2
+L 2
+D 2
+R 2
+L 1
+D 2
+L 1
+U 2
+R 1
+L 2
+U 1
+R 2
+U 1
+D 2
+R 2
+U 1
+D 2
+L 2
+D 2
+L 1
+R 1
+D 1
+L 2
+D 2
+U 2
+R 1
+U 1
+R 2
+U 2
+L 2
+R 2
+L 2
+R 1
+U 2
+L 2
+R 1
+D 1
+L 1
+D 1
+U 2
+R 1
+U 2
+R 2
+U 2
+L 2
+U 2
+L 2
+U 1
+R 1
+U 2
+R 2
+L 2
+R 2
+U 1
+R 1
+D 1
+U 1
+L 2
+R 3
+L 2
+U 3
+L 1
+R 1
+U 1
+D 1
+U 1
+D 1
+R 3
+U 3
+L 3
+U 1
+R 2
+D 1
+U 2
+D 2
+U 3
+L 2
+U 3
+R 1
+L 2
+U 1
+L 2
+D 2
+U 3
+D 1
+R 3
+U 3
+R 3
+L 1
+D 2
+U 2
+D 3
+U 1
+R 2
+L 1
+D 1
+L 1
+D 3
+R 1
+U 2
+L 2
+D 2
+U 3
+D 2
+U 1
+D 3
+U 2
+L 3
+R 2
+D 2
+R 3
+L 3
+R 1
+D 1
+L 2
+R 1
+D 2
+L 3
+R 2
+U 1
+L 3
+D 2
+R 3
+D 3
+U 1
+L 1
+D 3
+U 3
+D 3
+R 3
+U 1
+D 1
+L 1
+R 3
+L 3
+U 1
+D 3
+R 1
+L 3
+R 3
+D 2
+L 3
+D 3
+U 3
+L 1
+U 1
+L 2
+D 3
+L 2
+U 3
+L 3
+U 1
+R 2
+D 3
+U 2
+R 2
+U 1
+L 2
+D 2
+L 2
+D 1
+U 3
+D 1
+L 1
+U 2
+D 1
+R 2
+L 2
+R 3
+L 2
+R 1
+D 1
+R 1
+D 2
+L 4
+D 3
+R 3
+D 4
+L 3
+D 1
+U 2
+D 1
+L 4
+R 4
+L 3
+R 2
+L 1
+R 2
+D 1
+R 1
+D 4
+U 1
+D 2
+R 3
+D 3
+R 2
+U 1
+D 2
+U 2
+L 1
+D 3
+U 4
+L 3
+U 2
+L 4
+D 4
+L 1
+U 3
+D 2
+R 3
+D 2
+L 2
+U 3
+L 3
+R 2
+D 2
+R 2
+U 3
+L 2
+R 4
+L 4
+U 1
+D 3
+L 2
+R 3
+L 2
+R 3
+D 4
+R 1
+L 1
+U 1
+L 2
+D 3
+L 4
+R 2
+D 2
+U 3
+D 4
+L 3
+R 1
+U 4
+L 3
+D 4
+L 1
+D 3
+L 4
+R 2
+L 1
+R 4
+L 4
+U 3
+D 4
+U 1
+R 2
+D 3
+U 3
+R 2
+L 2
+R 2
+U 4
+L 4
+D 4
+L 3
+D 3
+U 1
+D 1
+U 4
+R 1
+L 2
+U 2
+L 3
+U 3
+L 3
+D 1
+L 2
+U 3
+L 3
+U 2
+L 2
+U 2
+L 4
+R 1
+L 2
+D 2
+R 3
+L 5
+U 1
+R 5
+D 3
+L 5
+U 3
+D 1
+L 3
+R 2
+D 2
+U 3
+R 5
+D 5
+R 1
+D 4
+U 1
+R 1
+L 4
+D 1
+U 3
+D 4
+L 1
+D 1
+L 2
+U 1
+L 3
+R 1
+D 1
+U 1
+D 2
+L 5
+U 2
+R 3
+D 4
+L 4
+R 1
+L 4
+R 5
+D 4
+R 4
+L 4
+U 3
+L 3
+R 1
+D 1
+R 4
+U 1
+R 3
+U 5
+R 5
+D 2
+R 4
+D 5
+L 2
+D 4
+U 4
+R 3
+D 2
+L 5
+R 4
+D 4
+L 1
+D 4
+L 4
+D 4
+R 2
+D 5
+L 4
+U 3
+D 5
+U 5
+L 1
+U 3
+L 2
+U 2
+R 2
+U 3
+D 3
+R 1
+L 3
+R 1
+U 4
+D 1
+R 1
+L 1
+R 4
+L 1
+R 3
+D 4
+U 5
+L 4
+U 5
+L 5
+U 4
+L 3
+D 2
+L 1
+U 1
+R 4
+L 5
+D 3
+U 3
+L 2
+D 1
+L 1
+U 4
+R 6
+U 5
+L 4
+R 3
+U 4
+L 5
+U 3
+D 1
+U 3
+R 4
+L 3
+D 6
+R 1
+L 2
+U 6
+D 6
+R 2
+L 4
+D 1
+R 5
+L 3
+D 1
+R 2
+D 3
+L 6
+U 5
+D 1
+U 2
+R 2
+L 5
+U 1
+D 3
+R 5
+D 2
+L 1
+D 6
+R 4
+D 5
+L 1
+R 2
+L 3
+R 4
+L 6
+U 5
+L 3
+D 4
+R 4
+U 1
+D 3
+R 4
+L 4
+R 1
+U 2
+R 6
+D 1
+L 4
+R 2
+D 5
+R 6
+D 3
+R 5
+L 1
+R 2
+U 2
+D 2
+L 4
+D 6
+L 1
+R 2
+U 3
+D 6
+L 1
+R 3
+L 1
+D 1
+R 6
+D 6
+L 1
+U 4
+L 4
+U 6
+R 6
+L 6
+D 1
+U 2
+R 6
+L 6
+U 6
+D 1
+R 5
+U 4
+R 2
+L 2
+R 5
+U 5
+R 6
+U 2
+D 3
+R 6
+D 2
+R 3
+L 6
+U 5
+R 2
+D 5
+L 3
+D 5
+U 2
+D 4
+L 1
+D 3
+U 1
+L 4
+D 2
+L 3
+U 5
+R 5
+L 3
+D 7
+R 5
+L 5
+U 5
+L 7
+U 3
+L 2
+R 5
+D 1
+R 4
+U 1
+R 5
+U 6
+R 1
+L 3
+U 7
+L 6
+R 2
+L 3
+U 6
+L 4
+D 1
+L 6
+U 2
+L 6
+U 2
+L 4
+U 2
+L 4
+U 4
+D 3
+U 1
+R 1
+U 5
+L 2
+R 3
+D 7
+R 4
+U 4
+R 1
+D 1
+L 7
+R 2
+U 3
+D 1
+U 1
+D 1
+L 2
+R 5
+U 2
+R 5
+U 7
+L 2
+R 6
+U 2
+R 1
+L 7
+U 2
+R 3
+U 2
+R 7
+D 7
+R 6
+U 4
+L 1
+R 1
+U 6
+R 6
+U 1
+L 7
+R 6
+L 2
+U 5
+L 3
+R 4
+D 4
+R 6
+L 5
+D 1
+U 4
+D 6
+L 4
+R 4
+D 1
+L 3
+U 2
+L 7
+R 2
+U 7
+R 3
+L 6
+D 6
+U 3
+D 7
+U 7
+D 7
+R 7
+U 5
+L 2
+U 5
+D 4
+L 4
+U 2
+L 6
+U 4
+D 3
+L 6
+U 7
+R 3
+D 2
+U 2
+L 7
+D 5
+L 2
+U 6
+R 8
+D 7
+R 5
+U 5
+R 3
+L 1
+U 6
+R 3
+D 7
+U 3
+R 4
+U 5
+D 4
+R 1
+D 6
+L 7
+D 2
+R 5
+U 4
+L 1
+R 1
+L 7
+U 6
+D 1
+L 1
+D 8
+U 1
+L 7
+R 1
+U 6
+D 6
+L 4
+U 1
+L 3
+D 6
+R 6
+D 3
+R 7
+U 3
+L 7
+R 6
+L 3
+D 2
+L 4
+U 1
+R 1
+D 7
+L 8
+R 1
+L 7
+D 1
+L 1
+R 3
+U 1
+R 8
+L 6
+D 3
+U 3
+R 2
+D 7
+R 6
+L 2
+R 1
+U 4
+R 6
+L 6
+D 4
+L 4
+U 6
+L 2
+U 7
+D 3
+R 3
+L 5
+R 7
+D 7
+U 8
+L 6
+U 6
+D 7
+L 8
+U 8
+L 6
+U 1
+D 1
+U 8
+D 5
+R 5
+U 7
+D 3
+U 3
+D 2
+U 4
+L 6
+D 6
+L 2
+D 4
+R 2
+L 7
+R 4
+U 4
+D 6
+R 7
+D 6
+U 1
+D 2
+U 1
+D 4
+L 2
+R 4
+L 7
+U 5
+L 3
+D 6
+U 5
+L 6
+U 3
+L 3
+U 1
+D 1
+L 6
+U 3
+L 8
+D 3
+R 7
+L 2
+U 8
+R 5
+U 8
+R 9
+U 9
+L 8
+U 5
+D 3
+U 4
+R 8
+U 4
+L 6
+R 6
+L 8
+R 8
+U 2
+L 2
+R 5
+D 7
+L 3
+D 4
+L 5
+D 1
+R 7
+D 6
+R 6
+D 2
+R 8
+U 8
+R 2
+D 4
+U 3
+R 4
+U 2
+L 3
+U 4
+D 5
+R 4
+U 9
+D 4
+R 7
+L 1
+D 7
+U 6
+L 1
+U 3
+D 8
+R 3
+U 4
+D 2
+L 6
+R 8
+D 5
+R 5
+D 1
+U 2
+L 7
+D 7
+U 6
+D 3
+U 6
+R 9
+U 2
+L 7
+U 4
+L 7
+U 4
+D 3
+U 9
+R 5
+D 2
+U 1
+L 6
+D 2
+L 8
+U 5
+R 3
+U 9
+R 2
+U 9
+L 7
+D 6
+L 4
+R 1
+L 4
+D 5
+R 5
+L 1
+R 8
+L 7
+U 2
+R 9
+L 1
+R 2
+D 4
+U 5
+R 5
+L 10
+D 7
+U 7
+R 9
+L 1
+R 9
+D 7
+U 4
+L 8
+U 9
+R 10
+D 3
+U 2
+D 2
+L 10
+R 7
+L 2
+R 4
+U 10
+R 7
+D 5
+L 7
+R 8
+D 6
+R 6
+U 1
+R 1
+L 4
+D 7
+R 10
+L 3
+U 4
+D 10
+L 5
+R 10
+D 7
+U 2
+D 8
+L 5
+R 2
+D 5
+U 9
+R 6
+L 6
+U 5
+L 3
+R 3
+D 6
+L 3
+U 4
+D 10
+L 6
+U 7
+L 4
+D 5
+L 4
+D 8
+R 5
+U 8
+R 8
+L 1
+D 4
+R 7
+U 5
+D 3
+L 5
+D 3
+L 7
+U 7
+R 4
+U 1
+R 7
+L 3
+R 3
+D 2
+U 6
+D 6
+U 1
+R 6
+D 1
+U 4
+R 5
+D 3
+R 8
+L 2
+D 10
+L 7
+D 10
+U 9
+D 6
+U 3
+L 8
+U 9
+R 10
+D 10
+R 5
+L 10
+D 6
+L 6
+R 11
+D 6
+L 1
+R 8
+U 10
+R 8
+L 8
+R 10
+U 8
+R 4
+L 8
+D 7
+U 4
+L 1
+R 10
+U 10
+L 6
+R 10
+L 6
+U 8
+R 11
+D 9
+L 1
+R 2
+D 10
+L 4
+U 8
+D 9
+L 11
+R 7
+U 7
+L 2
+D 1
+R 8
+U 11
+D 5
+R 4
+U 7
+L 8
+D 7
+R 10
+D 1
+R 5
+U 4
+D 3
+U 4
+D 11
+L 8
+R 10
+D 7
+U 1
+D 11
+U 1
+D 10
+R 5
+L 2
+R 10
+U 9
+D 8
+L 3
+U 6
+R 11
+L 4
+U 4
+R 3
+L 3
+U 2
+R 8
+U 6
+R 7
+D 6
+U 1
+R 3
+L 6
+D 4
+L 2
+D 8
+U 2
+D 3
+R 10
+D 10
+R 1
+L 2
+R 4
+D 10
+L 1
+U 3
+D 1
+R 7
+D 9
+R 1
+L 10
+R 9
+U 11
+R 1
+L 5
+U 7
+R 8
+L 3
+D 5
+R 11
+D 4
+R 2
+U 6
+D 11
+L 5
+D 5
+L 3
+U 7
+R 5
+L 11
+U 11
+L 10
+R 9
+D 2
+U 2
+R 2
+D 11
+L 3
+U 4
+R 3
+U 5
+D 5
+L 5
+U 5
+D 3
+U 5
+D 7
+R 9
+L 1
+D 11
+U 11
+L 5
+R 10
+L 3
+U 12
+L 8
+U 4
+R 12
+U 12
+D 6
+U 1
+L 11
+R 8
+U 8
+R 12
+U 2
+D 12
+R 4
+L 1
+U 12
+R 1
+L 8
+R 5
+U 11
+L 8
+R 2
+L 10
+R 3
+D 11
+L 2
+U 11
+D 7
+L 5
+R 8
+L 5
+U 7
+R 10
+U 3
+L 6
+U 1
+R 9
+D 12
+R 10
+D 3
+R 2
+D 8
+R 2
+D 3
+U 2
+L 12
+D 8
+L 4
+U 8
+D 10
+U 11
+R 11
+U 6
+L 10
+U 3
+L 5
+U 12
+L 9
+R 8
+L 12
+R 3
+D 11
+U 11
+L 9
+R 8
+L 1
+U 2
+L 6
+R 6
+D 5
+R 1
+D 7
+L 3
+U 8
+R 1
+U 12
+R 6
+L 9
+U 6
+R 2
+D 8
+L 11
+U 1
+R 2
+L 3
+U 4
+L 12
+U 1
+D 7
+U 3
+D 10
+L 6
+D 1
+R 2
+U 7
+L 3
+U 2
+D 6
+R 5
+L 11
+R 9
+D 5
+R 8
+L 6
+D 3
+U 7
+L 6
+D 10
+U 4
+L 9
+R 2
+D 8
+U 2
+L 7
+D 13
+R 6
+L 6
+U 3
+D 9
+L 5
+R 11
+D 13
+U 6
+D 8
+L 7
+U 13
+L 3
+D 2
+U 7
+D 12
+L 3
+R 10
+L 8
+D 8
+U 5
+R 4
+U 12
+R 2
+D 11
+L 12
+D 12
+L 11
+D 1
+R 10
+D 10
+U 10
+D 2
+L 2
+R 7
+L 13
+U 5
+L 10
+U 5
+R 5
+L 13
+D 7
+R 9
+U 2
+D 11
+U 4
+R 1
+L 5
+D 7
+L 5
+D 6
+U 7
+R 8
+U 10
+D 12
+R 2
+U 6
+L 12
+D 12
+L 8
+U 1
+D 8
+U 9
+D 11
+U 8
+D 1
+L 9
+R 10
+U 4
+D 4
+U 12
+L 9
+D 13
+L 12
+R 12
+L 11
+D 12
+U 9
+D 1
+R 4
+U 5
+R 8
+U 6
+R 10
+U 1
+L 7
+D 12
+R 13
+D 10
+L 1
+U 9
+L 9
+R 2
+L 14
+R 8
+U 6
+D 7
+R 4
+L 9
+D 3
+L 11
+R 13
+U 6
+D 6
+L 2
+R 6
+U 1
+L 13
+R 9
+D 9
+L 5
+R 9
+D 4
+U 13
+L 9
+D 7
+U 8
+D 1
+U 11
+L 12
+U 4
+D 7
+R 6
+D 13
+L 12
+R 8
+L 6
+U 1
+R 13
+U 9
+D 2
+U 2
+D 1
+U 6
+R 8
+U 2
+R 6
+D 8
+L 10
+D 14
+U 6
+D 8
+L 3
+R 2
+U 4
+D 10
+U 13
+R 1
+L 11
+D 2
+L 6
+D 14
+U 8
+D 11
+R 1
+L 8
+R 12
+U 1
+D 4
+U 10
+L 9
+D 11
+L 10
+U 13
+D 7
+U 4
+L 11
+U 8
+R 12
+D 4
+L 1
+U 7
+D 5
+U 6
+R 7
+L 8
+U 13
+L 1
+D 8
+U 14
+D 5
+U 10
+D 14
+L 6
+U 4
+L 9
+D 6
+U 7
+L 14
+R 13
+D 11
+R 6
+D 10
+U 6
+R 8
+D 14
+U 14
+L 4
+U 2
+L 4
+R 8
+U 14
+D 2
+L 15
+U 4
+D 6
+R 3
+U 3
+L 12
+U 4
+D 8
+R 14
+U 15
+R 3
+D 10
+R 14
+L 15
+R 9
+D 9
+L 10
+U 7
+L 13
+R 4
+U 4
+D 13
+L 14
+U 7
+L 4
+R 5
+D 7
+R 4
+D 15
+R 15
+U 1
+L 2
+R 14
+L 7
+U 13
+R 12
+L 5
+U 8
+L 15
+U 6
+R 11
+L 12
+U 13
+R 4
+U 15
+D 5
+R 14
+L 6
+U 1
+D 5
+L 7
+U 13
+D 8
+U 2
+D 11
+L 6
+R 2
+L 10
+R 6
+L 14
+D 7
+R 6
+L 10
+R 4
+U 1
+L 3
+R 6
+L 8
+D 14
+R 3
+D 15
+L 9
+D 10
+U 11
+R 5
+D 11
+U 4
+R 2
+D 2
+U 6
+L 7
+D 5
+L 12
+U 3
+R 8
+D 13
+R 9
+D 1
+L 3
+R 14
+L 3
+D 13
+L 15
+U 2
+L 2
+U 12
+D 1
+L 9
+U 2
+D 8
+R 12
+L 5
+R 9
+U 15
+D 4
+R 7
+U 9
+R 13
+U 14
+L 1
+U 1
+R 15
+D 1
+R 2
+U 11
+R 8
+D 9
+R 1
+U 13
+D 3
+L 4
+U 6
+L 12
+U 5
+L 2
+R 11
+L 5
+R 4
+D 11
+L 9
+U 15
+L 12
+U 16
+L 12
+D 6
+L 3
+D 12
+U 2
+L 4
+R 15
+U 16
+D 13
+L 14
+U 13
+D 11
+R 14
+L 13
+U 9
+L 9
+D 15
+R 1
+D 4
+L 8
+R 1
+D 12
+U 1
+L 13
+D 8
+U 7
+D 7
+L 12
+D 11
+L 7
+U 5
+R 14
+L 6
+R 8
+L 15
+U 12
+R 13
+U 7
+L 1
+D 12
+U 16
+L 8
+U 1
+L 1
+U 6
+D 14
+U 2
+R 9
+L 15
+R 4
+D 5
+U 10
+R 7
+L 15
+R 5
+D 1
+L 1
+D 4
+L 1
+R 4
+D 10
+U 13
+L 1
+R 13
+U 16
+R 15
+D 5
+U 6
+D 1
+R 5
+D 4
+U 6
+R 8
+L 1
+D 3
+U 13
+D 14
+U 11
+D 7
+U 12
+L 1
+D 3
+U 1
+R 2
+U 9
+R 2
+D 5
+L 8
+U 4
+D 1
+L 9
+R 5
+D 12
+R 12
+L 12
+R 16
+L 10
+R 15
+U 7
+D 13
+R 14
+D 12
+R 2
+L 7
+U 5
+L 15
+D 5
+R 12
+U 14
+D 2
+U 11
+R 8
+U 2
+L 5
+D 10
+U 7
+L 3
+U 15
+R 2
+U 11
+L 10
+D 4
+U 6
+D 15
+L 9
+D 8
+U 11
+L 10
+R 17
+D 2
+U 1
+R 7
+U 9
+L 4
+R 5
+L 11
+U 11
+R 13
+L 7
+D 17
+U 10
+D 5
+U 17
+L 1
+U 3
+D 4
+U 16
+D 17
+U 10
+D 12
+U 1
+R 4
+D 2
+U 1
+D 1
+L 9
+D 6
+L 1
+U 8
+L 2
+D 1
+U 10
+L 14
+U 17
+D 12
+U 1
+R 1
+D 8
+L 7
+D 10
+L 15
+R 15
+D 14
+R 12
+D 5
+L 1
+R 14
+L 2
+D 8
+R 15
+U 6
+L 4
+R 5
+D 11
+L 16
+R 11
+D 14
+L 14
+R 16
+U 12
+R 2
+U 16
+L 3
+R 4
+U 15
+R 15
+D 3
+U 17
+R 5
+L 2
+R 15
+D 13
+L 2
+U 4
+L 6
+R 5
+L 5
+R 4
+L 9
+U 3
+L 9
+R 15
+L 4
+R 1
+U 3
+L 1
+D 3
+R 9
+D 9
+L 10
+R 14
+L 18
+U 7
+R 11
+L 6
+R 16
+U 9
+R 5
+U 5
+R 9
+D 9
+L 12
+D 18
+L 11
+D 18
+L 2
+D 8
+R 6
+L 1
+U 11
+L 6
+U 18
+L 8
+D 12
+L 8
+R 15
+L 15
+R 13
+L 10
+D 15
+R 10
+L 11
+R 14
+D 6
+L 9
+U 3
+R 10
+U 18
+R 9
+L 9
+D 4
+L 17
+D 16
+U 10
+R 14
+L 15
+R 5
+U 2
+L 4
+R 15
+U 2
+D 2
+R 9
+U 14
+D 17
+U 5
+R 1
+U 15
+R 17
+D 4
+R 7
+L 4
+R 16
+L 11
+U 10
+R 3
+D 2
+L 5
+R 14
+L 4
+D 11
+L 11
+U 6
+R 9
+U 3
+R 17
+D 16
+R 18
+L 10
+R 15
+L 14
+R 16
+L 12
+U 3
+R 9
+D 17
+R 6
+L 1
+R 16
+L 8
+U 16
+R 6
+L 1
+U 4
+L 17
+R 4
+U 15
+R 19
+D 7
+R 18
+L 16
+R 18
+U 2
+D 11
+L 17
+R 2
+L 10
+U 17
+D 11
+R 17
+U 1
+D 15
+U 6
+D 19
+R 16
+D 12
+L 7
+R 13
+D 14
+L 12
+U 14
+L 5
+R 5
+D 3
+L 10
+U 16
+R 14
+D 16
+L 9
+D 16
+L 10
+R 11
+D 11
+U 19
+L 4
+D 16
+R 8
+D 1
+U 4
+L 15
+R 5
+D 1
+L 19
+D 19
+R 12
+L 18
+D 13
+L 4
+U 6
+R 5
+D 12
+R 15
+D 9
+L 9
+U 16
+D 1
+R 16
+L 7
+R 6
+D 12
+L 7
+R 8
+U 17
+L 12
+D 9
+L 8
+D 16
+R 8
+D 9
+L 17
+R 3
+U 6
+D 1
+R 7
+L 4
+D 10
+U 7
+R 13
+L 10
+D 19
+U 7
+D 10
+L 17
+R 18
+D 15
+R 6
+L 7
+R 8
+U 16
+R 6
+D 3
+L 19
+D 10
+R 12
+U 13
+L 11
diff --git a/aoc_2022/src/day_9.rs b/aoc_2022/src/day_9.rs
new file mode 100644
index 0000000..3d521af
--- /dev/null
+++ b/aoc_2022/src/day_9.rs
@@ -0,0 +1,182 @@
+use std::{cmp::Ordering, collections::HashSet, fmt::Display, str::FromStr};
+
+use aoc::{Problem, Solution};
+
+type Unit = isize;
+type Position = (Unit, Unit);
+
+enum Motion {
+ Up(Unit),
+ Down(Unit),
+ Left(Unit),
+ Right(Unit),
+}
+
+impl FromStr for Motion {
+ type Err = anyhow::Error;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ match s.split_once(' ') {
+ Some(("U", n)) => Ok(Motion::Up(n.parse()?)),
+ Some(("D", n)) => Ok(Motion::Down(n.parse()?)),
+ Some(("L", n)) => Ok(Motion::Left(n.parse()?)),
+ Some(("R", n)) => Ok(Motion::Right(n.parse()?)),
+ _ => Err(anyhow::format_err!("Improper motion format: {}", s)),
+ }
+ }
+}
+
+impl Display for Motion {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Motion::Up(n) => write!(f, "U {}", n),
+ Motion::Down(n) => write!(f, "D {}", n),
+ Motion::Left(n) => write!(f, "L {}", n),
+ Motion::Right(n) => write!(f, "R {}", n),
+ }
+ }
+}
+
+#[derive(Clone)]
+enum List {
+ Cons(Position, Box<List>),
+ None,
+}
+
+impl List {
+ fn new() -> Self {
+ Self::None
+ }
+
+ fn prepend(self) -> List {
+ Self::Cons(Default::default(), Box::new(self))
+ }
+
+ fn update_from_motion(&mut self, motion: Motion) -> Vec<Position> {
+ let Self::Cons(position, next) = self else {
+ panic!("update_from_motion must be called on a head with at least one tail.");
+ };
+
+ let (dx, dy, count) = match motion {
+ Motion::Up(n) => (0, 1, n),
+ Motion::Down(n) => (0, -1, n),
+ Motion::Left(n) => (-1, 0, n),
+ Motion::Right(n) => (1, 0, n),
+ };
+
+ let mut visited = Vec::new();
+ for _ in 0..count {
+ position.0 += dx;
+ position.1 += dy;
+ visited.push(next.as_mut().update_from_position(position));
+ }
+
+ visited
+ }
+
+ fn update_from_position(&mut self, head: &Position) -> Position {
+ let Self::Cons(position, next) = self else {
+ return *head;
+ };
+
+ if position.0.abs_diff(head.0) > 1 || position.1.abs_diff(head.1) > 1 {
+ match position.0.cmp(&head.0) {
+ Ordering::Less => position.0 += 1,
+ Ordering::Equal => {}
+ Ordering::Greater => position.0 -= 1,
+ }
+
+ match position.1.cmp(&head.1) {
+ Ordering::Less => position.1 += 1,
+ Ordering::Equal => {}
+ Ordering::Greater => position.1 -= 1,
+ }
+ }
+
+ next.as_mut().update_from_position(position)
+ }
+}
+
+pub struct Day9;
+
+impl Problem for Day9 {
+ const DAY: u8 = 9;
+
+ const INPUT: &'static str = include_str!("../input/day_9.txt");
+}
+
+impl Solution for Day9 {
+ type Answer1 = usize;
+
+ type Answer2 = usize;
+
+ fn part_1(input: &str) -> Result<Self::Answer1, anyhow::Error> {
+ let mut head = List::new();
+ head = head.prepend();
+ head = head.prepend();
+
+ input
+ .lines()
+ .flat_map(Motion::from_str)
+ .flat_map(|motion| head.update_from_motion(motion))
+ .try_fold(HashSet::new(), |mut set, pos| {
+ set.insert(pos);
+ Ok(set)
+ })
+ .map(|s| s.len())
+ }
+
+ fn part_2(input: &str) -> Result<Self::Answer2, anyhow::Error> {
+ let mut head = List::new();
+ for _ in 0..10 {
+ head = head.prepend();
+ }
+
+ input
+ .lines()
+ .flat_map(Motion::from_str)
+ .flat_map(|motion| head.update_from_motion(motion))
+ .try_fold(HashSet::new(), |mut set, pos| {
+ set.insert(pos);
+ Ok(set)
+ })
+ .map(|s| s.len())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_part_1_example() -> Result<(), anyhow::Error> {
+ let test_input = indoc::indoc! {r#"
+ R 4
+ U 4
+ L 3
+ D 1
+ R 4
+ D 1
+ L 5
+ R 2
+ "#};
+
+ Ok(assert_eq!(13, Day9::part_1(test_input)?))
+ }
+
+ #[test]
+ fn test_part_2_example() -> Result<(), anyhow::Error> {
+ let test_input = indoc::indoc! {r#"
+ R 5
+ U 8
+ L 8
+ D 3
+ R 17
+ D 10
+ L 25
+ U 20
+ "#};
+
+ Ok(assert_eq!(36, Day9::part_2(test_input)?))
+ }
+}
diff --git a/aoc_2022/src/lib.rs b/aoc_2022/src/lib.rs
index d3d4aea..09de695 100644
--- a/aoc_2022/src/lib.rs
+++ b/aoc_2022/src/lib.rs
@@ -1,5 +1,6 @@
#![feature(iterator_try_collect)]
#![feature(iter_next_chunk)]
+#![feature(is_some_and)]
pub mod day_1;
pub mod day_2;
@@ -9,3 +10,4 @@ pub mod day_5;
pub mod day_6;
pub mod day_7;
pub mod day_8;
+pub mod day_9;
diff --git a/aoc_2022/src/main.rs b/aoc_2022/src/main.rs
index 3c26a16..f791a30 100644
--- a/aoc_2022/src/main.rs
+++ b/aoc_2022/src/main.rs
@@ -2,7 +2,7 @@ use anyhow::Result;
use aoc::Solution;
use aoc_2022::{
day_1::Day1, day_2::Day2, day_3::Day3, day_4::Day4, day_5::Day5, day_6::Day6, day_7::Day7,
- day_8::Day8,
+ day_8::Day8, day_9::Day9,
};
fn main() -> Result<()> {
@@ -14,6 +14,7 @@ fn main() -> Result<()> {
Day6::solve()?;
Day7::solve()?;
Day8::solve()?;
+ Day9::solve()?;
Ok(())
}