summaryrefslogtreecommitdiff
path: root/aoc22/day9
diff options
context:
space:
mode:
authormathiasmagnusson <mathias@magnusson.space>2022-12-12 20:53:17 +0100
committermathiasmagnusson <mathias@magnusson.space>2022-12-12 20:53:17 +0100
commit5dd4e8d1b053e9c13c66a573e664c0a7808e4cb6 (patch)
tree1c65d8ed85d432080e2b3da042d242e600002b02 /aoc22/day9
parent616bec7e8b07e6d7c669b2b9142da14feebe8885 (diff)
downloadprogramming-problem-solving-5dd4e8d1b053e9c13c66a573e664c0a7808e4cb6.tar.gz
Day 9
Diffstat (limited to 'aoc22/day9')
-rw-r--r--aoc22/day9/Cargo.toml7
-rw-r--r--aoc22/day9/input2000
-rw-r--r--aoc22/day9/src/main.rs149
3 files changed, 2156 insertions, 0 deletions
diff --git a/aoc22/day9/Cargo.toml b/aoc22/day9/Cargo.toml
new file mode 100644
index 0000000..e6da5ab
--- /dev/null
+++ b/aoc22/day9/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "day9"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+lib = { path = "../lib" }
diff --git a/aoc22/day9/input b/aoc22/day9/input
new file mode 100644
index 0000000..5160ab8
--- /dev/null
+++ b/aoc22/day9/input
@@ -0,0 +1,2000 @@
+L 2
+U 2
+R 2
+L 1
+R 1
+U 1
+D 1
+L 1
+R 1
+D 2
+R 1
+U 2
+D 2
+L 2
+R 2
+U 1
+L 1
+D 2
+U 2
+L 1
+U 2
+L 2
+U 2
+L 2
+D 1
+U 2
+D 1
+R 1
+U 2
+R 2
+D 1
+R 1
+U 1
+R 2
+L 1
+R 1
+L 1
+D 1
+L 1
+D 2
+U 1
+L 2
+R 2
+U 1
+R 1
+L 1
+U 2
+D 1
+L 2
+D 2
+R 1
+L 2
+U 1
+R 1
+L 1
+R 2
+D 2
+R 2
+L 1
+R 1
+U 1
+L 2
+D 2
+L 2
+R 2
+U 2
+D 2
+L 1
+U 2
+D 2
+L 2
+D 1
+U 2
+D 2
+U 2
+R 2
+U 2
+D 2
+L 1
+R 2
+L 1
+U 1
+D 1
+R 1
+L 1
+U 1
+R 2
+L 1
+D 2
+R 1
+D 1
+R 2
+D 2
+L 2
+U 1
+R 1
+D 2
+L 1
+U 1
+D 1
+L 1
+D 2
+R 1
+D 1
+R 2
+D 2
+R 1
+L 1
+R 1
+D 1
+R 1
+U 1
+L 3
+D 3
+R 2
+U 3
+R 1
+D 3
+U 1
+R 3
+L 2
+U 3
+L 3
+D 2
+R 2
+L 3
+D 3
+U 1
+L 3
+D 1
+U 3
+L 3
+D 1
+R 2
+D 1
+R 1
+U 2
+R 2
+U 2
+R 1
+L 2
+R 2
+L 2
+D 1
+U 1
+R 3
+L 3
+D 1
+U 3
+L 1
+U 2
+R 1
+L 1
+R 2
+U 1
+R 3
+D 1
+L 3
+D 3
+L 3
+R 3
+D 1
+R 1
+L 2
+D 2
+R 3
+L 1
+D 1
+U 1
+D 1
+U 2
+R 3
+U 2
+D 3
+R 3
+D 2
+L 1
+R 1
+D 2
+R 1
+L 2
+D 2
+U 2
+L 1
+R 2
+U 1
+D 2
+R 2
+D 2
+L 2
+R 3
+D 1
+U 2
+L 2
+R 3
+D 3
+L 3
+U 3
+L 2
+D 1
+R 1
+L 3
+D 2
+R 2
+D 2
+L 1
+U 1
+R 2
+U 3
+D 1
+L 1
+R 1
+L 2
+U 2
+L 3
+U 2
+D 2
+U 1
+L 1
+R 1
+U 3
+D 3
+R 4
+L 4
+U 1
+D 2
+L 1
+D 4
+L 3
+D 1
+R 4
+U 2
+D 2
+L 1
+D 3
+L 3
+R 2
+L 2
+R 1
+L 3
+R 1
+L 2
+U 1
+L 2
+U 4
+D 4
+U 4
+L 4
+R 4
+D 3
+L 1
+R 3
+D 4
+R 1
+L 4
+R 4
+U 1
+R 3
+U 2
+D 4
+L 1
+U 3
+L 2
+R 2
+D 1
+L 1
+U 3
+L 2
+U 1
+D 1
+L 4
+D 4
+U 2
+D 4
+R 3
+U 1
+R 1
+D 3
+L 1
+D 2
+R 2
+D 3
+L 3
+U 4
+L 4
+R 1
+D 2
+L 3
+U 3
+D 1
+R 4
+L 4
+U 4
+R 3
+L 3
+D 3
+L 1
+D 1
+U 1
+L 3
+R 4
+L 3
+R 4
+L 1
+D 1
+R 4
+U 3
+D 4
+U 1
+D 3
+R 4
+U 2
+D 1
+L 3
+D 3
+L 1
+R 3
+U 2
+L 4
+D 4
+L 2
+D 4
+U 1
+L 3
+R 2
+D 2
+U 2
+D 2
+R 1
+U 3
+R 3
+U 4
+L 3
+R 2
+D 4
+U 3
+D 4
+R 5
+L 1
+D 3
+L 5
+R 3
+D 5
+U 3
+R 1
+U 3
+D 4
+R 1
+D 5
+R 3
+L 4
+D 2
+R 2
+U 2
+L 4
+U 3
+D 1
+L 2
+D 3
+U 2
+D 2
+R 4
+L 5
+U 1
+D 5
+R 2
+D 5
+R 3
+L 3
+R 4
+D 1
+L 5
+D 2
+U 2
+D 4
+U 4
+R 4
+L 2
+D 3
+L 3
+R 3
+L 4
+D 2
+U 1
+R 3
+L 3
+R 2
+L 5
+R 4
+D 2
+L 3
+R 2
+U 2
+R 4
+L 4
+R 1
+U 5
+D 5
+U 1
+R 4
+L 5
+R 5
+L 3
+R 1
+U 2
+L 4
+U 4
+L 5
+D 1
+U 5
+D 5
+U 2
+R 4
+U 3
+D 5
+R 1
+D 1
+L 5
+R 4
+L 4
+R 3
+D 3
+U 2
+R 5
+L 5
+U 5
+L 3
+D 2
+R 3
+L 4
+R 1
+L 3
+U 5
+L 2
+D 5
+R 5
+L 3
+D 3
+U 3
+L 5
+U 3
+R 1
+U 3
+L 5
+D 1
+U 4
+R 6
+U 1
+D 3
+U 1
+L 5
+R 1
+U 3
+D 3
+R 3
+U 5
+L 1
+R 2
+L 3
+U 5
+L 2
+R 6
+D 3
+U 3
+R 2
+U 5
+L 2
+U 5
+D 5
+R 1
+D 1
+U 6
+L 2
+D 2
+L 4
+R 5
+U 1
+D 3
+R 4
+D 1
+U 6
+R 4
+D 4
+U 6
+R 5
+L 5
+D 6
+R 6
+U 2
+L 2
+D 3
+R 6
+U 5
+L 5
+R 6
+L 3
+D 5
+U 2
+L 3
+U 4
+D 2
+U 5
+R 6
+D 3
+U 4
+L 2
+U 5
+L 6
+R 6
+D 5
+R 4
+D 3
+L 1
+D 4
+R 6
+L 4
+R 3
+U 5
+R 6
+U 1
+D 3
+L 4
+D 2
+U 6
+L 4
+D 6
+L 4
+D 5
+L 6
+D 1
+U 5
+R 5
+L 5
+R 4
+D 2
+R 2
+U 3
+D 2
+R 2
+D 2
+R 6
+U 6
+L 4
+U 6
+R 5
+D 5
+U 2
+R 4
+L 4
+D 2
+R 1
+D 4
+U 5
+R 4
+D 1
+U 2
+L 1
+R 1
+U 4
+R 3
+L 6
+D 5
+L 6
+R 1
+D 3
+U 4
+D 3
+L 2
+D 7
+U 2
+D 7
+U 4
+L 3
+R 6
+D 1
+L 6
+R 3
+L 6
+U 7
+R 2
+D 3
+L 3
+U 1
+L 4
+U 1
+L 1
+D 3
+R 1
+D 5
+L 3
+R 1
+D 4
+U 1
+R 4
+D 7
+U 7
+D 1
+R 7
+D 3
+R 2
+D 1
+U 6
+R 4
+U 7
+D 1
+U 2
+L 5
+R 2
+U 5
+L 1
+U 5
+D 6
+R 5
+D 4
+R 6
+U 3
+L 2
+D 6
+R 1
+D 1
+U 3
+L 2
+U 2
+L 5
+D 5
+L 7
+D 6
+R 3
+D 6
+U 6
+L 7
+U 4
+L 7
+D 7
+L 7
+U 5
+R 3
+L 5
+D 4
+R 3
+D 4
+U 7
+L 7
+D 6
+U 1
+R 5
+L 4
+R 5
+D 7
+R 4
+L 5
+U 5
+R 3
+U 6
+D 4
+U 7
+R 7
+D 1
+R 6
+U 6
+D 3
+L 1
+R 1
+U 5
+R 2
+L 6
+U 2
+R 8
+U 3
+R 3
+L 8
+R 4
+U 4
+L 4
+R 2
+L 2
+U 1
+D 2
+U 6
+L 1
+R 6
+U 2
+R 1
+D 2
+R 8
+D 6
+R 3
+L 1
+D 6
+R 3
+U 3
+L 3
+R 1
+D 4
+R 3
+D 8
+U 4
+L 1
+D 7
+L 2
+R 6
+U 2
+L 6
+U 7
+D 4
+R 2
+L 5
+R 3
+L 1
+U 2
+L 8
+R 8
+U 2
+R 8
+L 1
+U 8
+L 1
+D 4
+R 5
+U 1
+R 5
+L 8
+D 8
+R 4
+L 7
+U 3
+D 8
+L 7
+R 7
+L 8
+D 2
+U 2
+D 8
+L 1
+R 3
+L 7
+D 4
+R 5
+L 4
+R 7
+U 5
+L 7
+U 4
+R 4
+U 5
+R 3
+D 7
+U 7
+R 8
+L 7
+U 4
+D 2
+R 1
+D 8
+U 4
+D 7
+R 1
+D 4
+L 6
+U 1
+L 8
+D 1
+R 7
+L 2
+U 7
+R 7
+L 4
+U 6
+L 5
+D 3
+R 3
+L 1
+R 2
+U 3
+D 3
+R 5
+U 6
+D 8
+L 7
+R 2
+L 6
+R 4
+L 4
+R 5
+L 8
+R 8
+U 7
+L 6
+R 9
+D 2
+L 2
+D 9
+U 3
+D 3
+L 1
+U 9
+D 7
+U 3
+D 8
+R 3
+U 3
+L 7
+D 9
+L 8
+U 8
+L 6
+R 7
+D 1
+U 1
+R 5
+L 3
+R 7
+U 8
+R 8
+D 5
+L 4
+R 5
+D 6
+L 7
+U 7
+R 9
+U 4
+R 5
+L 9
+R 7
+D 7
+U 3
+D 7
+L 3
+U 5
+D 2
+U 8
+D 1
+U 7
+R 7
+D 2
+U 8
+D 4
+R 7
+L 3
+U 3
+D 2
+R 9
+U 4
+D 4
+U 1
+L 4
+U 2
+D 7
+U 1
+L 4
+R 5
+L 3
+U 8
+R 4
+L 6
+U 6
+R 5
+U 3
+L 6
+D 7
+U 5
+R 2
+D 3
+L 6
+U 5
+L 7
+U 4
+R 6
+D 2
+L 1
+R 7
+L 1
+D 9
+L 6
+D 1
+R 1
+U 7
+R 4
+L 9
+D 9
+U 4
+D 8
+U 1
+L 8
+D 2
+U 9
+L 7
+R 10
+U 10
+L 10
+D 5
+R 9
+D 8
+L 1
+R 3
+L 7
+U 2
+L 1
+D 4
+R 5
+U 5
+D 1
+R 3
+D 3
+R 7
+U 2
+D 6
+U 6
+L 1
+D 7
+R 5
+L 9
+R 1
+U 7
+D 10
+U 3
+D 5
+U 8
+L 5
+R 8
+L 2
+R 9
+L 10
+R 9
+D 6
+U 1
+D 2
+L 7
+R 5
+L 6
+R 2
+D 9
+U 4
+L 8
+D 6
+L 10
+D 3
+U 8
+D 9
+U 5
+L 1
+U 9
+R 2
+D 5
+L 7
+U 4
+D 10
+U 6
+D 7
+U 6
+L 3
+D 2
+R 6
+L 10
+R 7
+U 4
+L 6
+D 1
+R 3
+D 8
+U 5
+L 7
+U 4
+L 6
+U 5
+L 3
+D 4
+U 4
+L 4
+D 6
+U 7
+L 10
+D 5
+L 7
+D 3
+U 3
+L 1
+D 3
+U 8
+D 2
+R 5
+U 7
+D 3
+L 5
+D 2
+L 2
+R 7
+L 10
+D 2
+U 2
+R 2
+D 9
+R 4
+L 4
+R 9
+D 8
+L 1
+U 8
+L 8
+R 4
+L 9
+U 11
+L 3
+R 4
+U 6
+L 11
+U 8
+R 4
+D 9
+R 5
+D 9
+U 11
+D 4
+R 1
+U 6
+L 8
+R 10
+D 11
+U 6
+D 4
+U 2
+D 7
+L 3
+R 5
+L 7
+R 5
+L 7
+D 2
+L 7
+U 9
+D 3
+L 6
+R 2
+U 6
+L 8
+R 10
+U 3
+R 7
+L 8
+U 1
+D 4
+L 1
+U 1
+D 6
+L 5
+U 4
+R 3
+U 7
+R 5
+U 11
+L 11
+R 11
+L 2
+R 3
+U 2
+R 10
+L 4
+U 8
+L 6
+R 8
+L 11
+U 6
+D 2
+L 7
+D 10
+R 3
+L 6
+R 8
+D 4
+U 7
+D 4
+R 1
+D 6
+R 11
+D 11
+R 9
+U 10
+R 7
+D 8
+U 4
+L 3
+R 9
+U 2
+D 3
+L 7
+R 10
+L 9
+D 11
+U 5
+L 10
+D 2
+R 10
+D 7
+U 4
+R 8
+D 9
+L 3
+R 4
+L 11
+D 4
+U 5
+R 7
+U 3
+R 9
+D 11
+R 1
+D 10
+R 2
+U 8
+L 7
+R 9
+U 9
+D 11
+R 6
+L 2
+D 4
+R 4
+D 6
+L 12
+D 11
+R 5
+U 1
+R 9
+L 9
+D 7
+L 1
+R 6
+L 4
+U 4
+R 10
+D 12
+R 1
+U 8
+D 8
+L 1
+U 12
+D 2
+R 7
+U 12
+L 10
+D 12
+R 6
+U 10
+D 8
+L 8
+U 1
+R 4
+L 7
+D 1
+L 7
+R 7
+U 4
+L 12
+U 6
+D 1
+U 8
+R 12
+L 11
+D 12
+R 3
+D 11
+U 2
+R 9
+D 11
+L 9
+R 1
+U 7
+D 9
+U 8
+L 8
+D 11
+R 9
+U 5
+D 6
+U 8
+D 6
+U 8
+D 11
+L 3
+D 4
+R 1
+U 6
+L 10
+U 11
+D 11
+U 5
+D 1
+R 3
+D 2
+L 4
+R 4
+D 10
+L 3
+D 12
+U 5
+R 1
+U 9
+D 1
+U 2
+R 7
+L 7
+U 8
+L 9
+D 4
+U 6
+R 9
+U 4
+L 11
+U 5
+L 6
+D 4
+U 8
+L 11
+U 2
+L 4
+U 1
+D 9
+R 2
+L 5
+D 8
+R 11
+U 7
+L 9
+D 2
+U 12
+R 13
+D 1
+L 10
+D 5
+R 9
+U 2
+L 10
+U 12
+R 4
+U 11
+D 4
+L 3
+U 12
+D 9
+R 9
+L 2
+D 5
+L 2
+U 6
+D 6
+L 1
+U 8
+R 9
+D 1
+L 11
+R 4
+D 4
+U 7
+R 9
+U 1
+L 5
+D 6
+U 2
+D 8
+U 6
+L 2
+D 11
+L 2
+D 11
+U 12
+D 6
+U 12
+R 13
+D 13
+L 6
+U 7
+L 1
+D 12
+U 9
+L 2
+U 13
+R 3
+U 8
+L 9
+D 13
+R 4
+U 4
+D 2
+L 7
+R 1
+D 1
+L 4
+R 12
+U 2
+D 12
+L 11
+U 10
+L 5
+U 9
+D 11
+R 7
+L 4
+D 10
+L 10
+U 5
+R 8
+L 5
+R 12
+L 9
+D 3
+U 11
+L 4
+R 8
+U 8
+R 9
+D 11
+U 10
+L 11
+U 4
+D 6
+R 3
+U 3
+R 13
+L 5
+D 9
+U 5
+R 1
+L 4
+D 9
+U 10
+R 8
+D 3
+L 7
+R 5
+U 2
+R 11
+U 12
+D 12
+R 3
+L 5
+D 13
+U 6
+R 5
+U 11
+D 12
+L 8
+U 14
+L 2
+R 4
+U 7
+R 9
+L 10
+U 4
+L 4
+R 12
+D 13
+R 6
+L 12
+D 6
+R 6
+D 9
+L 1
+U 8
+L 11
+D 2
+L 14
+R 10
+D 1
+U 8
+D 13
+L 3
+R 10
+U 4
+D 12
+R 12
+U 4
+D 2
+L 4
+U 6
+D 1
+U 7
+R 11
+U 7
+D 10
+R 6
+U 4
+D 2
+U 1
+L 2
+R 9
+D 3
+R 8
+D 12
+L 11
+U 2
+L 3
+U 5
+D 6
+L 14
+R 9
+L 14
+R 12
+U 12
+R 8
+L 13
+U 6
+L 10
+D 5
+U 14
+D 11
+L 11
+R 8
+L 6
+D 13
+R 5
+D 6
+L 7
+R 6
+D 8
+L 7
+D 9
+L 9
+U 8
+D 11
+L 7
+U 2
+D 9
+L 14
+R 3
+L 1
+D 9
+L 9
+R 1
+L 9
+U 6
+L 13
+D 7
+L 8
+D 2
+L 11
+U 8
+L 9
+U 7
+D 14
+L 11
+R 10
+D 1
+R 3
+D 9
+U 13
+D 3
+U 4
+R 2
+L 6
+U 11
+R 3
+L 9
+D 15
+R 12
+D 4
+L 14
+U 11
+L 2
+R 1
+L 10
+U 5
+R 11
+U 13
+R 13
+U 14
+D 2
+U 5
+D 14
+R 9
+D 8
+R 13
+L 1
+U 2
+R 7
+U 5
+L 8
+U 9
+R 3
+U 8
+R 9
+L 7
+R 15
+L 3
+D 12
+U 14
+R 12
+L 1
+R 9
+U 5
+R 4
+U 1
+D 4
+R 12
+L 2
+D 7
+U 2
+D 14
+U 2
+R 5
+D 12
+U 2
+D 5
+R 11
+L 5
+R 8
+D 10
+R 11
+L 12
+D 11
+L 6
+R 14
+D 2
+L 8
+R 6
+L 12
+R 13
+L 7
+R 4
+U 4
+D 15
+R 14
+D 5
+L 12
+U 7
+L 5
+D 5
+L 11
+U 10
+D 10
+L 13
+D 8
+R 10
+U 1
+L 6
+U 3
+L 12
+D 15
+U 12
+L 13
+U 7
+R 1
+L 13
+D 13
+U 2
+D 15
+U 2
+D 4
+L 7
+U 11
+R 9
+D 11
+L 9
+D 10
+U 9
+D 14
+R 8
+D 13
+U 16
+D 14
+R 13
+D 3
+L 9
+R 5
+D 2
+R 4
+D 14
+U 7
+D 5
+R 8
+L 14
+R 7
+U 4
+L 4
+R 15
+L 1
+U 12
+R 8
+L 4
+R 14
+L 13
+D 11
+U 3
+R 11
+D 11
+R 2
+D 10
+R 4
+D 8
+L 10
+R 3
+L 4
+R 16
+U 8
+D 9
+R 8
+D 15
+U 16
+R 15
+D 7
+R 10
+L 7
+R 2
+U 3
+R 16
+D 13
+L 10
+U 13
+D 8
+U 15
+D 3
+U 3
+L 16
+U 3
+R 11
+D 6
+R 12
+U 11
+R 2
+D 1
+U 3
+L 7
+U 9
+D 12
+R 13
+L 13
+U 5
+D 16
+L 14
+D 13
+U 15
+D 3
+U 15
+R 11
+D 16
+R 7
+D 2
+L 14
+R 8
+L 10
+R 3
+L 2
+U 2
+L 9
+D 5
+L 2
+D 12
+R 3
+U 7
+R 4
+U 2
+L 9
+R 13
+L 7
+U 16
+R 4
+D 1
+U 7
+R 3
+U 9
+L 6
+U 6
+D 7
+U 8
+D 16
+L 14
+U 16
+D 8
+U 6
+L 8
+D 2
+R 6
+U 14
+L 16
+R 7
+L 15
+U 15
+D 12
+R 2
+U 15
+R 8
+D 9
+R 6
+U 9
+D 1
+R 14
+U 7
+D 12
+R 7
+U 14
+R 16
+D 5
+R 11
+L 8
+U 4
+L 7
+D 8
+R 10
+D 9
+U 4
+L 5
+U 6
+D 17
+L 1
+U 16
+L 16
+R 14
+D 14
+U 3
+L 10
+D 3
+R 10
+U 2
+D 17
+R 12
+L 14
+D 10
+L 16
+U 14
+R 3
+L 17
+D 5
+U 14
+R 15
+D 5
+L 2
+R 6
+U 2
+L 5
+R 2
+L 10
+R 14
+L 16
+U 7
+L 5
+R 12
+L 13
+U 5
+L 13
+R 10
+L 12
+U 5
+R 15
+D 1
+U 12
+R 8
+D 12
+R 14
+U 7
+R 3
+L 15
+U 9
+D 10
+U 3
+R 17
+L 11
+D 4
+L 17
+R 5
+L 10
+R 3
+U 4
+L 3
+D 5
+R 1
+D 11
+L 9
+R 1
+L 9
+D 11
+L 1
+D 2
+U 6
+L 15
+U 1
+L 9
+D 11
+U 18
+D 16
+L 1
+R 1
+L 12
+U 3
+L 7
+R 14
+D 11
+R 9
+D 10
+L 7
+D 2
+L 10
+D 18
+R 13
+D 10
+R 16
+D 6
+U 8
+D 12
+R 6
+L 7
+D 16
+L 16
+U 11
+R 13
+D 12
+R 3
+D 2
+U 8
+L 9
+R 12
+L 11
+D 2
+L 17
+D 10
+U 12
+R 7
+D 15
+U 5
+L 10
+R 1
+U 13
+L 12
+R 7
+D 17
+U 5
+D 13
+U 13
+R 4
+U 14
+L 16
+R 18
+U 17
+L 16
+U 13
+R 5
+L 6
+U 6
+D 10
+R 6
+U 10
+L 8
+D 8
+L 3
+R 4
+U 17
+R 11
+D 14
+U 5
+L 17
+R 3
+U 6
+D 3
+R 11
+U 15
+D 4
+R 2
+D 9
+U 13
+L 12
+R 14
+L 17
+D 4
+U 14
+L 4
+U 11
+R 11
+L 6
+R 15
+L 18
+D 8
+U 2
+R 17
+D 10
+U 15
+D 18
+L 1
+D 6
+R 5
+D 14
+L 10
+D 16
+L 7
+D 15
+L 15
+D 15
+L 6
+U 4
+D 15
+U 17
+L 13
+R 10
+U 15
+D 16
+U 9
+R 9
+D 16
+R 12
+U 16
+D 11
+L 9
+R 5
+L 14
+R 1
+L 3
+D 4
+R 4
+D 5
+U 13
+D 14
+L 9
+U 4
+R 19
+D 3
+R 13
+U 17
+R 2
+D 13
+R 14
+L 18
+D 12
+L 5
+D 11
+U 19
+D 14
+U 2
+R 1
+U 18
+D 1
+L 9
+R 17
+U 10
+L 9
+D 15
+L 15
+U 15
+R 19
+D 17
+R 19
+D 9
+L 11
+U 16
+D 10
+U 6
+D 17
+R 3
+D 19
+R 13
+L 16
+R 2
+D 9
+R 3
+L 7
+R 18
+L 6
+U 5
+D 15
+L 5
+D 19
+R 6
+D 14
+U 16
+D 9
+L 18
+U 19
+L 10
+D 13
+R 18
+U 8
+L 5
+R 13
+U 15
+R 6
+D 12
+R 10
+D 5
+U 17
+R 9
+U 2
+D 14
+R 18
+D 3
+L 7
+D 5
+R 15
+U 2
+L 6
+R 5
+D 17
+L 19
+R 14
+U 13
+D 16
+U 1
+D 18
+L 14
+U 4
+R 8
+L 16
+D 15
+U 8
diff --git a/aoc22/day9/src/main.rs b/aoc22/day9/src/main.rs
new file mode 100644
index 0000000..f1043f7
--- /dev/null
+++ b/aoc22/day9/src/main.rs
@@ -0,0 +1,149 @@
+use std::collections::HashSet;
+
+fn main() {
+ let input = lib::read_input(9);
+
+ part1(&input);
+ part2(&input);
+}
+
+type P = [i32; 2];
+
+fn part1(input: &str) {
+ let mut visited = HashSet::new();
+
+ let mut head = [0, 0];
+ let mut tail = [0, 0];
+ visited.insert(tail);
+
+ for line in input.lines() {
+ let (dir, dist) = line.split_at(1);
+ let dist = dist[1..].parse::<i32>().unwrap();
+
+ let d = match dir {
+ "L" => [-1, 0],
+ "U" => [0, -1],
+ "D" => [0, 1],
+ "R" => [1, 0],
+ _ => panic!("invalid direction"),
+ };
+
+ for _ in 0..dist {
+ head[0] += d[0];
+ head[1] += d[1];
+
+ if distance(tail, head) <= 1 {
+ continue;
+ }
+
+ let m = len1(tail, head);
+
+ tail[0] += m[0];
+ tail[1] += m[1];
+
+ visited.insert(tail);
+ }
+ }
+ println!("{}", visited.len());
+}
+
+fn part2(input: &str) {
+ let mut visited = HashSet::new();
+
+ let mut rope = [[0, 0]; 10];
+ visited.insert(rope[9]);
+
+ for line in input.lines() {
+ let (dir, dist) = line.split_at(1);
+ let dist = dist[1..].parse::<i32>().unwrap();
+
+ let d = match dir {
+ "L" => [-1, 0],
+ "U" => [0, -1],
+ "D" => [0, 1],
+ "R" => [1, 0],
+ _ => panic!("invalid direction"),
+ };
+
+ for _ in 0..dist {
+ rope[0][0] += d[0];
+ rope[0][1] += d[1];
+
+ for i in 1..rope.len() {
+ if distance(rope[i], rope[i - 1]) <= 1 {
+ break;
+ }
+
+ let m = len1(rope[i], rope[i - 1]);
+
+ rope[i][0] += m[0];
+ rope[i][1] += m[1];
+
+ if i == rope.len() - 1 {
+ visited.insert(rope[i]);
+ }
+ }
+ }
+
+ // print(&visited, &rope);
+ }
+ println!("{}", visited.len());
+}
+
+fn distance(a: P, b: P) -> i32 {
+ (a[0] - b[0]).abs().max((a[1] - b[1]).abs())
+}
+
+fn len1(from: P, to: P) -> P {
+ [
+ (to[0] - from[0]).clamp(-1, 1),
+ (to[1] - from[1]).clamp(-1, 1),
+ ]
+}
+
+fn print(visited: &HashSet<P>, rope: &[P]) {
+ let x_min = *visited
+ .iter()
+ .map(|[x, _]| x)
+ .min()
+ .unwrap()
+ .min(rope.iter().map(|[x, _]| x).min().unwrap());
+ let x_max = *visited
+ .iter()
+ .map(|[x, _]| x)
+ .max()
+ .unwrap()
+ .max(rope.iter().map(|[x, _]| x).max().unwrap());
+ let y_min = *visited
+ .iter()
+ .map(|[_, y]| y)
+ .min()
+ .unwrap()
+ .min(rope.iter().map(|[_, y]| y).min().unwrap());
+ let y_max = *visited
+ .iter()
+ .map(|[_, y]| y)
+ .max()
+ .unwrap()
+ .max(rope.iter().map(|[_, y]| y).max().unwrap());
+
+ for y in y_min..=y_max {
+ for x in x_min..=x_max {
+ if x == 0 && y == 0 {
+ eprint!("\x1b[31m");
+ }
+ if [x, y] == rope[0] {
+ eprint!("H");
+ } else if let Some((i, _)) = rope.iter().enumerate().find(|(i, &b)| b == [x, y]) {
+ eprint!("{}", i);
+ } else if visited.contains(&[x, y]) {
+ eprint!("#");
+ } else {
+ eprint!(".");
+ }
+ eprint!("\x1b[0m");
+ }
+ eprintln!();
+ }
+ eprintln!();
+}