diff --git a/input/09.txt b/input/09.txt index e69de29..704e4cd 100644 --- a/input/09.txt +++ b/input/09.txt @@ -0,0 +1,2000 @@ +L 1 +D 2 +L 2 +U 2 +D 2 +U 2 +D 1 +R 1 +U 1 +R 1 +L 2 +R 1 +U 1 +R 2 +L 1 +D 2 +R 2 +L 2 +D 1 +U 2 +R 2 +L 1 +U 2 +D 2 +U 2 +D 2 +L 1 +R 2 +L 1 +R 1 +L 1 +D 2 +L 1 +U 1 +L 2 +U 1 +L 2 +R 2 +D 1 +L 2 +R 1 +D 1 +U 1 +L 1 +U 2 +D 2 +L 1 +U 1 +R 2 +D 1 +L 1 +U 1 +R 2 +D 1 +R 2 +D 2 +U 2 +R 2 +U 2 +R 1 +L 1 +R 1 +L 1 +D 1 +U 1 +R 2 +D 2 +L 2 +U 1 +D 1 +R 1 +U 1 +L 1 +D 2 +U 2 +D 1 +L 2 +U 1 +D 1 +L 2 +U 1 +R 2 +D 1 +L 1 +R 1 +L 1 +D 1 +L 1 +R 1 +L 2 +R 2 +D 1 +R 2 +D 1 +L 1 +D 1 +L 2 +R 2 +U 2 +L 2 +R 1 +U 2 +R 2 +D 1 +U 1 +L 2 +D 2 +U 2 +L 2 +R 1 +U 2 +D 2 +L 3 +D 1 +R 2 +D 2 +U 2 +L 3 +U 1 +D 1 +R 1 +D 2 +L 2 +D 2 +R 3 +D 1 +U 1 +L 3 +R 2 +L 1 +U 2 +D 1 +R 1 +U 1 +D 1 +L 3 +U 3 +R 3 +U 1 +L 1 +U 1 +R 3 +U 3 +L 2 +R 1 +L 2 +U 1 +R 3 +L 3 +U 1 +D 2 +U 3 +R 3 +D 1 +L 1 +R 2 +L 1 +U 1 +R 2 +D 1 +U 1 +D 1 +R 3 +D 3 +R 1 +U 3 +D 2 +R 2 +L 2 +U 1 +R 2 +U 2 +D 2 +R 1 +U 1 +R 3 +D 2 +U 1 +D 2 +L 3 +R 3 +U 3 +R 3 +L 3 +U 3 +L 2 +R 1 +U 2 +D 2 +R 2 +L 1 +U 3 +L 2 +U 1 +R 1 +U 3 +D 3 +R 2 +L 1 +U 3 +D 3 +L 2 +R 2 +D 3 +L 3 +R 2 +D 3 +U 3 +L 1 +D 1 +L 2 +R 3 +U 2 +D 2 +U 3 +R 2 +L 2 +U 3 +D 1 +L 3 +U 1 +L 1 +U 1 +D 4 +L 3 +U 3 +D 2 +R 3 +U 4 +D 2 +U 1 +R 3 +L 4 +R 1 +D 2 +R 1 +D 4 +U 1 +D 3 +U 4 +L 3 +D 4 +R 1 +U 3 +R 1 +U 2 +L 2 +R 1 +D 2 +U 1 +D 4 +R 1 +D 1 +R 4 +L 2 +D 2 +R 2 +L 3 +U 1 +L 4 +D 1 +U 2 +L 4 +D 3 +R 4 +L 4 +D 3 +L 4 +R 1 +D 3 +U 1 +L 1 +D 4 +R 1 +U 4 +L 2 +U 3 +R 4 +L 4 +D 4 +U 3 +R 2 +U 2 +L 2 +R 1 +U 2 +L 3 +U 4 +D 4 +L 4 +R 4 +L 3 +D 4 +U 3 +L 3 +U 2 +L 3 +R 3 +D 4 +R 4 +L 1 +U 1 +R 1 +D 2 +U 3 +D 4 +L 4 +D 3 +U 4 +L 1 +R 4 +U 2 +D 4 +R 2 +L 3 +R 2 +U 4 +R 3 +U 1 +L 2 +U 4 +R 4 +L 1 +D 2 +R 1 +U 4 +R 4 +U 1 +L 1 +U 1 +R 1 +L 4 +U 2 +R 2 +L 5 +R 5 +L 1 +R 4 +U 5 +L 4 +R 3 +D 1 +R 4 +L 5 +R 2 +L 1 +R 5 +D 4 +R 4 +L 1 +U 2 +D 4 +U 4 +L 5 +D 3 +U 2 +D 5 +L 5 +D 3 +U 1 +R 5 +U 4 +R 1 +U 4 +D 1 +R 2 +D 2 +U 3 +D 3 +R 5 +U 2 +D 2 +U 5 +L 4 +R 1 +D 4 +U 3 +L 4 +D 1 +L 4 +D 5 +L 5 +U 3 +L 2 +R 4 +L 5 +U 2 +L 1 +D 5 +U 2 +R 5 +L 1 +D 2 +R 3 +D 5 +U 2 +D 3 +R 4 +L 3 +R 5 +L 5 +U 3 +L 2 +D 5 +U 5 +R 4 +U 5 +D 5 +L 1 +D 4 +U 4 +L 4 +U 3 +D 3 +L 2 +R 1 +L 5 +D 3 +L 1 +U 4 +D 5 +L 5 +R 1 +U 4 +D 5 +U 3 +D 5 +L 1 +R 5 +L 1 +D 3 +L 2 +D 3 +L 2 +D 2 +U 3 +D 2 +L 3 +R 2 +U 3 +L 4 +D 4 +U 4 +D 4 +R 2 +D 3 +U 4 +D 6 +L 2 +D 4 +U 4 +L 2 +D 4 +U 1 +D 1 +U 1 +R 3 +U 3 +L 1 +U 6 +R 5 +L 1 +U 5 +L 2 +D 1 +U 3 +D 2 +U 3 +D 2 +R 2 +U 6 +L 5 +D 4 +L 2 +D 6 +U 5 +D 3 +R 2 +L 6 +U 5 +R 2 +U 3 +L 2 +R 3 +D 6 +U 5 +D 1 +R 5 +L 3 +U 5 +R 3 +L 5 +R 3 +L 4 +U 6 +D 3 +U 6 +L 3 +R 5 +U 6 +L 1 +D 5 +L 3 +R 5 +L 3 +D 4 +R 4 +D 6 +L 1 +R 4 +U 4 +D 4 +U 5 +D 6 +L 6 +R 2 +L 4 +D 3 +R 4 +U 5 +L 5 +D 4 +R 6 +D 6 +R 2 +U 4 +D 5 +L 6 +R 3 +U 6 +R 6 +D 3 +R 6 +L 1 +D 3 +U 2 +R 2 +D 2 +U 6 +D 4 +U 5 +D 1 +L 6 +U 2 +D 4 +R 2 +D 3 +U 4 +L 1 +D 2 +L 2 +U 2 +D 3 +L 5 +U 6 +L 5 +R 2 +L 2 +D 7 +R 2 +D 6 +U 5 +L 4 +U 2 +R 1 +D 1 +L 7 +D 4 +R 2 +D 6 +U 4 +L 1 +U 2 +R 4 +D 4 +R 3 +L 3 +U 4 +R 3 +L 2 +U 6 +D 1 +L 3 +U 6 +D 2 +R 2 +L 5 +U 7 +R 5 +L 2 +D 5 +U 4 +D 3 +L 1 +D 5 +L 5 +U 4 +R 1 +D 4 +L 2 +D 7 +L 7 +D 3 +U 4 +L 5 +D 3 +L 7 +R 3 +D 4 +L 5 +R 7 +L 2 +U 4 +R 5 +L 2 +R 2 +D 1 +R 1 +U 3 +R 4 +L 1 +U 4 +L 2 +R 1 +U 4 +D 7 +U 2 +D 2 +R 2 +L 3 +D 3 +R 1 +L 2 +R 2 +U 6 +R 1 +U 1 +R 7 +U 3 +D 2 +L 5 +U 7 +D 7 +U 3 +L 2 +U 7 +R 3 +D 3 +U 2 +D 5 +R 6 +D 5 +U 1 +R 7 +D 6 +R 6 +U 3 +L 1 +R 6 +D 6 +R 1 +L 6 +R 6 +D 7 +R 3 +L 5 +R 5 +D 4 +U 7 +L 8 +D 2 +U 3 +D 5 +L 4 +D 2 +R 1 +L 5 +D 8 +U 6 +R 2 +D 2 +L 2 +R 3 +L 2 +R 3 +L 6 +R 4 +U 6 +D 7 +R 6 +L 7 +U 5 +L 6 +R 6 +D 5 +R 5 +D 5 +L 4 +D 4 +U 7 +L 3 +U 7 +L 4 +U 8 +R 7 +D 4 +L 2 +D 6 +R 2 +U 3 +L 6 +D 1 +R 4 +U 8 +D 3 +U 2 +L 6 +R 1 +L 2 +U 4 +L 1 +R 1 +U 8 +D 2 +L 5 +D 6 +L 5 +R 2 +L 5 +U 6 +D 1 +L 7 +U 4 +D 5 +L 3 +R 5 +D 5 +R 3 +L 2 +D 3 +L 3 +D 5 +L 8 +R 7 +D 5 +L 2 +R 3 +U 5 +L 1 +D 6 +R 5 +L 6 +R 1 +U 1 +R 4 +L 6 +U 1 +D 6 +L 7 +D 8 +R 1 +L 5 +D 2 +R 2 +D 2 +R 7 +L 7 +U 7 +R 4 +D 5 +R 4 +U 8 +R 3 +D 6 +R 1 +D 1 +U 8 +D 4 +U 7 +R 3 +L 9 +D 3 +L 9 +U 1 +R 5 +D 4 +U 7 +L 4 +U 4 +L 7 +R 1 +D 8 +R 4 +L 4 +U 4 +L 8 +U 5 +L 7 +D 4 +L 9 +D 2 +U 3 +L 3 +D 5 +U 1 +L 1 +R 6 +D 2 +L 1 +D 2 +L 3 +U 4 +L 6 +U 3 +R 5 +L 3 +D 7 +U 6 +L 6 +D 9 +L 5 +U 1 +R 9 +U 4 +R 1 +L 5 +U 9 +R 6 +D 7 +U 9 +L 4 +U 6 +D 7 +U 8 +L 1 +U 8 +R 4 +L 2 +R 3 +D 1 +U 6 +D 9 +L 8 +U 8 +L 9 +D 4 +R 8 +L 1 +D 9 +L 1 +R 7 +D 8 +U 6 +D 8 +R 9 +U 2 +R 3 +U 7 +R 8 +D 5 +L 6 +U 3 +D 8 +R 2 +U 5 +L 5 +R 9 +D 4 +U 1 +D 6 +L 1 +U 3 +R 4 +L 5 +R 1 +L 9 +R 4 +D 1 +L 9 +D 4 +U 7 +R 2 +D 8 +L 9 +R 5 +L 5 +D 7 +L 6 +D 6 +L 10 +U 8 +L 6 +D 6 +R 9 +D 10 +L 5 +R 8 +D 2 +U 7 +R 4 +U 5 +R 3 +L 6 +D 10 +L 7 +D 7 +U 9 +L 6 +R 10 +U 2 +L 3 +U 10 +D 3 +R 10 +D 4 +L 9 +R 2 +L 8 +R 4 +D 7 +R 10 +D 2 +U 9 +D 2 +R 7 +D 10 +R 10 +D 7 +R 5 +D 5 +R 7 +U 7 +D 10 +U 5 +D 3 +R 5 +U 10 +L 3 +D 7 +R 7 +U 7 +L 4 +U 3 +R 3 +D 7 +L 7 +U 2 +D 4 +L 5 +R 3 +U 5 +D 6 +R 2 +D 4 +U 2 +D 6 +U 7 +D 2 +L 2 +U 6 +D 9 +U 3 +D 1 +U 5 +D 2 +R 3 +L 6 +D 8 +L 7 +R 5 +L 4 +U 6 +L 9 +R 5 +D 5 +U 4 +D 6 +U 5 +D 1 +U 8 +D 2 +L 4 +R 5 +L 3 +U 10 +L 1 +R 10 +U 4 +R 5 +D 4 +R 8 +U 5 +L 2 +R 10 +L 10 +U 4 +D 3 +U 3 +R 4 +D 8 +R 9 +L 5 +R 5 +D 10 +L 11 +D 10 +L 6 +R 11 +L 2 +R 7 +U 6 +R 9 +L 10 +D 3 +R 6 +D 7 +L 10 +U 7 +D 2 +L 4 +D 1 +L 8 +D 7 +L 10 +R 2 +U 7 +L 9 +R 1 +D 1 +L 11 +U 11 +D 3 +R 4 +D 4 +U 11 +L 6 +D 2 +L 7 +D 6 +U 8 +L 1 +R 11 +L 1 +U 3 +D 8 +L 4 +D 11 +U 8 +R 4 +D 1 +R 5 +D 9 +L 2 +D 1 +U 4 +R 7 +L 6 +D 5 +U 1 +L 8 +U 6 +R 10 +D 11 +U 3 +D 1 +U 7 +D 9 +R 8 +D 4 +R 11 +L 5 +D 8 +L 8 +U 1 +R 10 +U 9 +D 7 +R 1 +D 9 +U 1 +R 3 +D 11 +L 9 +D 1 +R 2 +U 5 +R 8 +U 1 +L 8 +D 11 +U 9 +L 8 +U 1 +R 1 +D 1 +R 10 +D 3 +R 8 +U 10 +D 2 +U 6 +D 5 +R 5 +D 10 +R 7 +L 1 +R 10 +U 1 +D 8 +R 7 +D 10 +R 8 +U 2 +L 12 +D 1 +R 6 +D 7 +U 11 +L 8 +R 12 +D 3 +U 12 +L 11 +D 2 +R 3 +L 6 +U 1 +R 2 +L 5 +R 2 +U 8 +L 11 +R 4 +L 2 +R 3 +D 12 +R 4 +U 8 +R 5 +D 6 +R 9 +D 8 +R 7 +D 10 +R 5 +U 4 +L 6 +D 1 +U 6 +D 7 +R 2 +L 2 +R 8 +L 12 +R 7 +L 9 +U 10 +D 2 +R 9 +L 2 +D 10 +U 8 +R 9 +L 7 +D 1 +L 8 +R 4 +L 6 +D 11 +R 2 +L 6 +D 1 +R 6 +D 2 +R 11 +U 9 +R 10 +U 8 +L 4 +D 12 +L 4 +D 7 +R 5 +L 11 +D 2 +U 7 +D 1 +L 10 +R 3 +L 5 +U 12 +R 5 +L 8 +R 6 +L 10 +D 9 +U 8 +R 3 +D 12 +L 4 +D 7 +U 3 +D 11 +U 2 +D 11 +R 7 +D 5 +U 2 +D 8 +U 7 +R 2 +U 5 +D 1 +R 10 +D 7 +L 7 +R 4 +L 1 +U 12 +L 12 +D 9 +R 7 +U 9 +R 5 +L 3 +R 2 +U 11 +D 1 +L 10 +D 11 +R 1 +D 7 +R 7 +D 9 +R 13 +D 7 +L 9 +D 9 +R 13 +D 7 +R 9 +D 10 +U 7 +R 5 +L 1 +U 8 +D 9 +U 10 +L 5 +U 4 +D 9 +U 1 +L 8 +D 3 +U 7 +D 6 +U 2 +D 8 +L 12 +U 2 +R 11 +L 10 +R 9 +D 4 +L 4 +U 2 +L 11 +U 11 +R 6 +D 7 +L 2 +D 6 +R 9 +L 7 +D 6 +L 12 +U 12 +D 5 +R 1 +L 11 +U 12 +L 4 +D 4 +R 12 +U 6 +R 4 +U 6 +R 3 +L 3 +R 10 +D 6 +R 9 +D 12 +U 6 +D 3 +U 13 +D 13 +U 2 +D 10 +R 6 +L 10 +R 10 +L 13 +U 6 +D 12 +R 8 +D 8 +U 6 +D 1 +L 7 +R 7 +U 5 +R 4 +U 2 +D 8 +L 11 +D 13 +L 10 +U 3 +L 8 +U 6 +D 5 +R 8 +D 12 +U 13 +L 10 +U 12 +R 10 +U 9 +L 3 +D 10 +U 3 +R 2 +L 8 +D 4 +U 12 +L 13 +R 14 +U 13 +R 4 +L 7 +D 5 +L 12 +D 4 +L 9 +R 12 +D 10 +U 11 +R 7 +D 3 +R 5 +D 13 +R 11 +D 8 +R 4 +L 3 +R 11 +L 5 +D 7 +U 2 +D 8 +L 12 +R 2 +D 10 +U 11 +D 6 +L 9 +D 8 +R 3 +D 9 +L 9 +D 6 +R 10 +U 5 +D 2 +R 9 +U 5 +D 7 +L 1 +D 14 +U 2 +R 14 +U 11 +D 4 +L 8 +R 8 +D 2 +L 3 +U 4 +R 2 +U 5 +R 6 +U 8 +R 2 +L 4 +D 1 +L 9 +U 13 +D 12 +R 7 +L 6 +R 10 +U 12 +L 14 +U 3 +L 6 +D 12 +R 13 +L 13 +U 5 +L 5 +R 6 +L 11 +R 7 +L 6 +D 14 +U 2 +D 12 +L 2 +R 9 +U 4 +L 14 +U 12 +R 12 +D 3 +L 5 +R 8 +D 10 +R 13 +D 6 +U 9 +R 10 +L 14 +D 4 +L 6 +D 8 +L 12 +U 10 +L 11 +D 3 +U 2 +R 2 +L 13 +R 6 +L 3 +R 14 +D 7 +R 3 +D 14 +R 3 +L 1 +D 15 +L 6 +U 6 +R 3 +D 12 +U 11 +R 10 +D 10 +L 2 +R 1 +U 7 +D 2 +L 7 +D 13 +R 9 +U 6 +R 6 +D 7 +R 3 +L 14 +R 2 +L 10 +D 13 +U 8 +R 3 +U 12 +R 10 +L 12 +R 11 +U 6 +L 13 +R 1 +D 14 +U 13 +D 13 +U 1 +L 10 +R 2 +D 4 +U 1 +L 7 +U 2 +D 9 +R 9 +U 7 +L 9 +D 7 +U 2 +R 1 +D 13 +U 3 +L 1 +U 3 +D 15 +U 6 +R 8 +L 6 +U 6 +L 8 +D 1 +U 4 +R 15 +L 13 +R 3 +L 15 +D 4 +R 10 +L 14 +U 2 +L 3 +R 7 +L 12 +R 15 +U 7 +D 2 +U 15 +R 12 +D 12 +L 6 +D 8 +R 5 +L 14 +R 8 +U 1 +D 5 +U 1 +L 3 +R 2 +U 9 +L 5 +U 8 +L 2 +U 1 +R 5 +D 3 +L 4 +R 15 +U 15 +L 6 +D 12 +U 9 +D 12 +U 9 +D 9 +L 16 +U 10 +D 4 +R 13 +D 4 +U 6 +L 1 +U 6 +R 12 +L 6 +D 8 +U 11 +D 9 +R 16 +U 14 +L 15 +U 15 +D 5 +R 6 +D 16 +R 1 +D 10 +L 5 +R 12 +L 1 +D 9 +U 9 +D 11 +L 9 +U 5 +R 11 +U 16 +L 6 +D 13 +L 3 +D 7 +U 1 +R 11 +D 6 +R 6 +U 7 +L 14 +R 2 +L 6 +U 8 +L 9 +R 3 +D 1 +L 13 +R 8 +L 14 +U 11 +D 13 +L 12 +U 8 +L 6 +U 13 +D 8 +U 8 +D 12 +R 7 +D 16 +U 4 +D 2 +L 6 +R 7 +U 1 +L 12 +R 13 +D 16 +L 3 +D 4 +R 15 +U 5 +R 1 +D 14 +L 1 +U 4 +L 14 +U 15 +R 14 +L 14 +R 16 +U 10 +L 4 +D 6 +U 5 +L 15 +U 8 +L 9 +R 12 +U 7 +R 4 +L 16 +U 10 +R 6 +U 14 +L 3 +D 13 +L 6 +U 12 +R 3 +L 16 +R 16 +U 8 +R 13 +U 7 +D 6 +R 3 +U 16 +L 2 +D 2 +R 17 +D 17 +R 3 +L 11 +R 12 +L 1 +R 17 +L 9 +U 2 +L 16 +D 16 +L 7 +R 2 +D 13 +U 1 +D 5 +L 5 +U 14 +D 13 +R 3 +U 5 +D 9 +L 9 +U 3 +L 2 +U 8 +L 5 +R 13 +L 8 +U 2 +R 6 +D 2 +L 9 +U 15 +R 14 +U 1 +R 11 +D 13 +U 9 +D 17 +R 14 +D 14 +R 7 +D 3 +L 1 +R 15 +D 13 +U 14 +R 3 +U 5 +D 15 +L 10 +R 10 +L 1 +R 16 +D 13 +L 17 +U 9 +R 1 +L 4 +U 4 +L 3 +R 10 +L 14 +U 17 +R 6 +L 17 +D 11 +R 5 +D 5 +U 1 +L 9 +U 7 +D 1 +U 6 +L 13 +U 6 +D 13 +R 17 +U 3 +D 5 +L 15 +U 3 +L 5 +R 12 +L 16 +U 8 +R 7 +U 16 +R 14 +U 17 +R 2 +U 6 +L 5 +U 17 +D 11 +U 3 +R 8 +D 5 +U 16 +R 1 +U 11 +L 15 +R 12 +L 5 +D 13 +L 16 +R 14 +L 15 +D 17 +L 6 +U 9 +R 18 +D 8 +U 6 +L 18 +U 11 +L 3 +U 18 +D 14 +L 17 +D 5 +L 15 +D 5 +L 12 +D 13 +U 9 +L 7 +R 11 +U 12 +L 4 +R 6 +U 7 +D 17 +U 13 +L 10 +U 15 +R 7 +L 2 +R 8 +L 7 +U 1 +R 17 +L 17 +D 4 +L 13 +R 2 +D 5 +U 3 +L 1 +U 2 +D 18 +L 3 +D 17 +R 6 +U 12 +D 11 +L 1 +R 10 +U 9 +D 7 +R 12 +U 11 +D 13 +L 11 +R 14 +U 6 +R 11 +L 13 +U 5 +D 15 +R 12 +U 10 +R 16 +D 16 +L 1 +U 18 +R 8 +L 8 +R 4 +L 18 +U 5 +R 15 +L 15 +U 13 +D 16 +R 4 +D 13 +R 6 +L 13 +D 1 +U 8 +R 13 +D 8 +L 17 +U 12 +R 2 +U 13 +L 6 +U 16 +L 15 +R 17 +D 1 +R 8 +D 9 +R 4 +U 11 +D 11 +L 12 +R 10 +U 2 +R 3 +D 7 +L 2 +U 8 +R 3 +D 4 +U 6 +L 8 +U 9 +R 7 +D 1 +U 12 +L 4 +U 13 +L 11 +D 14 +U 18 +L 17 +R 4 +L 19 +R 1 +D 12 +U 9 +R 11 +D 4 +U 15 +R 7 +D 6 +L 17 +D 4 +R 5 +U 11 +R 9 +L 4 +U 11 +R 10 +U 4 +D 19 +U 18 +D 12 +R 2 +L 15 +D 1 +R 13 +D 3 +R 5 +D 6 +U 11 +L 3 +D 5 +R 2 +D 15 +R 4 +U 19 +D 8 +L 11 +R 17 +U 7 +D 1 +U 2 +R 18 +L 10 +R 4 +D 7 +U 8 +L 1 +U 11 +L 15 +R 2 +U 13 +R 12 +L 8 +R 1 +U 4 +L 12 +R 13 +D 7 +U 5 +R 14 +U 13 +D 13 +L 18 +U 18 +R 14 +D 18 +U 12 +D 11 +U 6 +R 6 +U 5 +R 4 +D 7 +R 1 +U 5 +R 1 +D 1 +U 13 +D 10 +R 19 +D 7 +U 14 +D 7 +U 19 +R 12 +L 2 +D 12 +U 10 +D 17 +L 12 +U 1 +R 8 +L 8 +D 15 +R 9 +U 5 +R 11 +L 10 +R 2 +L 13 +U 10 +L 7 +U 1 diff --git a/src/day09/mod.rs b/src/day09/mod.rs index 446eb6b..2b7b20b 100644 --- a/src/day09/mod.rs +++ b/src/day09/mod.rs @@ -1,18 +1,101 @@ use crate::read; use itertools::Itertools; +use std::collections::HashSet; + +#[derive(Debug, PartialEq, Eq, Default, Clone, Copy, Hash)] +struct Position { + pub x: i32, + pub y: i32, +} + +impl Position { + pub fn to_right(&self, count: i32) -> Self { + Self { + x: self.x + count, + y: self.y, + } + } + pub fn to_left(&self, count: i32) -> Self { + Self { + x: self.x - count, + y: self.y, + } + } + pub fn to_up(&self, count: i32) -> Self { + Self { + x: self.x, + y: self.y - count, + } + } + pub fn to_down(&self, count: i32) -> Self { + Self { + x: self.x, + y: self.y + count, + } + } + + pub fn follow_head(&self, head: &Position) -> Self { + if head.x == self.x && head.y > self.y + 1 { + self.to_down(1) + } else if head.x == self.x && head.y < self.y - 1 { + self.to_up(1) + } else if head.x > self.x + 1 && head.y == self.y { + self.to_right(1) + } else if head.x < self.x - 1 && head.y == self.y { + self.to_left(1) + } else if (head.x - self.x).abs() == 1 && (head.y - self.y).abs() == 1 { + *self + } else if head.x < self.x && head.y < self.y { + self.to_left(1).to_up(1) + } else if head.x > self.x && head.y < self.y { + self.to_right(1).to_up(1) + } else if head.x > self.x && head.y > self.y { + self.to_right(1).to_down(1) + } else if head.x < self.x && head.y > self.y { + self.to_left(1).to_down(1) + } else { + *self + } + } +} pub fn run() { - let input = read("08"); - let lines = input.lines(); - for line in lines {} - #[cfg(feature = "part1")] { - println!("Day 9, Part 01: {}", "TODO"); + println!("Day 9, Part 01: {}", simulate(2)); } #[cfg(feature = "part2")] { - println!("Day 9, Part 02: {}", "TODO"); + println!("Day 9, Part 02: {}", simulate(10)); } } +pub fn simulate(num_knots: usize) -> usize { + let mut visited: HashSet = HashSet::new(); + let mut knots = vec![Position::default(); num_knots]; + + let input = read("09"); + let lines = input.lines(); + for line in lines { + if line.is_empty() { + continue; + } + let (dir, count) = line.split_once(' ').unwrap(); + let count = count.parse().unwrap(); + for _c in 0..count { + knots[0] = match dir { + "R" => knots[0].to_right(1), + "U" => knots[0].to_up(1), + "L" => knots[0].to_left(1), + "D" => knots[0].to_down(1), + _ => unreachable!(), + }; + for i in 1..knots.len() { + knots[i] = knots[i].follow_head(&knots[i - 1]); + } + + visited.insert(*knots.last().unwrap()); + } + } + visited.len() +}