summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-02 00:41:10 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-02 00:41:10 -0500
commit76e71bc89d995078c914b63f909d7ee346caf5d9 (patch)
tree74b616b82ecf49833924040b3ad624c31181d18c
parentdf910f1c02fcf433b75330d38552be1831540ede (diff)
downloadadvent-of-code-76e71bc89d995078c914b63f909d7ee346caf5d9.tar.gz
advent-of-code-76e71bc89d995078c914b63f909d7ee346caf5d9.zip
day 2
-rw-r--r--data/2022/2.txt2500
-rw-r--r--src/2022/2/mod.rs136
-rw-r--r--src/2022/mod.rs4
3 files changed, 2640 insertions, 0 deletions
diff --git a/data/2022/2.txt b/data/2022/2.txt
new file mode 100644
index 0000000..fb2c7eb
--- /dev/null
+++ b/data/2022/2.txt
@@ -0,0 +1,2500 @@
+A Y
+B Y
+B Z
+B Z
+A Y
+C Y
+A Y
+C Y
+A Y
+B X
+B Y
+B Z
+A Y
+A Y
+C Y
+C Y
+A Y
+C Y
+B Y
+A Y
+A Y
+C Y
+C X
+A Y
+B Z
+C Y
+A Y
+C Y
+A Y
+C Y
+A Z
+A Y
+C Y
+B Y
+A Y
+C Y
+B X
+B Z
+C X
+B Z
+B X
+C Y
+B Z
+A Y
+C Y
+B X
+A Y
+A Z
+B Y
+C Y
+A X
+C X
+C Y
+C Y
+A Y
+C X
+A Y
+C X
+C Y
+C Y
+A Y
+C Y
+A Z
+A Y
+B Z
+A Y
+A Y
+B X
+A Y
+B Y
+A Y
+B X
+B Y
+C Y
+A Y
+B X
+A Y
+C X
+B Y
+A Y
+B Z
+C Y
+C Y
+B Y
+B Z
+B Z
+B Y
+B Y
+A Y
+A Y
+A Z
+C Y
+B X
+A Y
+B Y
+A Y
+B X
+C Y
+A Z
+C Y
+C Y
+A Y
+A Y
+C Y
+C Y
+B X
+A Y
+A Y
+B X
+A Y
+C Y
+B Z
+A Y
+B Z
+C Y
+C X
+C Y
+B Z
+C Y
+A Y
+A Y
+B Y
+C X
+A X
+B X
+A Y
+C Y
+C Y
+A Y
+A Y
+C Y
+C Y
+A Z
+B X
+C Y
+B X
+A Y
+C Y
+A Y
+A Z
+C Y
+A Y
+A Y
+A Y
+C Y
+B X
+C Y
+A Y
+A X
+C Y
+A Y
+B X
+C Y
+A Y
+A Y
+B Y
+A Y
+A Y
+C Y
+B Y
+B X
+A Y
+A Y
+B X
+A Y
+C Y
+A X
+C Y
+C Y
+A Y
+B Z
+A Y
+A Y
+C Y
+A Y
+A Y
+C Y
+A Z
+B Z
+A Y
+C Y
+B X
+B X
+A Y
+A Y
+C Y
+A Y
+A Y
+C Y
+B Z
+B Z
+B Y
+B Y
+A Y
+A Y
+A Y
+A Y
+A Y
+C X
+A Y
+A Y
+A Y
+B Z
+C Y
+A Y
+B Z
+A Y
+A Y
+A Y
+B Z
+A Z
+C X
+B X
+B Z
+B Y
+B Y
+C Y
+C Y
+B Y
+A Y
+C Y
+A Y
+A Y
+C Y
+B X
+A Y
+A X
+A Y
+A Y
+B Z
+C Z
+A Y
+B X
+C Y
+C Y
+A Y
+A Z
+A Y
+C Y
+C Y
+C Y
+A Y
+A Y
+C Y
+C Y
+A Y
+A Y
+A X
+A Y
+C Y
+B X
+B Z
+C Y
+A Y
+A X
+A Y
+C X
+C Y
+B Z
+B Y
+A Y
+C X
+C Y
+C Y
+C X
+C Y
+B X
+A Y
+A Y
+A Y
+A Z
+C Y
+A Y
+C Y
+A Y
+B Y
+C X
+A Y
+A Y
+A Y
+C Y
+B Z
+A Y
+C X
+B Y
+A Y
+B Z
+A Y
+C Y
+C Y
+A Y
+B Z
+C Y
+A Z
+C Y
+A Y
+B X
+A Y
+A Z
+A Z
+A Z
+C Y
+C Y
+A Z
+B Y
+A Z
+A Y
+C X
+C Y
+A Y
+A Y
+B Y
+A Y
+A Y
+A Y
+B Y
+C Y
+A Y
+C Y
+A Y
+C X
+A Y
+A Z
+A Y
+A Y
+A Y
+C Y
+A Y
+C Y
+A Y
+A Y
+C X
+A Y
+C Y
+B Z
+C Y
+A Y
+B Y
+A Z
+C Y
+B Y
+A Y
+A Y
+A Y
+A Y
+A Y
+B Z
+B Z
+B Z
+A X
+A Y
+B Z
+A Y
+A Y
+C Y
+C Y
+B Z
+A Y
+B X
+C Y
+A Y
+A Y
+B Y
+C Y
+B Z
+A Y
+A Y
+A Y
+B X
+B Y
+C Y
+A Y
+A Y
+B X
+A Y
+B Z
+C X
+C X
+A Y
+C Z
+C Y
+C Y
+A Z
+B Z
+C Y
+A Y
+A Y
+C Y
+C Y
+C Y
+A Y
+A X
+B Z
+A Y
+A Y
+B Y
+B Y
+C Y
+B Y
+B Y
+B Z
+C Y
+C Y
+B Y
+A Y
+C Y
+A Y
+A Y
+B Y
+A Y
+A X
+A Y
+B Y
+A Y
+B Y
+C Y
+A Y
+B Z
+A Y
+B Y
+A Y
+A Y
+C X
+C Y
+C X
+A Z
+C Z
+B Y
+B Y
+C Y
+B Y
+A Y
+A Y
+B Y
+C Y
+C Y
+C Y
+A Y
+B Z
+B X
+C Y
+C Y
+A Z
+A Z
+A Y
+A Y
+A Y
+B Y
+A Y
+B Y
+A Y
+B Z
+A Z
+B Y
+C Y
+C Y
+C Z
+B Z
+B Y
+B X
+A Y
+B X
+B X
+B Y
+C Y
+B Z
+A Y
+C Y
+A Y
+C Z
+B Y
+A Y
+A Y
+C Y
+B Y
+C Y
+B Y
+B Y
+A Y
+A Y
+A Z
+C X
+A Y
+A Y
+C Y
+A Y
+B Z
+A Y
+A Y
+A Y
+C Z
+C Y
+B Z
+C Y
+B Z
+A Y
+B Z
+B Y
+A Y
+B Y
+A Y
+A Y
+A Y
+A Y
+C Y
+C Y
+C Z
+B Y
+C Y
+C Y
+A Y
+A Z
+A Y
+B Z
+A Y
+C Y
+C Y
+A Y
+A Y
+A Y
+B Z
+A Z
+A Y
+A Y
+A Y
+A Y
+A Y
+B Z
+B Z
+A Y
+A Y
+B Z
+A Z
+A Z
+A Y
+B Y
+B Y
+B Z
+A Y
+B Z
+C Y
+B Z
+B Y
+A Y
+A Y
+C Y
+C Y
+C Y
+A Y
+A Y
+C Y
+C X
+C Y
+A Y
+B Z
+A Y
+B X
+B Y
+B Y
+B X
+A Y
+A Z
+C Y
+B Z
+C Y
+A Z
+A Y
+A Y
+A Y
+C Y
+C X
+A Y
+C Y
+A Y
+B Z
+C Y
+A Y
+B Z
+A Y
+C Y
+A Y
+C Y
+B Y
+C Y
+B X
+A Y
+A Z
+C Y
+A Y
+C X
+C Y
+A Y
+C Y
+A Y
+C Y
+A Z
+B Y
+A Y
+B Z
+C Y
+C Z
+A Y
+A Y
+A Z
+A Y
+A Y
+C Y
+B Y
+C Z
+A Y
+B Y
+C X
+B Z
+C Y
+C Y
+B Z
+B Z
+A Y
+B Y
+C Y
+B Y
+C Y
+B Y
+A Z
+C Y
+B Z
+A Y
+A Y
+C Y
+A Y
+B Z
+A Y
+A Y
+C Y
+C Y
+A Z
+A Y
+A X
+C Y
+B Y
+B Y
+B Z
+B Y
+B Y
+C Y
+A Y
+C Y
+A Y
+A Y
+B X
+C Y
+B X
+A Y
+A Y
+B Y
+B Z
+C Y
+A Y
+C Y
+A Y
+A Y
+C Y
+B Y
+C Y
+B Y
+B X
+C Y
+A Y
+A Y
+B Z
+B Y
+B Y
+A Y
+A Y
+A Y
+A Y
+A Y
+C Y
+A Y
+A Y
+C Y
+A Y
+B Y
+C Y
+A Y
+A Y
+A Y
+C Y
+A Y
+B Y
+B Y
+A Z
+A Y
+C Y
+B Y
+C Y
+A Z
+B Z
+A X
+B Y
+B Z
+A Y
+A Y
+C Y
+B Y
+A Y
+B Z
+A Z
+C Y
+C Y
+A Y
+B X
+C Y
+A Y
+C Y
+C Y
+B Z
+A Y
+A Y
+A Y
+C Y
+A Y
+C Y
+B Y
+B Y
+B Y
+A Z
+C X
+B X
+C Y
+A Y
+A Y
+A Y
+A Y
+C Y
+A Y
+B Y
+A Y
+C Z
+C Y
+A Z
+B Y
+A Y
+C Z
+C X
+B Y
+C X
+A Y
+B Z
+A X
+B Y
+B Y
+B X
+C X
+A Z
+C Y
+B Y
+C Y
+A Z
+C Y
+C Y
+C Y
+A Y
+A Y
+A Y
+C Y
+A Y
+A Y
+C X
+B Z
+C Y
+C Y
+B Z
+C Y
+B Y
+B Z
+A Y
+B X
+A Y
+C Y
+A Y
+A Y
+A Y
+A Y
+B Z
+C Y
+C Y
+B Z
+B Y
+C Y
+C Z
+C Y
+C Y
+B Y
+A Y
+A Y
+A Y
+A Z
+C Y
+A Y
+A Y
+C Y
+A Y
+A Y
+B Y
+A Y
+A X
+A Y
+A Z
+B Y
+C Y
+A Y
+A Y
+C Y
+A Y
+B Z
+B Z
+C Y
+C Y
+A Y
+A Y
+B Z
+B Z
+A Y
+B Y
+C Y
+A Y
+B Y
+C Y
+A Y
+C Y
+B X
+A Y
+A Y
+A Y
+A Y
+A Y
+B X
+C Y
+C Y
+B Y
+A Y
+C Y
+B Y
+C Z
+C Y
+B X
+C Y
+A Y
+C Y
+C Y
+C Y
+C Y
+B X
+A Y
+C Y
+A X
+A Y
+C X
+A X
+C X
+C Y
+A X
+C Y
+C Z
+C Y
+A Y
+A Y
+A Z
+C Y
+C Y
+B Z
+A Y
+C Y
+A Y
+A Y
+B Z
+C Z
+A Y
+A Y
+C Y
+A Y
+A Y
+B Y
+A X
+A Y
+B Z
+A X
+C Y
+B X
+A Y
+A Z
+C Y
+B Z
+B Y
+B Y
+A X
+A Z
+B Z
+C X
+C Y
+B X
+B Z
+C Y
+C Y
+C Y
+A Y
+C Y
+B X
+C Y
+A Y
+A Y
+A X
+C Z
+B Z
+C Z
+C Y
+B Y
+C Y
+A Y
+A Y
+C Y
+C Y
+B Y
+C Y
+C Y
+C Y
+A Y
+B X
+A Y
+B Y
+C Y
+B X
+C Y
+C Y
+B Y
+A Y
+B Y
+B Y
+C Y
+A Y
+B X
+C X
+C Y
+B X
+A Y
+A Y
+B Z
+B Y
+A Y
+B Y
+B Y
+A Z
+B X
+B Z
+C Y
+B Y
+C Y
+A Y
+A Y
+B X
+A Y
+C X
+B Y
+B Z
+B X
+C X
+C Y
+C X
+A Y
+C Y
+B Y
+B Y
+A Y
+B X
+C Y
+C Y
+B X
+B X
+C Y
+B Z
+B Y
+A Y
+C Y
+B X
+C Y
+A Y
+A Z
+A Y
+A Y
+C Y
+A Z
+A Y
+B Z
+A Y
+B Y
+B X
+B Z
+B Y
+C Y
+A Y
+A Y
+C X
+B Y
+A Y
+B Y
+A Y
+C Y
+C Y
+A Y
+B Y
+B Y
+B Y
+C Y
+A Y
+B Y
+B X
+B X
+A Y
+C Y
+C Y
+A Y
+A Y
+A Y
+A Z
+C Y
+A Y
+C Y
+A Y
+B Z
+C Y
+C X
+C Y
+A Y
+C X
+B Z
+C X
+A Y
+B X
+A Y
+C Z
+C X
+A X
+A Y
+C Y
+B X
+A X
+B Y
+A Y
+A Y
+A Y
+C X
+A Z
+B Z
+C Y
+A Y
+C Y
+C Y
+C X
+C Y
+B Y
+C Y
+B Z
+B Z
+C Y
+B Y
+A Y
+A Y
+A Y
+B Y
+C Y
+A Y
+A Y
+C Y
+B Y
+B Y
+C Y
+A X
+A Y
+A Y
+A Z
+A Y
+B Y
+C Y
+A Y
+A Y
+A Y
+C Y
+A Y
+B X
+A Y
+C Y
+A Y
+A Y
+B Z
+B Y
+B Z
+C Y
+A Y
+A Z
+A Y
+A Y
+B Y
+A Y
+C Y
+C Y
+A Y
+B Y
+C X
+B Z
+A Y
+C Y
+B X
+B Y
+C Y
+B Y
+C Z
+A Z
+A Y
+C Y
+A Y
+C Y
+C X
+A Y
+C Y
+B X
+C Y
+A Y
+A Y
+C Y
+A Z
+B X
+B Z
+A Y
+B Z
+B Y
+A Z
+B Y
+A Y
+C Y
+A Y
+C Y
+C Y
+A Y
+B Y
+C Y
+A Y
+A Y
+B X
+A Y
+A Y
+A Y
+C Y
+A Z
+B Y
+B X
+A Y
+B Y
+C Y
+A Y
+C Y
+A Z
+B X
+A Y
+A Y
+A Y
+A Z
+A Y
+B Y
+B Z
+B Z
+A Y
+A Z
+A Y
+B X
+A Y
+A Y
+A Y
+C Y
+A Y
+A Y
+A Z
+C Y
+A Y
+A Y
+B X
+B Y
+C Y
+B X
+C Y
+A Y
+B Y
+A Y
+C Y
+C Y
+C Y
+C Y
+A Y
+C Y
+C Y
+B Y
+A Y
+C Y
+A Y
+A Y
+B Y
+A Y
+B Y
+C X
+A Y
+A Y
+A Y
+C Y
+B Z
+C Y
+A X
+A Y
+A Z
+A Y
+B X
+C X
+A Y
+B Y
+A Y
+A Y
+B Y
+A Y
+C Y
+A Y
+A Y
+B Z
+C Y
+A Y
+A X
+B Z
+A Y
+A Y
+A Z
+C Y
+A Z
+C Y
+B Y
+A Y
+C X
+B X
+A Y
+C X
+C X
+A Y
+A Y
+A X
+A Y
+A Y
+A Y
+B Y
+C X
+A Y
+C Y
+C Y
+A Y
+B Z
+A Y
+C Y
+B Z
+A Y
+C Y
+C Y
+B X
+B Y
+B Z
+A Y
+C Z
+C Y
+A Y
+C X
+A Y
+C X
+B Z
+A Y
+B Y
+A Y
+C Y
+B Y
+A Y
+B Y
+B X
+A Y
+B Y
+C Y
+A Y
+C Y
+C Y
+A X
+C Y
+C X
+A X
+A Y
+C Y
+C Y
+C X
+C X
+C Y
+C Y
+C Y
+A Z
+A Y
+B Z
+C Y
+C Y
+A Z
+A Y
+A Y
+C X
+A Y
+A Y
+A Y
+C Y
+A Y
+C Y
+A Y
+A Y
+A Y
+C Y
+C Y
+A Y
+B Y
+B Y
+A Z
+B X
+B X
+B Y
+C Y
+A Y
+A X
+A Y
+B X
+C Y
+B X
+C X
+C Y
+A Y
+A Y
+C Y
+A Y
+C Y
+A Y
+B Z
+C Y
+A Y
+B Y
+A Y
+A Y
+A Y
+A Y
+A Z
+C Y
+A Y
+B Y
+C Y
+C Y
+A Y
+C X
+A Y
+A Y
+C Y
+C Y
+C X
+B Y
+A Y
+A Y
+A Y
+A Y
+C Y
+A Y
+B X
+A Z
+A Y
+C Y
+B X
+A Y
+C Y
+A Y
+A Y
+A Y
+C Y
+B Y
+A Y
+A Y
+B Z
+C Y
+C X
+A Y
+A Y
+C Y
+A Y
+C X
+C Y
+C Y
+A Y
+C Y
+C Y
+C Y
+C X
+A Y
+A Y
+A Y
+A Y
+C Y
+B Y
+C Y
+A Y
+A Z
+B Z
+A Y
+B Y
+B Z
+C Y
+A X
+B Y
+C Y
+A Y
+A Y
+C Y
+A Y
+A Y
+A Z
+B Z
+C X
+B Y
+B Y
+C Y
+C Y
+C Y
+A Y
+A Y
+A Y
+A Y
+C Z
+B Y
+B Z
+C Y
+C Y
+A Y
+B Y
+C Y
+A Y
+A X
+B X
+C Y
+A Y
+C Y
+C X
+C Y
+A Y
+A Y
+B Y
+B X
+A Y
+C Y
+A Z
+B X
+C Y
+B X
+A Y
+B Z
+A Y
+A Y
+B Y
+B Z
+B X
+A Y
+B X
+B Z
+A Y
+C Y
+A Y
+A Y
+A Z
+B X
+A Y
+A Y
+B Y
+A Y
+B Z
+B X
+C Y
+C X
+C X
+C X
+A X
+A Y
+A Y
+A Y
+B Y
+A Y
+A Y
+A Y
+C Y
+B Y
+B X
+B Y
+C Y
+A Z
+A Y
+B Z
+A Y
+C Y
+A Y
+A Z
+B Z
+C Y
+B Z
+A Y
+C Y
+B Y
+C Y
+A Y
+C Y
+B Z
+B Y
+B X
+C X
+A Y
+A X
+B X
+C Y
+C Y
+A Y
+C Y
+B Y
+A Y
+B Z
+A Y
+B X
+A Y
+C Y
+A Y
+C Y
+C Y
+A Y
+A Y
+A Y
+C X
+B Y
+B Z
+B Y
+A Y
+A Y
+A Z
+B X
+A Y
+A Z
+C Y
+B Z
+B X
+A Y
+C Y
+A Y
+B Z
+A Y
+A Z
+B Y
+C X
+A Y
+C Y
+C Y
+C Y
+C Y
+A Y
+A Y
+B Y
+A Y
+C Y
+A Y
+B Z
+C Y
+A Z
+C Y
+A Y
+A Z
+C Y
+B X
+C Y
+C Y
+A Y
+A Y
+B Z
+B Y
+B X
+A Y
+A Y
+B Y
+A Y
+A Y
+B X
+B Y
+A Y
+C Y
+A Y
+C Y
+C Y
+B Y
+B Y
+C Y
+A Y
+A Z
+A Y
+A Y
+A Y
+C Y
+C X
+B Z
+C Y
+A Y
+A Y
+C Y
+A Y
+A Y
+A Z
+C X
+C Y
+A Y
+A Y
+C Y
+C Y
+A Y
+A Y
+C Y
+C X
+A Y
+A Y
+B Y
+A Z
+B Y
+A Y
+B Z
+C Y
+C Y
+A Y
+B Y
+A Y
+C Y
+B Z
+A Y
+A Y
+C X
+C Y
+C X
+A Y
+A Y
+A Y
+B Y
+C X
+A Y
+B X
+B Y
+C Y
+A Y
+C Y
+A Y
+A Y
+C Y
+A Z
+A Y
+C X
+A Y
+A Y
+C Y
+C Y
+C X
+A Y
+A Y
+C Y
+B Y
+A Y
+C Y
+A Y
+B Z
+A Y
+C Y
+A Y
+A Y
+A Z
+A Y
+B Z
+A Y
+A Y
+A Y
+A Y
+A Y
+C Z
+C X
+A Y
+A Z
+C Y
+C Y
+B Z
+A Y
+B X
+A Y
+A Y
+A Z
+B Z
+A Y
+A Y
+C Y
+A Y
+C Y
+B Z
+B X
+C X
+A Y
+B Y
+C Y
+C X
+B Y
+C Y
+A Y
+A Y
+A Y
+A Z
+B Y
+A Y
+C Y
+A Y
+A Y
+A Y
+A Y
+C Y
+C Y
+A Y
+A Z
+C Y
+B Y
+C Y
+C Y
+B Y
+A Y
+C Y
+B Z
+A Y
+A Y
+B Z
+C Y
+B Z
+C Y
+C Y
+B Z
+B Y
+A Y
+C X
+C Y
+B Y
+A Y
+A Y
+A Y
+B Z
+A Y
+B Y
+A Y
+C Y
+A Y
+A Y
+C Y
+A Z
+A Y
+C Y
+B Y
+A Y
+B Z
+C Y
+A Y
+A Y
+C Y
+B Z
+B Z
+A Y
+A Y
+A Y
+A Y
+A Y
+C Y
+A Y
+A Y
+A Y
+A Y
+C Y
+A Y
+C Y
+B X
+B Y
+A Y
+C Z
+B Y
+C Y
+C Y
+A Y
+C Y
+C Y
+A Y
+A Y
+A Y
+A Y
+B X
+B Z
+C Y
+B X
+B Y
+B Y
+B Z
+B X
+A Y
+A Y
+B Y
+B X
+A Y
+A Y
+C Y
+C X
+A Y
+B Y
+A Y
+B Y
+B Y
+B Y
+C Y
+A Y
+A X
+A Y
+C Y
+B X
+B Y
+A Y
+A X
+C Y
+C X
+A Y
+A Y
+A Y
+B Y
+C X
+A Z
+B Z
+A Y
+B Z
+A Y
+A Y
+A Y
+A Y
+B X
+A Y
+C Z
+C Y
+C Y
+C Y
+B Z
+A Y
+A Y
+B Z
+B Y
+A Z
+A Y
+A Y
+B Z
+C Y
+A Y
+C Y
+C Y
+C Y
+B X
+B Y
+A Y
+A Y
+A Y
+A Y
+B Y
+A Y
+B Z
+B Z
+A Y
+C Y
+C Y
+C Y
+A Y
+C Y
+B Y
+C Y
+A Y
+B Y
+B Y
+B X
+C X
+A Y
+A Y
+A Y
+B Y
+C Y
+B Y
+C X
+B Y
+B Y
+A Z
+C Z
+C X
+B Y
+C Y
+B Y
+C Y
+B Z
+A Y
+C Y
+A Y
+B Y
+C Y
+A Y
+A Y
+C Z
+B X
+A Z
+C Y
+C Y
+A Y
+B Z
+B Y
+C X
+A Y
+B Z
+A Y
+A Y
+A X
+A Y
+B Y
+C Y
+B Y
+A Y
+A Y
+B Y
+C Y
+B Y
+A Y
+A Y
+B Y
+C Y
+B Y
+C Y
+B Y
+B Y
+B X
+A Y
+A Y
+C X
+A Y
+C Y
+B Z
+A Y
+B Y
+A Z
+A Y
+A Y
+B Y
+C Y
+B Z
+A Z
+A Y
+B Z
+C Y
+A Y
+A Y
+A Y
+C X
+C Y
+A Y
+C Y
+A Y
+A Y
+B Z
+A Y
+A Z
+C Y
+C Y
+A X
+C X
+A Y
+B Z
+A Y
+A Y
+B Y
+A Y
+A Y
+B Z
+A Y
+B Y
+B Z
+A Y
+A Z
+A Y
+A Z
+C Y
+B Y
+A Y
+A Y
+B Z
+C X
+C Y
+A Y
+A Y
+A Y
+A Y
+A Y
+A Z
+C Y
+B X
+A Z
+B Y
+A Y
+A Z
+A Y
+C X
+A Y
+A Y
+C Z
+B Y
+C Y
+C Y
+B Y
+C X
+A Y
+A Y
+B Y
+A Y
+A Y
+A Y
+B Y
+B Y
+C Y
+A Y
+A Y
+B Y
+B X
+A Y
+A Y
+C Y
+B Y
+C Y
+B Z
+A Z
+C X
+B X
+A Y
+A Y
+A Y
+C Z
+A Y
+C Y
+B Y
+A Y
+B X
+A Y
+C Y
+A Y
+B Y
+A Y
+B X
+B Y
+A Y
+C Y
+C Y
+A Y
+A Y
+A Y
+A Y
+C Y
+C Y
+A Y
+A Y
+B Y
+C Y
+B Z
+C Y
+C Y
+C Z
+A Z
+B X
+C Y
+A Y
+B Y
+B Y
+A Y
+B X
+A Y
+B Y
+B X
+C Y
+B X
+B Y
+B Y
+B Z
+A Y
+A Z
+B Z
+A X
+C Y
+B X
+C X
+A Y
+B Z
+A Y
+A Y
+A Z
+C X
+A Y
+B Y
+B Y
+A Y
+A Z
+A Y
+B X
+B X
+A Y
+B Y
+C Y
+A Y
+B X
+B Z
+B Z
+B Z
+C X
+A Y
+C Y
+A Z
+B Y
+B Y
+A Y
+B Y
+C Y
+A Y
+A Z
+B X
+C Y
+C Y
+A X
+C Y
+C Y
+B Y
+B X
+C X
+A Y
+C X
+C Y
+A Y
+B Y
+A Y
+A Y
+B Z
+C Y
+B X
+A X
+C Y
+B X
+C Y
+C Y
+A Y
+C Y
+C Y
+C X
+A Y
+A Y
+B Y
+C Y
+C Y
+A Y
+C Y
+A Z
+A Y
+A Y
+B X
+A Y
+A Y
+A Y
+A Y
+A Y
+C Y
+B Y
+B Y
+A Y
+A Y
+B Y
+C Y
+B Y
+A Y
+A Y
+B Z
+C X
+A Y
+C Y
+B Y
+B X
+A X
+A Y
+B Y
+B X
+B Y
+A Y
+C Y
+A Z
+B Y
+C Y
+C Y
+B Z
+C Y
+C Y
+C Y
+C Y
+C Y
+A Y
+B Z
+C Y
+C Y
+A Z
+A Y
+B Z
+A Y
+B X
+C Y
+C X
+A Y
+A Y
+B Y
+A Z
+A Y
+C Z
+A Y
+B Y
+A Y
+B X
+A Y
+B Z
+C Y
+A Y
+A Z
+A Y
+B Y
+A Y
+B Z
+A Y
+A Y
+A Y
+A Y
+C X
+A Y
+B Z
+A Y
+B Z
+B X
+A Y
+B Y
+C Y
+B Z
+B Z
+C Y
+B Z
+A Z
+A Z
+B Z
+A Y
+C Y
+C Y
+A Y
+C Y
+B X
+C Y
+C Y
+B Z
+A Y
+A Y
+C Y
+B Y
+A Y
+C Y
+C Y
+A Y
+B Y
+A Y
+B Y
+A Y
+A Y
+A Y
+C Y
+B X
+B X
+C Y
+C Y
+B X
+A Y
+C Y
+A Y
+B Z
+A Z
+A Y
+C Y
+A Y
+C Y
+A Y
+C Y
+C Y
+C Y
+A Z
+A Y
+C Y
+B Y
+A Y
+A Y
+C Y
+C Y
+A Y
+B X
+B Y
+C Y
+B Y
+B Z
+C Y
+A Y
+C Y
+C Y
+C Y
+A X
+A Y
+C X
+A Z
+C Y
+C Y
+A Y
+C Y
+A Y
+C Y
+A Y
+A Y
+C Y
+B Y
+A Y
+A Y
+A Y
+C Y
+C Z
+A Z
+A Y
+C Y
+A Y
+A Z
+C Y
+A Y
+C Y
+B Y
+A Y
+B Y
+C Y
+B Y
+A Y
+A Z
+A Y
+B X
+C X
+C Y
+B Z
+C Y
+C Y
+A Y
+B X
+B Z
+A Y
+B Z
+B X
+A Y
+A Y
+A Y
+B X
+C Y
+C Y
+C Y
+C Y
+B Z
+A Y
+B Y
+B Z
+A Y
+A Z
+A Y
+A Y
+A Y
+B Z
+C Y
+A Y
+A Y
+B Y
+C Y
+C X
+A Y
+C Y
+A Y
+A Y
+A Y
+C Z
+A Z
+B Y
+A Z
+B X
+B Y
+A X
+A Y
+A Y
+C Y
+C Y
+B X
+A Z
+C Y
+B Y
+C X
+A Y
+A Y
+B Y
+C Y
+C Y
+A Y
+C X
+A Y
+A Y
+A Y
+A Y
+C Y
+C Y
+A Y
+C Y
+A Z
+A Y
+C Y
+A Y
+B X
+C Y
+C Y
+C Y
+B X
+B Y
+A Y
+A Y
+A Y
+C Y
+A Y
+A Y
+B Y
+A Y
+A Y
+C Y
+C Y
+A Y
+C Y
+C Y
+C Y
+C Y
+C Y
+B Z
+C Z
+C Y
+B X
+B Y
+C Y
+A Y
+A Y
+A Y
+A Y
+B Z
+A Y
+A Z
+C X
+A X
+A Y
+A Y
+C X
+C Y
+B Y
+A Y
+C Z
+B Y
+B Y
+C Z
+C Z
+A Y
+A Y
+A Y
+C X
+B Y
+B Z
+A Y
+A Y
+B Y
+C X
+B Y
+A Y
+C Y
+B Y
+A Y
diff --git a/src/2022/2/mod.rs b/src/2022/2/mod.rs
new file mode 100644
index 0000000..5f173ac
--- /dev/null
+++ b/src/2022/2/mod.rs
@@ -0,0 +1,136 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+
+use crate::prelude::*;
+
+#[derive(Copy, Clone, Eq, PartialEq)]
+enum Outcome {
+ Lose,
+ Draw,
+ Win,
+}
+
+impl Outcome {
+ fn score(self) -> i64 {
+ match self {
+ Self::Lose => 0,
+ Self::Draw => 3,
+ Self::Win => 6,
+ }
+ }
+}
+
+impl std::str::FromStr for Outcome {
+ type Err = ();
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(match s {
+ "X" => Self::Lose,
+ "Y" => Self::Draw,
+ "Z" => Self::Win,
+ _ => return Err(()),
+ })
+ }
+}
+
+#[derive(Copy, Clone)]
+enum Shape {
+ Rock,
+ Paper,
+ Scissors,
+}
+
+impl Shape {
+ fn score(self) -> i64 {
+ match self {
+ Self::Rock => 1,
+ Self::Paper => 2,
+ Self::Scissors => 3,
+ }
+ }
+
+ fn outcome(self, other: Self) -> Outcome {
+ match self {
+ Self::Rock => match other {
+ Self::Rock => Outcome::Draw,
+ Self::Paper => Outcome::Lose,
+ Self::Scissors => Outcome::Win,
+ },
+ Self::Paper => match other {
+ Self::Rock => Outcome::Win,
+ Self::Paper => Outcome::Draw,
+ Self::Scissors => Outcome::Lose,
+ },
+ Self::Scissors => match other {
+ Self::Rock => Outcome::Lose,
+ Self::Paper => Outcome::Win,
+ Self::Scissors => Outcome::Draw,
+ },
+ }
+ }
+
+ fn shape_for(self, outcome: Outcome) -> Self {
+ if Self::Rock.outcome(self) == outcome {
+ return Self::Rock;
+ }
+ if Self::Paper.outcome(self) == outcome {
+ return Self::Paper;
+ }
+ if Self::Scissors.outcome(self) == outcome {
+ return Self::Scissors;
+ }
+ unreachable!()
+ }
+}
+
+impl std::str::FromStr for Shape {
+ type Err = ();
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(match s {
+ "A" | "X" => Self::Rock,
+ "B" | "Y" => Self::Paper,
+ "C" | "Z" => Self::Scissors,
+ _ => return Err(()),
+ })
+ }
+}
+
+pub fn parse(fh: File) -> Result<impl Iterator<Item = String>> {
+ Ok(parse::lines(fh))
+}
+
+pub fn part1(lines: impl Iterator<Item = String>) -> Result<i64> {
+ Ok(lines
+ .map(|line| {
+ let mut parts = line.split(' ');
+ let them: Shape = parts.next().unwrap().parse().unwrap();
+ let me: Shape = parts.next().unwrap().parse().unwrap();
+ me.score() + me.outcome(them).score()
+ })
+ .sum())
+}
+
+pub fn part2(lines: impl Iterator<Item = String>) -> Result<i64> {
+ Ok(lines
+ .map(|line| {
+ let mut parts = line.split(' ');
+ let them: Shape = parts.next().unwrap().parse().unwrap();
+ let outcome: Outcome = parts.next().unwrap().parse().unwrap();
+ let me = them.shape_for(outcome);
+ me.score() + outcome.score()
+ })
+ .sum())
+}
+
+#[test]
+fn test() {
+ assert_eq!(
+ part1(parse(parse::data(2022, 2).unwrap()).unwrap()).unwrap(),
+ 13565
+ );
+ assert_eq!(
+ part2(parse(parse::data(2022, 2).unwrap()).unwrap()).unwrap(),
+ 12424
+ );
+}
diff --git a/src/2022/mod.rs b/src/2022/mod.rs
index ea3dd92..6647253 100644
--- a/src/2022/mod.rs
+++ b/src/2022/mod.rs
@@ -2,6 +2,8 @@ use crate::prelude::*;
#[path = "1/mod.rs"]
mod day1;
+#[path = "2/mod.rs"]
+mod day2;
// NEXT MOD
pub fn run(day: u8, puzzle: u8) -> Result<i64> {
@@ -9,6 +11,8 @@ pub fn run(day: u8, puzzle: u8) -> Result<i64> {
match (day, puzzle) {
(1, 1) => day1::part1(day1::parse(parse::data(2022, 1)?)?),
(1, 2) => day1::part2(day1::parse(parse::data(2022, 1)?)?),
+ (2, 1) => day2::part1(day2::parse(parse::data(2022, 2)?)?),
+ (2, 2) => day2::part2(day2::parse(parse::data(2022, 2)?)?),
// NEXT PART
_ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)),
}