diff --git a/day9/Cargo.lock b/day9/Cargo.lock new file mode 100644 index 0000000..f5578cf --- /dev/null +++ b/day9/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day9" +version = "0.1.0" diff --git a/day9/input.txt b/day9/input.txt new file mode 100644 index 0000000..949fccd --- /dev/null +++ b/day9/input.txt @@ -0,0 +1,2000 @@ +L 2 +D 1 +L 2 +U 2 +R 1 +D 2 +U 1 +R 2 +U 2 +L 1 +D 2 +L 1 +D 2 +L 2 +U 2 +D 2 +L 2 +R 1 +U 1 +D 2 +U 1 +L 1 +U 2 +D 2 +L 2 +D 2 +L 2 +R 2 +D 2 +U 2 +R 2 +U 2 +R 2 +U 1 +R 2 +D 2 +R 2 +D 1 +U 1 +L 1 +U 2 +R 1 +D 2 +U 1 +L 2 +D 2 +U 2 +L 1 +R 2 +D 2 +U 2 +D 1 +L 1 +U 2 +D 2 +L 2 +D 2 +R 2 +L 2 +R 2 +L 1 +U 2 +R 1 +D 1 +L 2 +U 1 +R 2 +U 1 +D 1 +U 2 +R 2 +U 2 +R 2 +D 2 +U 1 +D 2 +R 1 +U 1 +D 1 +R 1 +U 2 +L 2 +U 2 +R 1 +D 1 +R 2 +D 1 +L 2 +U 2 +R 2 +L 1 +R 2 +D 1 +U 2 +D 2 +L 1 +U 1 +R 2 +D 1 +U 2 +L 2 +U 2 +D 2 +L 2 +D 2 +R 1 +L 2 +U 2 +R 1 +D 1 +L 1 +D 3 +U 2 +D 2 +R 1 +L 3 +R 1 +U 2 +R 1 +L 2 +U 1 +L 3 +R 2 +U 2 +R 3 +U 3 +L 3 +U 1 +D 1 +R 3 +L 2 +U 1 +R 2 +U 1 +D 3 +U 1 +R 2 +L 2 +D 1 +L 1 +R 3 +U 2 +L 3 +R 2 +D 2 +L 1 +U 2 +R 2 +U 3 +L 1 +R 2 +L 3 +U 3 +L 1 +U 2 +R 2 +U 2 +D 2 +L 2 +U 1 +D 1 +U 2 +D 3 +R 2 +L 2 +U 1 +R 2 +D 3 +U 2 +L 2 +U 1 +R 1 +L 1 +D 1 +L 3 +R 2 +D 2 +L 2 +D 1 +U 3 +D 3 +U 3 +L 3 +R 2 +L 1 +U 2 +R 3 +U 2 +R 2 +U 3 +D 2 +U 1 +L 3 +U 1 +L 1 +D 2 +L 2 +R 1 +L 1 +D 3 +L 2 +D 2 +R 2 +L 3 +R 2 +L 2 +U 1 +L 3 +U 2 +R 2 +D 2 +U 2 +L 1 +D 3 +R 1 +U 3 +D 2 +U 3 +L 1 +D 2 +R 1 +U 3 +R 4 +L 1 +U 4 +R 2 +D 2 +U 3 +D 1 +L 1 +D 4 +L 3 +D 4 +L 3 +D 3 +U 4 +L 2 +D 1 +U 1 +R 4 +D 4 +L 2 +R 3 +U 3 +D 1 +L 3 +D 2 +L 4 +D 4 +R 3 +D 4 +U 4 +R 3 +L 4 +U 1 +L 1 +R 4 +D 2 +R 4 +U 3 +D 2 +R 4 +U 4 +D 1 +U 2 +D 3 +U 2 +L 3 +R 4 +L 1 +U 4 +D 3 +L 4 +R 2 +U 1 +R 1 +D 2 +L 2 +U 2 +L 3 +R 1 +L 2 +D 1 +R 3 +L 4 +U 2 +R 1 +U 1 +R 3 +L 3 +D 2 +U 2 +L 1 +R 1 +L 2 +D 2 +L 1 +R 2 +L 1 +U 1 +R 1 +L 4 +R 3 +U 4 +R 4 +L 2 +R 4 +L 1 +U 2 +R 3 +L 4 +U 1 +R 1 +D 1 +U 3 +L 1 +D 2 +U 2 +D 3 +R 4 +U 1 +R 3 +D 2 +U 1 +D 1 +U 4 +R 2 +D 4 +L 3 +R 4 +U 3 +D 4 +L 3 +U 2 +D 2 +L 4 +D 1 +L 2 +R 2 +U 3 +R 5 +L 3 +U 5 +L 4 +U 3 +D 1 +U 2 +D 5 +L 5 +D 3 +R 3 +D 3 +U 3 +D 5 +U 4 +D 5 +L 5 +R 2 +D 1 +R 5 +U 2 +L 2 +U 5 +L 1 +R 4 +U 5 +R 1 +D 5 +R 3 +U 1 +R 5 +D 5 +L 1 +D 4 +R 5 +L 1 +D 3 +U 2 +D 1 +U 1 +D 4 +L 5 +D 4 +R 1 +L 2 +U 3 +L 1 +U 3 +L 3 +U 4 +L 2 +R 4 +D 5 +U 1 +L 3 +U 5 +R 1 +D 4 +U 3 +L 5 +U 1 +L 3 +D 3 +R 4 +L 5 +U 1 +L 5 +U 2 +D 1 +R 2 +L 2 +D 4 +L 5 +D 2 +R 5 +L 4 +D 1 +R 5 +U 3 +R 2 +D 3 +L 1 +D 1 +L 4 +U 5 +L 2 +D 3 +R 5 +U 2 +L 1 +U 5 +D 4 +U 1 +R 2 +L 1 +U 2 +L 3 +D 1 +U 3 +L 1 +R 5 +U 3 +R 3 +U 2 +R 5 +L 5 +U 1 +L 5 +D 5 +R 1 +U 4 +L 6 +D 4 +U 2 +L 1 +U 5 +L 1 +R 6 +D 3 +U 5 +R 3 +U 5 +D 3 +R 3 +L 2 +U 2 +L 6 +R 3 +U 5 +D 5 +L 6 +R 1 +L 1 +D 5 +U 1 +R 5 +L 4 +R 1 +L 5 +D 1 +L 2 +U 4 +L 5 +U 4 +R 2 +L 1 +D 2 +R 4 +U 5 +D 4 +U 2 +L 3 +R 2 +L 1 +D 3 +U 1 +L 2 +U 6 +L 2 +U 3 +R 2 +D 1 +L 4 +R 5 +L 3 +U 5 +L 6 +R 3 +U 4 +L 2 +R 3 +U 3 +L 1 +D 5 +R 5 +D 5 +U 5 +L 6 +R 5 +L 4 +U 2 +R 5 +U 1 +D 2 +R 2 +D 1 +U 6 +L 5 +D 1 +R 6 +U 5 +R 3 +D 1 +R 4 +D 2 +U 5 +L 5 +R 2 +D 2 +R 1 +U 4 +R 3 +U 4 +L 6 +D 3 +R 4 +L 4 +U 5 +D 1 +U 1 +D 5 +U 4 +L 5 +D 1 +R 1 +U 5 +D 7 +R 5 +D 2 +R 2 +D 7 +L 1 +R 2 +D 2 +R 7 +U 4 +D 3 +U 3 +D 3 +L 4 +D 2 +R 6 +L 7 +D 6 +U 4 +D 1 +L 4 +U 3 +D 1 +U 1 +L 6 +D 4 +L 7 +U 6 +R 4 +L 7 +U 2 +D 5 +L 7 +U 3 +R 3 +U 6 +R 7 +U 4 +R 4 +L 4 +U 6 +R 6 +D 7 +U 4 +D 5 +L 4 +U 7 +R 7 +D 3 +L 5 +U 7 +D 3 +U 1 +D 7 +R 7 +L 4 +U 7 +D 1 +R 3 +D 3 +U 4 +R 2 +U 4 +R 4 +U 7 +R 4 +L 2 +U 4 +R 7 +L 6 +U 1 +D 2 +U 3 +D 1 +L 6 +D 5 +L 7 +R 6 +D 6 +L 4 +D 4 +U 3 +D 3 +L 7 +R 7 +L 7 +D 6 +U 5 +D 7 +U 7 +D 4 +U 7 +L 6 +U 3 +D 3 +R 3 +D 4 +L 2 +U 2 +R 4 +D 5 +R 7 +U 7 +L 2 +U 1 +D 4 +U 3 +L 4 +U 6 +D 4 +L 4 +U 6 +D 5 +L 1 +R 4 +L 2 +D 6 +R 4 +D 3 +R 3 +L 1 +D 2 +U 3 +L 1 +U 7 +L 3 +R 5 +U 1 +L 4 +D 8 +L 7 +D 8 +L 4 +U 6 +R 2 +D 4 +R 3 +D 3 +R 6 +L 8 +R 6 +D 4 +L 5 +R 5 +D 3 +U 6 +D 5 +U 3 +L 1 +D 4 +U 2 +R 5 +D 8 +L 3 +D 2 +U 8 +L 2 +D 6 +L 6 +D 2 +R 8 +L 3 +D 8 +U 5 +L 1 +R 1 +D 3 +L 5 +R 7 +U 4 +D 1 +L 2 +D 2 +L 5 +D 7 +R 7 +U 5 +L 5 +D 6 +L 1 +U 3 +L 4 +R 6 +D 7 +U 1 +R 1 +L 8 +U 3 +D 4 +R 2 +D 8 +L 1 +R 8 +U 7 +L 6 +U 4 +D 4 +L 2 +D 8 +U 8 +R 4 +U 3 +D 7 +R 6 +D 8 +R 5 +L 4 +D 4 +L 8 +D 3 +R 4 +L 6 +U 8 +D 1 +L 3 +R 7 +L 4 +U 3 +D 2 +U 4 +R 2 +D 1 +U 5 +L 7 +U 3 +L 8 +U 1 +L 4 +R 4 +U 1 +R 2 +L 4 +U 8 +D 7 +L 8 +D 4 +U 3 +D 5 +U 2 +D 2 +R 1 +U 6 +L 3 +R 8 +U 2 +R 2 +D 7 +L 3 +U 3 +R 8 +U 4 +R 7 +U 5 +R 7 +D 4 +R 4 +D 7 +U 5 +L 2 +D 2 +L 3 +U 2 +D 2 +L 6 +R 6 +L 5 +U 9 +D 3 +L 4 +U 3 +L 7 +D 6 +L 6 +U 7 +R 8 +U 8 +L 9 +D 7 +L 9 +D 1 +L 1 +R 7 +U 7 +L 5 +D 9 +R 8 +L 1 +R 5 +L 3 +D 3 +U 1 +R 8 +U 6 +D 3 +R 5 +U 4 +L 1 +R 3 +L 1 +U 7 +D 3 +R 3 +D 8 +R 5 +U 2 +R 5 +D 1 +L 5 +D 5 +R 6 +L 1 +D 9 +L 2 +D 9 +U 4 +L 1 +D 8 +L 2 +U 2 +D 7 +U 9 +L 8 +D 1 +R 2 +L 3 +D 4 +L 6 +U 5 +D 5 +U 1 +L 5 +U 7 +D 7 +L 9 +D 8 +R 8 +U 1 +D 9 +L 8 +U 9 +D 2 +R 6 +L 3 +U 6 +R 3 +U 5 +D 8 +L 5 +D 9 +U 5 +R 4 +U 5 +R 1 +L 5 +U 4 +L 4 +D 1 +L 1 +D 7 +R 7 +U 2 +L 5 +R 9 +U 6 +D 2 +U 6 +R 1 +D 8 +U 6 +D 3 +U 10 +D 5 +L 6 +R 6 +L 5 +D 7 +U 3 +L 4 +D 3 +R 10 +U 8 +D 3 +L 1 +R 9 +L 2 +R 9 +U 10 +D 3 +U 6 +R 8 +D 4 +R 7 +L 1 +U 8 +D 7 +R 2 +U 8 +D 8 +L 7 +U 6 +R 4 +D 4 +R 1 +U 4 +R 2 +L 5 +D 8 +U 4 +L 8 +U 1 +D 1 +L 6 +U 10 +R 10 +L 9 +U 6 +L 2 +U 2 +L 1 +U 1 +L 6 +D 4 +U 2 +D 6 +U 4 +D 10 +R 8 +D 8 +R 8 +D 2 +U 6 +L 9 +D 2 +L 4 +D 3 +L 4 +R 3 +U 2 +D 1 +U 1 +R 1 +D 7 +U 3 +R 10 +D 1 +U 6 +R 2 +D 1 +R 11 +D 1 +R 7 +U 4 +D 8 +U 7 +R 11 +L 10 +R 7 +L 3 +D 1 +U 2 +L 9 +R 5 +L 6 +R 6 +U 2 +R 3 +U 8 +D 6 +U 7 +L 6 +D 11 +L 10 +D 3 +R 3 +U 11 +D 7 +U 2 +R 1 +L 6 +R 2 +L 2 +D 3 +L 8 +R 6 +D 10 +U 6 +D 11 +L 7 +R 11 +D 2 +L 9 +U 7 +D 5 +U 5 +D 11 +L 4 +R 8 +D 9 +L 4 +U 1 +R 6 +D 11 +U 6 +L 5 +U 3 +L 11 +D 8 +U 2 +D 9 +R 2 +L 10 +U 8 +D 7 +U 3 +L 7 +D 10 +L 7 +D 10 +R 1 +D 10 +L 7 +U 3 +L 1 +R 9 +D 5 +L 11 +R 3 +L 9 +R 8 +D 2 +U 5 +L 4 +D 2 +U 7 +R 9 +U 9 +L 2 +D 1 +R 6 +L 5 +D 8 +U 8 +R 6 +U 3 +L 7 +U 4 +R 7 +L 1 +D 7 +R 2 +U 10 +D 3 +U 4 +R 8 +D 5 +L 8 +D 5 +U 8 +R 6 +U 2 +L 8 +U 7 +L 12 +D 11 +L 8 +D 12 +R 10 +L 10 +U 7 +D 2 +R 6 +L 11 +U 4 +D 8 +U 11 +L 1 +D 12 +L 3 +R 10 +D 2 +R 4 +L 1 +D 2 +R 2 +L 12 +U 3 +L 10 +U 4 +D 10 +U 8 +L 5 +R 5 +L 12 +U 1 +D 10 +U 2 +D 12 +U 12 +R 2 +U 1 +R 4 +D 8 +L 9 +R 7 +L 5 +D 5 +U 5 +L 7 +U 2 +L 7 +U 6 +L 12 +U 11 +R 10 +U 3 +L 4 +D 6 +R 11 +U 3 +R 5 +L 2 +U 9 +R 2 +L 10 +D 3 +U 12 +R 9 +D 2 +U 12 +L 1 +U 9 +D 9 +L 2 +D 4 +R 11 +D 2 +L 2 +U 12 +R 10 +D 6 +U 11 +R 9 +D 12 +L 2 +U 11 +L 5 +U 6 +R 7 +U 9 +L 10 +R 1 +L 3 +R 3 +D 2 +R 5 +L 12 +R 1 +U 3 +D 1 +L 3 +U 5 +D 9 +L 10 +U 9 +D 11 +L 12 +U 7 +R 12 +L 3 +D 2 +R 10 +U 13 +R 6 +L 5 +U 12 +L 2 +R 13 +U 8 +D 3 +R 8 +L 3 +R 3 +D 9 +R 6 +D 10 +R 2 +U 12 +R 1 +D 2 +R 12 +D 7 +U 3 +L 13 +R 11 +D 4 +U 9 +L 12 +U 3 +L 7 +D 2 +L 12 +D 12 +R 10 +D 11 +U 7 +R 4 +U 10 +R 11 +L 11 +R 7 +D 13 +U 11 +R 11 +U 3 +L 6 +U 9 +D 1 +U 3 +D 13 +R 10 +U 3 +R 3 +D 7 +U 6 +L 11 +R 10 +D 9 +R 12 +D 5 +R 7 +D 3 +R 5 +L 1 +R 10 +L 8 +D 12 +R 2 +U 9 +R 13 +U 13 +R 12 +L 8 +D 13 +R 1 +L 6 +U 10 +D 2 +U 7 +L 6 +U 6 +R 7 +U 12 +R 10 +U 12 +L 5 +D 4 +L 8 +U 12 +L 13 +D 6 +R 1 +D 2 +L 10 +U 13 +R 12 +D 4 +L 8 +R 11 +D 5 +U 11 +D 7 +L 1 +U 12 +L 6 +U 12 +D 7 +L 8 +R 13 +D 12 +R 11 +D 2 +U 14 +L 5 +D 2 +L 6 +U 14 +L 1 +U 2 +R 12 +L 9 +U 14 +D 2 +U 5 +D 3 +U 11 +R 7 +U 5 +R 13 +D 5 +L 2 +R 12 +U 6 +D 1 +U 14 +D 3 +L 13 +U 2 +D 2 +U 1 +D 12 +U 12 +D 4 +U 2 +D 2 +R 8 +U 3 +D 13 +R 2 +D 6 +U 11 +D 12 +L 3 +U 7 +D 14 +L 4 +U 11 +L 4 +D 2 +R 13 +L 6 +U 9 +R 14 +U 10 +D 11 +L 12 +R 4 +D 9 +R 11 +D 8 +R 7 +D 12 +R 7 +U 4 +L 8 +D 7 +R 9 +U 7 +R 13 +U 3 +R 11 +D 7 +U 3 +R 9 +L 8 +U 2 +D 5 +U 8 +D 1 +L 8 +U 12 +R 13 +L 7 +R 8 +L 10 +R 2 +D 13 +L 12 +R 2 +L 7 +R 9 +U 7 +D 8 +L 10 +D 12 +U 14 +R 5 +D 11 +L 12 +U 4 +L 1 +D 5 +U 6 +D 9 +U 8 +R 8 +D 11 +R 6 +U 5 +R 1 +L 15 +D 5 +U 1 +R 6 +D 8 +R 15 +U 15 +R 3 +D 14 +L 1 +D 2 +L 13 +R 13 +U 5 +L 6 +D 10 +R 7 +U 4 +D 15 +R 14 +D 12 +U 4 +D 12 +U 12 +L 12 +R 8 +L 15 +D 1 +R 6 +U 5 +D 7 +R 8 +U 7 +D 6 +U 1 +D 1 +L 2 +R 3 +D 13 +U 4 +D 4 +U 6 +L 13 +D 10 +R 14 +L 10 +D 15 +U 12 +R 10 +D 13 +L 1 +R 13 +D 10 +U 2 +R 5 +D 3 +U 13 +D 1 +R 15 +U 4 +L 8 +D 6 +L 13 +R 4 +L 11 +D 15 +U 11 +L 13 +D 6 +L 15 +U 9 +L 1 +R 11 +U 14 +R 6 +L 12 +R 5 +U 5 +L 11 +D 13 +U 3 +L 4 +R 1 +D 11 +L 8 +D 9 +R 12 +D 14 +U 15 +D 14 +U 14 +L 14 +U 4 +L 13 +D 8 +U 13 +R 7 +L 11 +D 15 +L 5 +U 7 +R 10 +D 13 +R 15 +D 2 +R 2 +L 10 +R 4 +U 7 +D 15 +L 6 +D 9 +L 16 +R 10 +U 3 +R 6 +L 8 +U 15 +R 4 +D 1 +U 8 +L 14 +R 6 +U 8 +L 10 +D 4 +U 9 +R 4 +D 1 +U 4 +L 2 +R 16 +L 6 +D 16 +U 14 +R 10 +L 14 +U 3 +R 7 +U 6 +R 13 +L 5 +R 15 +L 7 +R 3 +D 16 +L 11 +U 12 +L 11 +D 8 +R 7 +L 11 +R 5 +U 8 +R 2 +U 10 +R 11 +U 1 +D 14 +U 14 +R 4 +L 6 +D 4 +U 16 +D 2 +R 12 +L 6 +U 7 +L 7 +D 8 +R 4 +D 8 +U 11 +L 13 +U 9 +D 8 +L 8 +U 16 +D 3 +L 1 +R 13 +U 2 +L 12 +R 2 +L 3 +D 11 +R 4 +L 12 +R 12 +U 4 +D 8 +L 12 +U 16 +L 9 +R 5 +U 13 +L 1 +R 10 +L 15 +U 2 +R 8 +L 8 +D 11 +R 7 +L 7 +R 2 +L 13 +D 11 +L 11 +D 7 +L 8 +U 11 +R 7 +L 15 +D 5 +L 13 +R 8 +D 4 +R 6 +L 1 +U 10 +L 17 +U 16 +R 6 +D 17 +U 14 +L 13 +D 3 +U 11 +R 10 +D 3 +L 15 +U 13 +R 7 +L 12 +U 3 +L 7 +R 13 +L 10 +R 13 +L 10 +D 1 +R 11 +L 12 +U 6 +R 2 +L 4 +R 11 +U 15 +D 6 +L 15 +R 7 +U 16 +D 9 +L 12 +D 14 +L 5 +D 15 +L 17 +R 7 +U 17 +L 10 +D 7 +L 2 +D 1 +U 4 +D 17 +U 17 +D 9 +L 14 +D 16 +L 2 +D 8 +L 5 +D 8 +R 6 +L 15 +R 17 +D 14 +U 17 +L 17 +U 12 +R 10 +L 12 +U 16 +R 10 +D 5 +R 2 +U 11 +R 6 +L 2 +R 2 +D 17 +U 17 +D 12 +U 5 +L 14 +U 2 +R 2 +D 3 +U 4 +R 5 +U 17 +L 9 +U 4 +R 2 +L 5 +U 8 +L 2 +D 5 +R 14 +U 15 +R 14 +D 3 +U 16 +L 3 +D 6 +U 3 +L 2 +R 3 +L 1 +R 6 +L 14 +U 10 +L 13 +R 8 +U 3 +D 7 +U 9 +D 2 +L 14 +D 5 +R 7 +D 8 +L 18 +R 13 +U 14 +D 6 +R 10 +L 10 +U 2 +L 11 +R 12 +U 6 +R 16 +L 10 +U 7 +R 12 +L 15 +D 2 +U 16 +L 4 +D 2 +L 1 +R 8 +D 7 +L 11 +R 4 +D 13 +U 13 +R 1 +D 15 +L 12 +R 5 +D 10 +U 8 +R 14 +L 10 +U 9 +R 7 +U 13 +L 5 +U 9 +L 15 +R 4 +D 13 +R 12 +D 5 +R 18 +L 3 +D 13 +R 17 +D 9 +L 8 +D 3 +L 5 +D 8 +U 10 +D 8 +L 2 +U 10 +R 6 +D 13 +L 17 +R 17 +D 16 +R 14 +L 6 +U 17 +R 9 +D 11 +L 7 +U 16 +R 16 +L 1 +R 17 +D 9 +L 6 +D 16 +R 12 +L 7 +U 5 +D 14 +R 8 +U 12 +L 12 +R 8 +U 17 +L 13 +D 17 +L 15 +R 7 +U 11 +L 10 +R 8 +U 14 +R 6 +U 11 +D 17 +U 13 +L 12 +U 11 +L 16 +D 13 +U 11 +L 2 +R 11 +L 13 +U 12 +R 15 +U 17 +L 10 +U 17 +D 2 +R 1 +L 10 +R 10 +U 14 +L 12 +U 8 +R 4 +L 12 +U 13 +L 2 +R 9 +D 14 +U 17 +L 16 +D 9 +R 3 +L 17 +U 8 +R 16 +D 11 +L 1 +U 15 +L 19 +R 8 +D 11 +R 14 +D 19 +R 12 +U 3 +L 9 +U 2 +L 6 +D 6 +U 16 +D 4 +L 1 +D 10 +R 8 +U 17 +D 2 +R 6 +D 19 +U 6 +R 9 +U 17 +D 7 +L 15 +D 13 +L 17 +U 1 +R 17 +D 3 +L 15 +U 16 +D 13 +R 13 +D 14 +L 12 +D 4 +L 16 +U 15 +R 8 +U 19 +D 15 +L 5 +R 15 +L 19 +U 6 +D 6 +U 10 +L 1 +R 19 +L 1 +R 6 +L 1 +U 17 +R 10 +U 4 +D 5 +R 6 +U 3 +R 12 +U 13 +D 7 +R 15 +U 5 +R 2 +U 10 +L 13 +U 3 +D 5 +R 19 +U 9 +D 5 +L 3 +D 17 +L 16 +D 7 +L 16 +R 11 +D 3 +U 1 +R 2 +D 2 +L 4 +R 4 +U 17 +D 4 +L 10 +U 11 +D 13 diff --git a/day9/src/main.rs b/day9/src/main.rs index e7a11a9..ff50f81 100644 --- a/day9/src/main.rs +++ b/day9/src/main.rs @@ -1,3 +1,170 @@ -fn main() { - println!("Hello, world!"); +use std::{ + collections::HashSet, + fs::read_to_string, + mem::MaybeUninit, + ops::{Add, AddAssign, Sub, SubAssign}, +}; + +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +enum Direction { + Up, + Down, + Left, + Right, +} + +impl TryFrom<&str> for Direction { + type Error = &'static str; + + fn try_from(value: &str) -> Result { + match value { + "U" => Ok(Self::Up), + "D" => Ok(Self::Down), + "L" => Ok(Self::Left), + "R" => Ok(Self::Right), + _ => Err("invalid Direction"), + } + } +} + +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +struct Movement { + direction: Direction, + steps: usize, +} + +impl TryFrom<&str> for Movement { + type Error = &'static str; + + fn try_from(value: &str) -> Result { + let words = value.split_whitespace().collect::>(); + match &words[..] { + [direction, steps] => Ok(Movement { + direction: Direction::try_from(*direction)?, + steps: match steps.parse::() { + Ok(it) => it, + Err(_) => return Err("unable to parse steps"), + }, + }), + _ => Err("Need 2 words in format [Direction] [Steps]"), + } + } +} + +#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Hash)] +struct Position { + x: i32, + y: i32, +} + +impl Add for Position { + type Output = Position; + + fn add(self, rhs: Self) -> Self::Output { + Self { + x: self.x + rhs.x, + y: self.y + rhs.y, + } + } +} + +impl AddAssign for Position { + fn add_assign(&mut self, rhs: Self) { + self.x += rhs.x; + self.y += rhs.y; + } +} + +impl Sub for Position { + type Output = Position; + + fn sub(self, rhs: Self) -> Self::Output { + Self { + x: self.x - rhs.x, + y: self.y - rhs.y, + } + } +} + +impl SubAssign for Position { + fn sub_assign(&mut self, rhs: Self) { + self.x += rhs.x; + self.y += rhs.y; + } +} + +#[derive(Debug, Eq, PartialEq, Clone, Default)] +struct Link { + head: Position, + tail: Position, + tail_positions: HashSet, +} + +impl Link { + fn simulate_position(&mut self, head_position: &Position) { + self.head = *head_position; + let distance = self.head - self.tail; + if distance.x.abs() > 1 || distance.y.abs() > 1 { + self.tail.x += distance.x.signum(); + self.tail.y += distance.y.signum(); + } + self.tail_positions.insert(self.tail); + } +} + +#[derive(Debug, Eq, PartialEq, Clone)] +struct Rope { + links: [Link; N], +} + +impl Rope { + fn simulate(mut self, movement: &Movement) -> Self { + for _ in 0..movement.steps { + let head_position = self.links[0].head + + match movement.direction { + Direction::Up => Position { x: 0, y: -1 }, + Direction::Down => Position { x: 0, y: 1 }, + Direction::Left => Position { x: -1, y: 0 }, + Direction::Right => Position { x: 1, y: 0 }, + }; + self.links[0].simulate_position(&head_position); + for i in 1..self.links.len() { + let previous = self.links[i - 1].tail; + self.links[i].simulate_position(&previous); + } + } + self + } +} + +impl Default for Rope { + fn default() -> Self { + let mut links: [Link; N] = unsafe { MaybeUninit::zeroed().assume_init() }; + links.fill(Default::default()); + Self { links } + } +} + +fn main() { + let input = "R 5 +U 8 +L 8 +D 3 +R 17 +D 10 +L 25 +U 20"; + let input = read_to_string("input.txt").unwrap_or_else(|_| input.to_owned()); + + let rope = input + .lines() + .flat_map(Movement::try_from) + .fold(Rope::<9>::default(), |rope, movement| { + rope.simulate(&movement) + }); + println!( + "The second knot visited {} positions, the tail visited {} positions", + rope.links[0].tail_positions.len(), + rope.links[8].tail_positions.len() + ); }