diff --git a/res/09/input.txt b/res/09/input.txt new file mode 100644 index 0000000..a978a43 --- /dev/null +++ b/res/09/input.txt @@ -0,0 +1,2000 @@ +L 1 +R 2 +L 1 +U 2 +D 1 +R 1 +D 1 +L 2 +D 1 +U 2 +D 2 +U 2 +L 1 +U 1 +D 1 +U 2 +D 2 +L 1 +U 1 +L 1 +U 1 +L 1 +D 1 +L 1 +R 2 +L 1 +D 2 +R 2 +U 2 +R 2 +L 1 +D 1 +U 1 +D 2 +R 1 +D 1 +L 2 +D 2 +R 2 +D 2 +U 1 +D 2 +L 2 +D 2 +R 1 +L 2 +U 1 +D 2 +U 1 +L 2 +D 1 +R 1 +U 1 +R 2 +D 1 +L 1 +D 2 +U 1 +R 2 +D 2 +L 2 +U 1 +L 1 +D 1 +L 1 +U 2 +L 1 +D 2 +U 1 +D 2 +L 1 +D 2 +R 2 +U 1 +D 2 +U 2 +R 1 +L 1 +U 1 +R 1 +L 2 +D 1 +U 2 +L 2 +U 1 +L 1 +D 2 +R 1 +U 1 +L 1 +R 2 +U 1 +D 2 +U 1 +L 1 +D 2 +R 2 +U 1 +R 1 +D 2 +L 1 +D 2 +L 1 +D 1 +U 1 +L 1 +U 1 +R 1 +D 1 +L 2 +U 2 +D 3 +R 3 +L 2 +R 3 +L 1 +D 2 +R 2 +L 2 +U 3 +D 2 +L 2 +U 2 +R 3 +D 3 +R 1 +D 3 +U 3 +L 3 +R 1 +L 2 +U 1 +L 3 +U 3 +L 1 +U 2 +L 3 +U 1 +R 3 +D 1 +L 1 +D 2 +R 2 +L 1 +D 1 +L 3 +D 3 +U 1 +R 1 +U 2 +R 1 +L 1 +U 2 +L 3 +R 2 +D 2 +R 2 +L 1 +D 2 +U 3 +L 2 +D 1 +L 1 +D 2 +L 1 +D 2 +L 1 +R 2 +D 2 +L 3 +R 1 +U 2 +L 1 +R 1 +U 3 +D 3 +R 2 +D 2 +L 1 +U 1 +L 1 +D 3 +R 3 +D 3 +L 2 +R 1 +U 3 +R 2 +D 2 +U 3 +D 3 +U 1 +R 2 +D 1 +U 2 +D 1 +L 2 +D 3 +L 3 +U 2 +R 1 +L 3 +D 1 +R 2 +L 2 +D 3 +R 2 +D 1 +U 2 +R 3 +U 3 +D 1 +U 2 +L 1 +R 1 +D 2 +L 1 +U 1 +L 3 +U 1 +R 3 +D 2 +R 2 +U 4 +R 3 +L 2 +R 1 +L 4 +R 2 +L 4 +R 3 +D 3 +R 2 +L 4 +U 4 +R 3 +L 3 +R 1 +L 4 +D 3 +U 1 +L 1 +R 2 +D 1 +L 3 +U 2 +R 1 +U 1 +D 2 +L 1 +U 4 +D 2 +R 3 +L 1 +D 2 +L 3 +U 2 +D 2 +U 1 +L 4 +U 2 +D 4 +L 3 +U 1 +L 4 +R 1 +D 1 +R 4 +U 4 +D 2 +R 3 +D 4 +R 4 +D 4 +U 3 +D 1 +U 4 +R 1 +D 4 +U 2 +R 2 +D 4 +R 4 +L 4 +R 2 +D 4 +U 3 +L 3 +D 3 +L 2 +U 1 +R 1 +L 2 +D 2 +U 1 +L 4 +U 2 +R 2 +L 2 +U 1 +R 1 +U 4 +D 1 +L 1 +U 4 +L 1 +R 2 +U 4 +L 3 +U 2 +D 2 +U 4 +L 3 +R 2 +L 3 +U 4 +L 4 +U 2 +L 4 +D 3 +L 2 +U 3 +D 4 +U 1 +L 2 +U 1 +D 3 +R 1 +L 4 +U 1 +R 4 +U 2 +R 2 +U 5 +R 2 +D 2 +R 1 +U 5 +L 5 +U 1 +R 4 +U 1 +L 1 +D 5 +L 3 +D 1 +L 4 +D 4 +R 4 +U 3 +D 3 +R 5 +U 1 +L 3 +D 1 +R 4 +D 1 +L 3 +U 4 +R 4 +U 4 +L 5 +U 4 +L 2 +U 1 +L 5 +U 2 +R 4 +U 3 +R 2 +D 1 +U 5 +R 1 +D 4 +U 3 +L 1 +R 4 +D 5 +U 5 +R 5 +U 3 +D 3 +L 1 +U 4 +D 1 +U 1 +D 3 +R 4 +L 5 +D 4 +L 3 +U 5 +D 3 +L 5 +R 2 +U 1 +L 2 +R 5 +D 4 +U 2 +D 2 +R 5 +U 3 +R 4 +L 5 +D 2 +R 2 +U 3 +D 2 +L 3 +R 2 +U 3 +D 3 +U 5 +L 5 +R 2 +U 4 +R 2 +D 5 +U 3 +D 4 +L 1 +U 1 +L 3 +R 4 +U 1 +D 3 +U 1 +L 3 +R 3 +U 2 +R 3 +U 5 +L 4 +R 2 +L 3 +D 4 +R 3 +U 5 +R 4 +L 5 +R 5 +L 5 +D 1 +U 4 +D 1 +U 6 +D 3 +U 5 +R 3 +L 2 +U 3 +R 4 +U 1 +R 6 +U 2 +R 3 +L 4 +U 2 +D 1 +R 5 +U 1 +D 1 +R 3 +D 3 +L 5 +D 1 +R 3 +U 3 +D 4 +U 4 +R 5 +D 2 +L 6 +D 4 +U 2 +R 5 +U 5 +D 5 +R 5 +L 3 +R 5 +D 1 +U 3 +L 5 +U 5 +R 5 +D 6 +L 3 +R 1 +U 4 +L 4 +D 5 +L 3 +D 5 +L 1 +R 6 +U 1 +D 1 +U 4 +L 1 +D 2 +U 2 +R 3 +L 6 +R 4 +L 6 +U 3 +D 5 +L 4 +R 1 +L 6 +R 4 +L 6 +D 4 +U 4 +L 4 +R 3 +L 4 +R 2 +L 2 +R 6 +U 1 +D 6 +L 6 +R 3 +D 6 +U 3 +D 5 +L 1 +U 1 +L 5 +D 6 +R 6 +D 3 +U 2 +R 6 +U 4 +D 4 +U 2 +R 1 +D 2 +R 4 +U 1 +L 6 +R 5 +L 1 +U 1 +L 6 +D 2 +U 2 +L 2 +U 2 +R 3 +D 5 +U 3 +L 2 +R 7 +L 6 +D 6 +L 4 +R 6 +D 7 +L 3 +R 4 +U 1 +D 5 +R 1 +L 1 +U 2 +R 4 +U 3 +L 6 +R 4 +D 3 +U 7 +D 1 +L 6 +D 6 +R 1 +D 4 +R 3 +D 2 +R 1 +U 3 +L 7 +R 7 +L 2 +U 2 +D 3 +L 5 +D 3 +U 2 +R 7 +L 6 +U 3 +R 1 +U 7 +D 2 +U 1 +L 5 +D 1 +U 6 +L 3 +U 6 +D 7 +U 5 +L 2 +R 3 +L 5 +R 4 +D 3 +U 5 +L 6 +R 1 +U 4 +L 4 +U 5 +L 7 +D 6 +U 4 +R 4 +D 7 +U 5 +D 7 +R 6 +L 5 +U 4 +R 1 +D 2 +U 6 +D 6 +U 6 +R 7 +L 3 +R 6 +D 1 +R 5 +L 6 +D 5 +L 4 +R 4 +L 6 +R 6 +L 3 +D 2 +L 6 +D 4 +R 5 +L 5 +U 2 +R 2 +L 6 +R 7 +L 6 +U 6 +D 5 +U 7 +L 4 +U 6 +D 7 +U 3 +D 6 +L 6 +U 7 +D 5 +U 1 +R 2 +L 1 +R 7 +L 6 +D 5 +U 8 +D 3 +U 8 +D 1 +U 7 +D 2 +L 4 +R 2 +U 5 +D 6 +L 1 +R 1 +L 5 +R 7 +D 8 +U 2 +R 7 +U 4 +D 5 +U 8 +D 7 +U 4 +R 3 +D 2 +L 8 +D 4 +L 8 +D 5 +U 7 +R 8 +U 2 +L 1 +U 6 +D 3 +U 6 +L 3 +U 2 +D 8 +U 1 +R 4 +L 3 +R 1 +L 6 +U 6 +L 4 +R 7 +D 8 +U 4 +R 1 +D 7 +L 4 +D 6 +R 4 +L 3 +D 5 +R 7 +L 5 +D 3 +U 8 +L 8 +D 4 +R 1 +U 3 +L 5 +R 4 +L 1 +R 8 +U 7 +D 3 +U 2 +D 7 +L 4 +U 8 +L 7 +U 2 +D 1 +R 7 +L 4 +U 1 +R 2 +D 5 +L 1 +U 5 +L 8 +R 7 +U 1 +D 1 +U 5 +D 7 +L 6 +D 4 +U 7 +D 8 +R 1 +D 3 +U 4 +L 6 +R 7 +L 8 +R 1 +D 7 +L 3 +D 6 +U 5 +L 6 +R 7 +L 9 +D 2 +R 1 +L 4 +D 5 +L 6 +D 8 +U 7 +L 7 +U 5 +D 8 +U 8 +L 6 +U 6 +D 8 +U 9 +D 1 +R 4 +L 9 +D 4 +R 4 +L 3 +U 8 +D 2 +R 3 +U 6 +L 8 +D 1 +R 7 +D 5 +R 9 +D 1 +L 7 +D 2 +U 2 +L 9 +R 5 +L 9 +D 6 +U 6 +L 2 +D 5 +R 3 +L 4 +D 7 +U 2 +R 6 +U 1 +L 8 +R 3 +L 6 +U 5 +R 9 +U 8 +L 2 +D 9 +U 9 +D 7 +L 1 +U 6 +R 4 +L 2 +R 1 +D 1 +R 7 +L 7 +U 6 +D 8 +U 6 +D 5 +L 3 +D 8 +U 6 +L 2 +U 8 +R 8 +D 7 +U 9 +R 6 +U 1 +R 2 +D 5 +R 4 +L 2 +U 3 +D 3 +L 5 +U 1 +L 5 +D 8 +U 9 +L 8 +U 9 +L 9 +U 5 +R 7 +U 7 +D 4 +R 2 +L 8 +U 9 +D 6 +U 5 +L 9 +U 3 +L 5 +U 9 +L 7 +D 5 +L 8 +R 9 +L 10 +D 1 +L 10 +R 4 +L 7 +U 5 +L 10 +U 2 +R 10 +L 3 +U 10 +R 2 +U 6 +L 2 +R 8 +L 8 +R 4 +U 1 +R 6 +L 2 +D 6 +L 10 +D 9 +L 2 +U 5 +R 1 +D 9 +R 9 +U 3 +D 6 +L 10 +U 4 +R 6 +U 9 +R 6 +U 6 +L 4 +R 8 +D 3 +U 8 +L 3 +U 6 +R 2 +L 2 +D 3 +U 3 +R 3 +D 10 +R 9 +D 1 +R 6 +L 4 +U 4 +D 1 +R 2 +U 6 +R 3 +U 5 +R 8 +L 5 +U 2 +R 5 +D 10 +L 7 +R 4 +D 9 +U 6 +L 7 +R 10 +D 3 +U 5 +R 1 +U 2 +R 9 +U 10 +R 8 +L 8 +U 4 +R 9 +L 6 +U 7 +L 4 +U 1 +L 6 +U 4 +L 7 +R 4 +U 9 +D 9 +R 9 +L 4 +R 3 +D 7 +L 3 +U 6 +D 2 +U 8 +R 8 +L 6 +D 5 +L 6 +R 1 +L 3 +U 10 +L 2 +D 7 +R 7 +L 8 +U 4 +R 1 +D 5 +L 10 +R 6 +U 1 +R 7 +L 6 +R 11 +U 11 +R 3 +L 5 +U 7 +D 7 +L 9 +U 4 +L 5 +D 11 +L 4 +R 1 +L 10 +U 9 +L 8 +U 10 +R 7 +U 3 +R 3 +D 1 +U 4 +L 5 +D 6 +R 8 +D 10 +R 4 +L 9 +U 6 +R 10 +D 2 +U 9 +R 10 +U 5 +R 4 +U 3 +R 4 +L 1 +U 3 +R 7 +L 3 +D 3 +U 6 +L 8 +U 7 +L 7 +R 4 +L 1 +D 5 +U 1 +R 4 +D 1 +R 1 +D 6 +L 1 +D 1 +L 3 +D 7 +R 1 +U 7 +L 11 +U 7 +L 9 +D 7 +R 5 +L 11 +D 3 +R 5 +U 3 +L 9 +R 4 +U 2 +L 9 +U 1 +R 4 +U 8 +D 1 +R 1 +D 5 +R 5 +U 11 +L 10 +U 5 +D 4 +R 7 +U 4 +D 10 +L 4 +D 6 +U 6 +L 8 +U 8 +D 1 +L 4 +R 1 +L 10 +D 5 +R 6 +U 4 +L 4 +U 9 +L 7 +R 6 +U 8 +L 4 +D 5 +R 4 +L 1 +U 3 +D 7 +R 3 +U 3 +L 2 +D 4 +R 2 +L 6 +R 11 +D 2 +L 6 +U 2 +R 12 +L 6 +D 12 +R 11 +L 9 +D 9 +R 5 +U 2 +L 5 +D 10 +R 4 +U 4 +R 8 +U 2 +R 6 +U 3 +D 7 +U 11 +L 8 +D 8 +U 11 +D 2 +U 3 +R 7 +D 9 +R 3 +L 11 +U 3 +L 7 +D 6 +L 3 +D 2 +R 1 +U 9 +L 6 +D 6 +L 5 +R 8 +L 4 +R 9 +U 5 +D 11 +R 7 +D 11 +L 6 +R 2 +L 5 +U 6 +L 5 +D 4 +R 3 +D 8 +R 8 +D 2 +U 1 +R 6 +U 5 +L 7 +D 11 +U 4 +L 1 +R 8 +D 6 +R 6 +U 11 +L 8 +D 2 +L 6 +R 10 +L 4 +D 4 +U 3 +D 12 +U 10 +L 3 +U 3 +D 7 +R 9 +L 2 +U 11 +L 11 +U 4 +R 2 +L 5 +D 11 +U 5 +L 10 +U 4 +R 1 +U 11 +R 12 +U 2 +L 7 +U 12 +L 1 +D 9 +U 4 +L 4 +D 12 +L 5 +D 1 +R 9 +U 11 +L 6 +D 8 +L 11 +U 9 +D 6 +L 6 +R 6 +U 5 +D 10 +R 4 +D 4 +U 10 +D 2 +L 12 +D 3 +L 7 +D 13 +U 11 +D 4 +L 6 +U 4 +D 10 +L 2 +R 4 +D 7 +U 7 +R 9 +L 8 +R 3 +U 8 +D 10 +L 2 +D 2 +L 2 +D 11 +L 8 +U 12 +L 1 +U 9 +L 6 +R 7 +L 6 +D 9 +U 10 +R 2 +L 3 +U 5 +L 3 +D 9 +R 8 +D 1 +L 11 +D 1 +U 10 +D 5 +L 10 +U 1 +L 2 +D 11 +L 8 +R 6 +D 6 +U 13 +L 1 +D 3 +L 11 +D 13 +R 9 +D 6 +L 7 +U 7 +R 8 +L 3 +D 3 +L 9 +D 5 +U 12 +D 6 +L 8 +U 8 +L 12 +U 10 +R 2 +L 8 +D 12 +R 4 +L 3 +R 7 +U 12 +R 2 +L 2 +R 10 +L 12 +R 1 +L 1 +R 3 +L 2 +R 2 +D 3 +R 8 +L 10 +R 8 +L 11 +U 3 +D 12 +R 8 +U 12 +D 7 +L 6 +D 14 +L 11 +U 12 +L 10 +R 4 +U 11 +R 5 +U 13 +R 3 +U 9 +R 2 +L 2 +D 3 +L 3 +R 1 +D 11 +L 1 +D 6 +R 9 +L 10 +R 8 +D 5 +U 6 +D 12 +U 12 +L 10 +D 8 +R 4 +D 3 +L 10 +R 14 +L 5 +D 5 +L 1 +U 3 +R 10 +U 2 +D 2 +L 12 +R 7 +U 1 +D 13 +R 11 +L 13 +U 8 +L 10 +R 2 +U 8 +D 10 +R 14 +U 2 +L 14 +D 12 +R 8 +D 8 +U 5 +R 7 +L 14 +R 6 +U 13 +D 7 +U 2 +L 7 +R 4 +L 8 +U 7 +R 3 +D 1 +R 3 +D 14 +U 2 +R 1 +D 7 +L 4 +D 14 +U 8 +L 9 +U 11 +L 5 +R 2 +D 4 +L 3 +U 9 +R 4 +U 4 +R 1 +U 3 +L 6 +D 14 +U 12 +R 11 +D 6 +U 8 +D 14 +R 14 +L 13 +R 11 +D 2 +U 6 +L 7 +D 9 +R 7 +D 14 +L 2 +R 7 +L 13 +R 3 +D 8 +U 5 +L 14 +D 7 +U 5 +D 12 +R 11 +U 1 +D 10 +L 7 +R 7 +D 2 +L 4 +U 13 +R 10 +D 1 +L 9 +D 14 +U 6 +D 5 +R 8 +U 7 +L 9 +R 15 +L 5 +U 15 +R 9 +U 3 +L 12 +R 2 +D 8 +U 8 +D 11 +R 14 +D 14 +U 5 +R 13 +D 13 +L 7 +U 14 +D 8 +R 12 +D 2 +R 2 +L 6 +R 4 +U 2 +R 14 +L 5 +R 2 +D 11 +U 1 +L 14 +D 1 +R 5 +D 12 +U 4 +D 8 +U 6 +D 12 +L 5 +U 4 +R 15 +D 4 +R 4 +U 4 +R 3 +L 1 +U 8 +R 4 +D 7 +U 13 +R 8 +L 1 +D 3 +L 3 +U 11 +L 12 +U 10 +L 12 +U 13 +D 2 +L 7 +U 1 +R 1 +U 15 +D 9 +L 1 +R 6 +L 10 +D 7 +U 5 +L 8 +U 9 +R 5 +U 15 +D 7 +L 9 +R 15 +L 15 +R 6 +D 2 +R 2 +L 5 +U 5 +L 11 +D 8 +R 15 +L 5 +D 10 +L 13 +D 13 +R 13 +D 14 +L 11 +R 2 +D 6 +U 16 +D 13 +L 8 +D 2 +L 5 +U 8 +L 4 +R 9 +D 4 +U 5 +D 9 +U 7 +L 11 +D 8 +U 7 +D 10 +U 11 +R 5 +U 14 +L 12 +R 14 +D 3 +R 3 +D 1 +U 8 +D 2 +R 14 +D 8 +R 6 +L 9 +D 6 +R 4 +L 5 +D 14 +R 11 +L 4 +R 12 +D 15 +R 16 +U 13 +R 7 +U 15 +D 8 +U 11 +L 11 +D 14 +U 14 +D 13 +U 14 +L 14 +D 11 +U 9 +R 5 +L 15 +R 5 +D 6 +U 10 +R 10 +D 16 +R 13 +D 9 +U 10 +R 5 +L 6 +D 15 +U 10 +L 15 +R 7 +L 13 +D 6 +U 7 +L 11 +U 4 +R 4 +L 11 +R 12 +D 6 +L 8 +D 8 +L 12 +D 1 +R 15 +D 12 +L 8 +R 11 +L 10 +D 9 +U 6 +L 2 +R 9 +L 7 +R 4 +U 6 +D 11 +L 6 +D 11 +L 14 +R 10 +U 4 +R 12 +U 10 +D 7 +R 7 +L 7 +U 1 +D 3 +L 1 +U 9 +D 4 +U 15 +L 11 +U 11 +D 11 +L 9 +D 13 +L 15 +D 11 +R 16 +U 11 +D 6 +L 10 +R 10 +D 4 +R 8 +U 17 +D 12 +L 16 +U 14 +R 15 +U 15 +D 6 +R 7 +U 5 +L 9 +U 6 +D 14 +U 4 +L 8 +D 6 +R 16 +U 4 +R 7 +D 3 +U 3 +D 15 +L 1 +U 1 +D 1 +R 1 +U 7 +D 12 +R 1 +D 2 +U 5 +L 13 +U 7 +R 10 +U 15 +D 17 +L 16 +D 8 +L 15 +U 2 +R 2 +D 14 +L 4 +U 7 +D 2 +L 15 +R 5 +U 11 +R 2 +U 8 +D 12 +R 13 +L 7 +D 4 +R 6 +U 2 +D 9 +U 6 +L 10 +R 1 +L 15 +R 12 +L 2 +D 16 +L 2 +R 7 +U 15 +L 3 +D 12 +U 10 +R 14 +L 7 +D 9 +U 13 +R 8 +U 10 +R 7 +L 12 +R 15 +U 10 +D 5 +L 11 +R 9 +D 4 +L 9 +D 8 +R 13 +L 13 +D 7 +L 3 +D 3 +U 14 +D 14 +U 11 +D 17 +R 1 +D 10 +L 12 +R 1 +U 4 +D 16 +U 18 +L 9 +U 2 +R 13 +L 7 +U 7 +R 10 +L 17 +R 7 +U 4 +L 8 +U 1 +L 13 +U 12 +D 7 +R 10 +L 18 +U 12 +D 2 +U 7 +D 12 +R 13 +D 9 +R 13 +U 1 +L 9 +R 3 +L 3 +D 15 +R 11 +L 2 +R 18 +L 7 +R 10 +L 10 +D 8 +L 4 +R 6 +U 12 +L 8 +U 16 +D 18 +L 9 +U 15 +R 13 +D 18 +U 6 +R 7 +U 7 +L 16 +U 18 +R 10 +L 4 +R 2 +U 2 +L 5 +R 8 +U 14 +L 5 +U 2 +D 17 +R 7 +L 13 +D 15 +R 2 +D 2 +R 6 +L 10 +R 4 +U 3 +R 18 +D 16 +L 13 +U 8 +D 5 +L 9 +R 4 +D 7 +R 9 +L 5 +D 13 +L 9 +D 13 +U 15 +L 3 +D 15 +U 16 +R 2 +U 18 +R 18 +L 6 +D 12 +R 10 +U 10 +L 3 +R 3 +D 7 +L 11 +R 1 +D 7 +L 8 +R 15 +L 3 +U 12 +R 7 +D 19 +R 13 +D 11 +U 15 +D 3 +U 6 +D 15 +R 8 +U 5 +L 2 +D 12 +U 3 +D 3 +L 3 +D 9 +L 8 +R 19 +L 12 +U 13 +L 1 +D 14 +R 9 +L 15 +R 15 +L 14 +D 2 +U 3 +L 17 +U 15 +D 13 +R 4 +D 18 +L 4 +R 2 +D 16 +R 9 +L 3 +U 14 +D 1 +R 19 +U 11 +D 6 +U 12 +R 5 +U 9 +L 8 +D 14 +R 5 +U 16 +L 12 +U 17 +R 17 +U 19 +L 1 +D 9 +U 10 +L 4 +R 13 +U 15 +D 7 +R 14 +U 15 +R 7 +D 2 +R 7 +L 10 +D 17 +U 5 +D 1 +L 18 +D 9 +R 16 +L 18 +R 3 +D 7 +R 11 +D 14 +U 15 +R 9 +D 9 +R 7 +U 17 +R 3 +D 19 +R 4 +U 10 +L 11 +D 2 +L 2 +D 11 +R 14 +D 15 +R 13 +D 10 +R 4 +U 12 +L 13 +U 12 +R 10 +L 4 +U 17 +D 4 +R 4 +U 7 +L 10 +R 12 +L 18 +U 11 +D 8 +R 13 +U 19 diff --git a/src/days/d09.rs b/src/days/d09.rs new file mode 100644 index 0000000..d320e25 --- /dev/null +++ b/src/days/d09.rs @@ -0,0 +1,168 @@ +use std::fs; + +const GRID_WIDTH: u32 = 1000; +const GRID_HEIGHT: u32 = 1000; +const START_X: u32 = 500; +const START_Y: u32 = 500; + + +pub fn solve() { + let path = "res/09/input.txt"; + + let contents = fs::read_to_string(path).expect("I/O error, wrong path?"); + + let lines: Vec<&str> = contents + .lines() + .filter(|line| *line != "") + .collect(); + + // task 1 - rope with 2 knots + let mut rope2 = Rope::new(2); + + // task 2 - rope with 10 knots + let mut rope10 = Rope::new(10); + + lines.iter().for_each(|line| { + // parse command + let cmd: Vec<&str> = line.split_whitespace().collect(); + let dir = match cmd[0] { + "U" => Dir::Up, + "D" => Dir::Down, + "L" => Dir::Left, + "R" => Dir::Right, + _ => Dir::Up + }; + let amount = cmd[1].parse::().unwrap(); + + // move head + for _ in 0..amount { + rope2.mv(dir); + rope10.mv(dir); + } + }); + + // task 1 res + let res = rope2.tail_visited_num(); + println!("Result 1: {}", res); + + // task 2 res + let res = rope10.tail_visited_num(); + println!("Result 1: {}", res); + + + +} + +#[derive(Debug, Copy, Clone)] +enum Dir { + Up, + Down, + Left, + Right +} + +struct Rope { + knots_x: Vec, + knots_y: Vec, + tail_visited_grid: Vec> // [Y][X] +} + +impl Rope { + pub fn new(knots: u32) -> Self { + Rope { + knots_x: (0..knots).map(|_| START_X).collect(), + knots_y: (0..knots).map(|_| START_Y).collect(), + tail_visited_grid: (0..GRID_HEIGHT) + .map(|_| (0..GRID_WIDTH) + .map(|_| false).collect() + ).collect() + } + } + + // move head (first knot) + pub fn mv(&mut self, dir: Dir) { + match dir { + Dir::Up => { + self.knots_y[0] -= 1 + }, + Dir::Down => { + self.knots_y[0] += 1 + }, + Dir::Left => { + self.knots_x[0] -= 1 + }, + Dir::Right => { + self.knots_x[0] += 1 + } + } + self.check_tail_pos() + } + + // move tail if necessary + fn check_tail_pos(&mut self) { + // check pos of each knot except first + for i in 1..self.knots_x.len() { + // head is too far top/bottom + if self.knots_x[i-1].abs_diff(self.knots_x[i]) > 1 { + // if necessary, move on Y-axis + self.knots_y[i] = self.knots_y[i-1]; + + if self.knots_x[i-1] > self.knots_x[i] { // head below + self.knots_x[i] = self.knots_x[i-1]-1; + } else { // head above + self.knots_x[i] = self.knots_x[i-1]+1; + } + } + + // head is too far left/right + else if self.knots_y[i-1].abs_diff(self.knots_y[i]) > 1 { + // if necessary, move on X-axis + self.knots_x[i] = self.knots_x[i-1]; + + if self.knots_y[i-1] > self.knots_y[i] { // head right + self.knots_y[i] = self.knots_y[i-1]-1; + } else { // head left + self.knots_y[i] = self.knots_y[i-1]+1; + } + } + } + + // set current tail (last knot) pos as visited + self.tail_visited_grid[*self.knots_y.last().unwrap() as usize][*self.knots_x.last().unwrap() as usize] = true; + + /* + let min_x = self.knots_x.iter().min().unwrap(); + let max_x = self.knots_x.iter().max().unwrap(); + let min_y = self.knots_y.iter().min().unwrap(); + let max_y = self.knots_y.iter().max().unwrap(); + + let width = max_x - min_x + 1; + let height = max_y - min_y + 1; + + let mut out: Vec> = (0..height).map(|_| (0..width).map(|_| ".".to_string()).collect()).collect(); + for i in (0..self.knots_x.len()).rev() { + let x = self.knots_x[i]-min_x; + let y = self.knots_y[i]-min_y; + out[y as usize][x as usize] = i.to_string(); + } + println!("{}", min_y); + out.iter().for_each(|line| { + line.iter().for_each(|o| print!("{}",o)); + println!(); + }); + println!();*/ + + } + + // returns number of cells visited by tail + pub fn tail_visited_num(&self) -> u32 { + self.tail_visited_grid.iter() + .map(|row| + row.iter() + .map(|cell| + if *cell { 1 as u32 } + else { 0 as u32 } + ).sum::() + ).sum() + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index fdef2b3..a66d90c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ pub mod days; fn main() { - _all_days() + days::d09::solve() } fn _all_days() { @@ -21,4 +21,6 @@ fn _all_days() { days::d07::solve(); println!("\nDay 8"); days::d08::solve(); + println!("\nDay 9"); + days::d09::solve(); }