summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-09 03:27:01 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-09 03:27:01 -0500
commit33a7618e7d02331edccec4841b08d6efe8272dff (patch)
treecd3321cd44028a1c1d363f2463ef2d7eb0fb3a32
parent08ddc927b812d5f38666b3dd7de843e942710b13 (diff)
downloadadvent-of-code-33a7618e7d02331edccec4841b08d6efe8272dff.tar.gz
advent-of-code-33a7618e7d02331edccec4841b08d6efe8272dff.zip
day 9
-rw-r--r--data/2022/9.txt2000
-rw-r--r--src/2022/9/mod.rs240
-rw-r--r--src/2022/mod.rs4
-rw-r--r--src/grid.rs4
4 files changed, 2246 insertions, 2 deletions
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<Self, Self::Err> {
+ 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<usize> {
+ for (i, knot) in self.knots.iter().enumerate() {
+ if knot == &pos {
+ return Some(i);
+ }
+ }
+ None
+ }
+}
+
+pub struct Map {
+ grid: std::collections::VecDeque<std::collections::VecDeque<bool>>,
+ 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<impl Iterator<Item = Move>> {
+ Ok(parse::lines(fh).map(|line| Move::parse(&line)))
+}
+
+pub fn part1(moves: impl Iterator<Item = Move>) -> Result<i64> {
+ 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<Item = Move>) -> Result<i64> {
+ 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<i64> {
@@ -37,6 +39,8 @@ pub fn run(day: u8, puzzle: u8) -> Result<i64> {
(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<usize> for Row {