diff --git a/input/09 b/input/09 new file mode 100644 index 0000000..db7d58e --- /dev/null +++ b/input/09 @@ -0,0 +1,2000 @@ +D 2 +U 2 +L 2 +R 1 +L 1 +U 1 +L 2 +D 1 +L 2 +D 1 +L 2 +D 2 +L 1 +R 2 +U 1 +R 1 +U 2 +R 1 +U 2 +D 1 +L 2 +U 1 +D 1 +L 1 +D 1 +U 1 +R 2 +D 2 +L 1 +R 1 +L 2 +D 1 +R 2 +D 1 +U 2 +D 2 +R 2 +L 2 +U 2 +R 2 +L 1 +D 1 +R 1 +U 1 +R 2 +L 1 +D 1 +R 1 +L 2 +D 2 +U 1 +L 1 +R 1 +U 1 +L 2 +D 2 +L 2 +U 1 +L 2 +R 1 +L 1 +R 1 +D 1 +R 2 +D 1 +R 1 +D 1 +U 1 +L 1 +R 1 +L 1 +R 1 +D 2 +L 1 +D 2 +R 1 +D 1 +U 2 +R 2 +U 2 +L 1 +U 1 +R 1 +L 2 +D 2 +R 1 +U 1 +L 1 +U 2 +L 1 +D 2 +R 1 +U 1 +R 1 +U 2 +R 1 +U 2 +L 1 +R 1 +U 2 +R 2 +U 1 +L 2 +R 1 +L 2 +U 2 +L 2 +U 2 +R 2 +D 1 +U 2 +L 2 +D 3 +U 1 +L 1 +R 1 +D 3 +U 1 +L 3 +R 1 +U 1 +R 3 +D 2 +U 1 +R 2 +L 2 +U 1 +D 1 +U 1 +D 1 +L 2 +U 2 +R 3 +D 2 +L 2 +D 2 +U 3 +D 3 +U 2 +L 1 +U 2 +R 3 +D 2 +R 2 +D 1 +U 3 +L 3 +D 1 +U 3 +R 3 +D 1 +L 1 +D 3 +U 3 +D 1 +U 2 +R 1 +D 2 +U 3 +D 1 +R 2 +D 3 +L 3 +R 1 +D 3 +L 2 +D 3 +U 3 +R 1 +U 3 +L 2 +U 2 +L 2 +D 3 +L 3 +U 2 +R 2 +L 3 +R 2 +U 3 +R 3 +L 1 +U 3 +D 3 +L 2 +D 2 +U 2 +D 3 +L 3 +D 2 +L 1 +U 3 +D 2 +R 3 +L 3 +R 1 +U 1 +D 1 +R 2 +L 3 +U 2 +D 1 +R 3 +L 1 +R 1 +L 2 +R 1 +U 3 +R 2 +U 1 +L 1 +R 3 +D 3 +U 2 +R 2 +D 1 +R 3 +D 2 +L 3 +R 1 +U 3 +R 2 +U 4 +L 2 +D 1 +U 1 +R 4 +U 2 +R 2 +U 3 +R 1 +L 3 +U 3 +R 3 +U 4 +R 4 +D 1 +U 2 +R 1 +L 1 +R 2 +U 4 +L 1 +U 2 +L 1 +R 3 +L 2 +D 4 +R 4 +D 3 +R 4 +U 1 +D 4 +R 2 +D 1 +R 4 +U 3 +R 4 +L 1 +U 4 +D 2 +L 1 +D 3 +L 1 +R 2 +L 2 +D 4 +U 3 +D 1 +L 3 +D 3 +U 3 +L 4 +R 3 +U 1 +R 2 +D 1 +U 4 +D 4 +R 4 +U 2 +R 4 +L 4 +D 2 +L 4 +D 2 +U 3 +D 2 +U 4 +R 1 +U 1 +L 1 +U 1 +L 1 +D 3 +U 4 +L 3 +U 1 +L 4 +R 4 +L 3 +R 2 +U 2 +L 3 +D 2 +U 1 +D 1 +U 4 +R 2 +L 2 +D 1 +L 4 +D 3 +U 3 +L 2 +U 4 +R 4 +L 2 +R 3 +L 1 +D 4 +U 1 +L 2 +D 4 +L 2 +D 3 +U 4 +R 4 +U 2 +R 2 +U 4 +D 3 +U 3 +L 4 +D 2 +R 1 +U 4 +R 1 +U 1 +D 3 +U 1 +L 5 +U 5 +R 2 +D 3 +U 5 +D 5 +U 1 +D 2 +L 2 +U 5 +L 1 +R 5 +L 1 +D 5 +L 4 +D 4 +R 4 +L 1 +R 1 +U 1 +R 4 +U 2 +R 5 +L 4 +R 3 +U 4 +R 2 +U 4 +L 4 +U 3 +L 3 +U 1 +L 4 +R 1 +U 3 +R 3 +L 5 +U 5 +L 4 +D 1 +L 2 +U 1 +D 2 +L 1 +U 5 +D 4 +U 1 +R 2 +D 2 +U 5 +R 5 +U 1 +L 3 +U 5 +L 4 +R 3 +U 4 +L 2 +R 4 +D 2 +L 2 +R 4 +U 2 +D 4 +R 3 +D 4 +U 1 +L 3 +R 4 +L 3 +U 1 +R 2 +U 3 +L 3 +D 2 +U 4 +R 1 +L 3 +D 4 +L 1 +R 1 +D 5 +R 1 +U 2 +D 1 +U 4 +L 2 +U 2 +R 4 +U 3 +R 3 +D 2 +R 5 +D 2 +U 5 +D 5 +U 2 +D 1 +R 5 +U 3 +L 3 +U 1 +R 5 +L 4 +D 6 +L 1 +U 2 +D 4 +U 6 +D 6 +R 1 +U 3 +L 5 +R 5 +U 2 +R 2 +L 5 +D 4 +L 3 +R 1 +U 4 +D 3 +L 2 +D 5 +L 3 +R 3 +D 2 +L 1 +U 5 +L 5 +D 6 +U 3 +R 5 +L 5 +U 2 +L 3 +U 5 +D 6 +R 4 +L 5 +U 6 +L 2 +R 1 +L 1 +U 5 +D 3 +U 2 +R 1 +U 2 +R 2 +D 5 +R 1 +D 5 +R 5 +U 2 +L 3 +R 1 +U 5 +D 5 +R 2 +L 5 +D 6 +L 1 +U 1 +D 6 +U 4 +D 5 +L 5 +D 3 +L 4 +D 1 +L 4 +D 6 +R 5 +D 6 +U 6 +D 2 +L 3 +D 3 +R 5 +U 6 +D 2 +U 4 +L 1 +U 6 +L 2 +U 4 +D 6 +R 1 +D 1 +U 2 +L 3 +D 3 +R 2 +L 6 +U 3 +D 5 +U 3 +L 4 +U 5 +L 5 +U 6 +L 3 +R 1 +U 3 +R 1 +U 4 +L 4 +D 5 +L 6 +R 1 +L 3 +D 4 +L 3 +R 1 +L 4 +R 3 +D 3 +L 1 +U 4 +D 2 +U 5 +L 3 +D 6 +U 2 +R 3 +D 5 +L 1 +D 1 +L 3 +U 2 +R 3 +L 3 +U 7 +R 2 +D 1 +L 3 +R 4 +D 2 +R 5 +L 1 +D 5 +L 2 +R 2 +U 7 +L 7 +D 2 +L 7 +D 5 +U 2 +L 2 +U 2 +D 4 +U 1 +D 4 +L 1 +D 2 +R 5 +D 3 +L 2 +U 4 +R 7 +D 4 +R 3 +U 2 +R 4 +L 1 +U 4 +L 4 +U 7 +R 1 +L 6 +D 5 +R 5 +L 1 +R 4 +L 1 +U 3 +L 7 +R 7 +D 4 +L 3 +R 3 +D 1 +U 7 +R 3 +D 2 +U 4 +D 2 +R 3 +D 1 +R 3 +D 3 +U 1 +R 6 +L 2 +D 2 +U 4 +D 5 +L 7 +R 1 +L 7 +U 6 +D 2 +R 3 +D 5 +U 1 +L 7 +D 6 +U 3 +D 6 +L 1 +R 2 +L 6 +D 7 +R 5 +U 1 +L 7 +U 2 +D 2 +L 5 +R 7 +D 4 +U 3 +R 7 +L 4 +U 8 +D 8 +R 2 +U 2 +R 7 +U 1 +D 7 +R 1 +L 7 +R 7 +L 8 +D 3 +R 5 +L 4 +D 3 +L 6 +R 6 +D 6 +L 3 +D 5 +R 1 +U 5 +D 7 +R 8 +U 3 +D 5 +U 8 +L 8 +R 6 +D 8 +U 5 +R 1 +D 1 +R 5 +U 2 +R 8 +D 7 +L 3 +D 3 +U 7 +D 3 +U 7 +R 7 +L 4 +D 7 +U 2 +L 3 +U 7 +L 1 +D 3 +L 1 +R 4 +D 8 +L 5 +U 5 +D 3 +L 5 +D 6 +L 1 +R 5 +U 4 +R 4 +D 1 +R 6 +L 1 +D 7 +R 4 +L 2 +R 3 +U 4 +L 8 +D 1 +R 6 +L 6 +R 8 +D 8 +U 4 +R 1 +D 2 +R 5 +D 1 +U 8 +L 5 +D 5 +U 5 +R 8 +L 6 +R 4 +U 1 +R 5 +U 8 +D 1 +U 1 +D 5 +L 7 +R 6 +L 3 +R 1 +U 2 +L 6 +R 5 +D 4 +R 6 +D 4 +R 2 +L 7 +R 8 +L 6 +D 2 +L 8 +U 4 +R 4 +U 3 +D 8 +U 8 +L 8 +D 5 +R 2 +D 5 +U 7 +L 9 +R 8 +U 9 +R 9 +U 6 +L 6 +D 1 +U 3 +L 1 +D 7 +R 6 +L 6 +D 7 +U 1 +R 9 +D 7 +U 8 +R 6 +U 1 +D 5 +U 5 +D 1 +L 1 +D 9 +U 1 +R 6 +U 9 +R 6 +U 6 +D 7 +R 1 +L 1 +D 8 +L 3 +D 7 +U 8 +L 7 +D 2 +U 6 +D 4 +L 8 +U 3 +D 1 +U 6 +D 3 +R 8 +L 9 +R 3 +L 6 +U 9 +D 9 +L 3 +U 1 +D 2 +R 4 +L 5 +R 2 +U 3 +D 5 +R 5 +L 4 +U 3 +L 7 +U 5 +D 9 +U 6 +R 5 +D 3 +U 8 +L 6 +D 5 +R 9 +U 8 +L 5 +D 1 +R 8 +L 4 +R 2 +L 3 +R 9 +D 9 +R 7 +D 5 +R 6 +U 2 +D 4 +L 8 +D 2 +L 1 +D 2 +U 3 +L 2 +R 3 +D 9 +U 3 +R 4 +D 1 +L 8 +R 3 +U 4 +L 4 +R 3 +L 5 +D 4 +R 2 +D 4 +R 4 +U 4 +R 7 +L 6 +R 9 +D 1 +R 8 +L 5 +U 4 +D 10 +L 6 +D 3 +R 2 +U 1 +D 5 +R 2 +U 6 +L 9 +U 7 +L 10 +U 4 +L 8 +D 3 +U 7 +D 7 +U 9 +L 2 +R 6 +U 4 +R 9 +L 5 +U 3 +L 4 +R 1 +D 8 +U 10 +D 10 +R 3 +U 3 +D 2 +L 5 +U 3 +D 4 +U 1 +R 9 +L 3 +D 8 +L 5 +U 8 +R 3 +U 10 +L 10 +R 4 +D 5 +U 9 +R 8 +L 5 +U 9 +L 6 +U 10 +D 8 +U 2 +L 8 +D 7 +U 2 +D 5 +U 8 +L 2 +D 3 +U 8 +R 8 +D 10 +R 3 +L 3 +U 4 +R 3 +U 4 +L 6 +U 4 +R 3 +D 9 +L 9 +U 5 +D 1 +R 3 +D 2 +L 9 +U 9 +R 9 +U 6 +R 7 +L 8 +U 2 +L 4 +D 10 +L 4 +D 9 +L 9 +R 10 +L 3 +R 7 +U 2 +L 3 +R 1 +D 4 +L 2 +R 10 +D 5 +L 2 +D 2 +L 4 +U 6 +D 9 +R 6 +U 9 +D 4 +L 6 +U 8 +D 1 +R 1 +L 10 +U 4 +R 6 +U 11 +R 8 +U 1 +D 5 +R 7 +D 8 +L 5 +R 6 +U 5 +R 1 +U 7 +L 4 +D 6 +U 8 +R 10 +D 1 +L 8 +R 3 +U 7 +R 2 +U 9 +D 9 +R 9 +L 3 +R 4 +U 10 +L 7 +R 1 +L 5 +D 11 +R 4 +U 10 +R 10 +L 3 +D 2 +L 4 +U 9 +L 1 +D 10 +L 7 +R 11 +D 5 +U 3 +D 10 +U 5 +L 2 +R 9 +D 10 +U 1 +R 10 +U 1 +L 11 +R 10 +L 8 +D 10 +L 5 +R 2 +L 3 +U 4 +L 10 +R 3 +D 5 +R 8 +L 2 +U 1 +D 7 +U 7 +L 1 +U 11 +D 2 +L 2 +D 11 +L 6 +R 9 +U 10 +R 7 +L 11 +R 7 +D 1 +R 3 +U 6 +R 7 +D 8 +U 3 +L 1 +D 11 +U 7 +R 1 +L 7 +R 2 +L 7 +D 3 +U 10 +D 9 +U 10 +R 5 +D 4 +U 7 +L 11 +U 1 +L 12 +R 10 +U 7 +R 3 +L 2 +U 11 +R 6 +U 8 +D 2 +R 2 +L 8 +U 7 +D 10 +U 3 +D 1 +U 8 +R 2 +D 9 +L 8 +R 10 +L 1 +U 8 +R 11 +U 8 +R 12 +D 10 +L 5 +U 6 +L 11 +D 12 +L 5 +U 4 +L 8 +U 11 +D 2 +U 4 +L 6 +R 1 +L 4 +U 2 +L 5 +R 2 +D 7 +L 12 +R 4 +L 1 +D 7 +L 11 +U 3 +D 9 +R 12 +U 10 +D 9 +U 10 +L 6 +R 6 +D 10 +R 10 +D 5 +U 9 +R 2 +D 4 +L 9 +U 2 +R 5 +L 8 +R 1 +D 9 +L 7 +D 11 +R 3 +L 8 +U 3 +D 7 +U 3 +R 8 +U 7 +L 1 +U 10 +D 8 +R 11 +U 10 +D 11 +U 8 +R 12 +U 9 +D 12 +U 4 +D 11 +R 8 +D 1 +L 4 +R 9 +L 7 +U 8 +R 6 +D 5 +R 8 +D 2 +R 6 +L 4 +D 7 +L 3 +U 11 +R 2 +L 10 +D 13 +R 2 +D 10 +U 9 +D 5 +U 5 +D 5 +L 11 +U 3 +R 5 +U 7 +L 6 +D 4 +L 3 +R 2 +D 9 +U 7 +D 9 +U 1 +D 8 +L 11 +D 7 +U 7 +R 3 +L 6 +D 6 +R 5 +L 6 +R 3 +U 10 +L 13 +U 9 +R 11 +L 13 +R 9 +D 3 +U 3 +L 12 +U 4 +L 3 +D 12 +R 13 +D 7 +U 6 +L 11 +U 4 +L 2 +D 7 +L 8 +R 10 +U 13 +R 9 +U 8 +R 11 +U 8 +R 7 +U 11 +L 8 +D 3 +L 4 +U 6 +D 12 +R 13 +U 10 +L 4 +R 12 +U 13 +L 11 +R 10 +L 8 +U 6 +L 1 +D 11 +U 12 +L 8 +U 2 +L 6 +U 2 +L 1 +U 3 +D 5 +U 2 +D 10 +U 11 +L 9 +D 9 +R 7 +L 3 +U 3 +D 2 +U 2 +R 10 +D 1 +R 5 +L 1 +D 3 +R 8 +U 4 +R 1 +D 13 +L 12 +U 1 +D 13 +R 4 +D 3 +R 8 +D 2 +U 3 +D 8 +L 3 +U 9 +R 4 +D 8 +U 9 +D 3 +L 8 +D 11 +L 8 +U 1 +D 13 +U 14 +D 10 +U 9 +R 4 +D 14 +L 10 +D 10 +U 6 +D 7 +R 8 +U 5 +L 8 +R 9 +D 12 +L 9 +D 8 +R 13 +L 7 +U 11 +R 8 +D 5 +U 14 +D 5 +U 9 +L 7 +D 12 +R 2 +L 14 +U 1 +R 9 +U 10 +R 4 +U 4 +R 14 +D 10 +L 3 +R 4 +L 13 +U 3 +R 6 +L 2 +U 6 +R 2 +D 10 +U 4 +L 10 +U 8 +L 6 +D 2 +R 1 +D 5 +U 14 +L 4 +D 5 +L 5 +U 10 +D 5 +R 13 +D 14 +U 14 +R 4 +D 13 +U 10 +R 13 +D 12 +R 10 +L 12 +U 8 +D 10 +U 12 +D 5 +L 11 +D 13 +R 8 +D 10 +R 13 +L 13 +D 1 +U 10 +L 4 +U 14 +D 12 +U 4 +D 5 +R 10 +L 8 +R 13 +D 13 +U 5 +D 4 +L 1 +D 9 +L 14 +U 14 +R 3 +U 6 +R 14 +L 4 +R 7 +D 3 +R 8 +D 5 +L 2 +U 5 +D 8 +U 3 +R 7 +D 13 +U 14 +R 11 +U 6 +L 15 +R 4 +U 12 +R 1 +L 8 +U 15 +R 5 +L 2 +D 1 +R 12 +D 1 +R 12 +D 1 +L 1 +R 9 +U 11 +D 2 +U 12 +D 3 +U 6 +D 12 +U 11 +R 6 +D 11 +L 5 +R 3 +D 1 +U 7 +L 10 +D 4 +L 7 +R 2 +U 8 +D 11 +L 12 +R 6 +L 7 +D 13 +U 11 +R 5 +D 1 +L 11 +D 2 +U 15 +L 11 +R 3 +L 9 +D 12 +U 8 +D 9 +L 14 +D 10 +L 12 +R 13 +D 3 +L 9 +D 13 +R 8 +D 15 +U 14 +R 9 +U 12 +R 2 +D 3 +U 5 +L 3 +R 7 +U 15 +R 10 +L 6 +R 6 +D 12 +R 14 +L 7 +U 8 +L 11 +R 13 +U 8 +L 8 +R 5 +D 3 +U 8 +D 4 +L 1 +D 11 +U 15 +L 14 +R 8 +L 1 +R 13 +L 2 +R 13 +U 9 +D 12 +L 14 +R 13 +L 5 +R 7 +D 13 +U 15 +R 2 +L 12 +D 12 +R 13 +U 2 +D 4 +R 14 +L 1 +U 12 +D 3 +U 6 +R 6 +L 6 +U 9 +L 16 +U 16 +D 8 +R 8 +U 1 +D 14 +R 13 +D 3 +U 14 +R 7 +U 7 +R 7 +D 12 +U 1 +D 2 +U 2 +R 7 +D 11 +U 4 +R 13 +U 2 +L 16 +U 12 +L 15 +D 10 +U 11 +L 1 +D 1 +L 3 +D 15 +L 12 +R 2 +D 12 +U 16 +R 16 +U 11 +D 15 +R 11 +U 13 +L 3 +R 15 +D 16 +R 9 +D 1 +L 3 +U 9 +D 12 +U 11 +L 13 +R 10 +D 4 +U 12 +L 2 +R 8 +L 1 +U 9 +L 1 +D 7 +R 14 +U 12 +L 9 +R 5 +D 7 +R 10 +D 14 +L 2 +U 2 +L 4 +D 15 +U 7 +D 9 +L 4 +R 1 +L 8 +D 14 +U 9 +D 1 +R 15 +U 9 +R 10 +D 11 +L 14 +R 12 +L 12 +U 13 +R 12 +L 1 +R 10 +D 14 +R 3 +U 5 +D 10 +L 13 +U 11 +R 16 +L 14 +U 6 +D 5 +R 16 +D 7 +L 16 +U 12 +R 14 +U 7 +R 6 +U 17 +R 3 +U 15 +R 17 +U 3 +R 4 +U 6 +D 13 +U 7 +R 12 +U 10 +R 7 +L 13 +U 16 +D 13 +U 2 +L 13 +R 2 +D 1 +U 10 +R 6 +D 11 +R 10 +D 6 +R 2 +L 1 +R 1 +L 5 +D 16 +U 1 +L 13 +U 3 +R 9 +L 10 +D 12 +R 9 +U 17 +R 10 +U 1 +D 13 +L 13 +R 6 +L 5 +D 5 +R 15 +D 15 +L 7 +U 11 +D 1 +U 11 +L 17 +R 5 +L 11 +R 15 +U 16 +D 2 +L 5 +D 9 +R 13 +D 14 +U 6 +L 10 +U 15 +D 15 +R 5 +D 4 +L 13 +R 11 +D 15 +U 13 +R 8 +U 6 +R 8 +U 3 +R 12 +U 11 +L 6 +U 9 +D 6 +L 1 +U 4 +L 6 +R 4 +D 2 +L 6 +U 11 +L 1 +U 10 +R 2 +U 6 +R 1 +U 7 +R 16 +L 12 +U 9 +D 9 +U 6 +R 13 +U 8 +L 6 +U 2 +R 17 +L 6 +U 5 +D 14 +R 15 +D 13 +L 5 +U 18 +R 9 +L 10 +R 9 +D 6 +L 8 +U 3 +D 8 +R 17 +L 4 +R 9 +L 13 +U 3 +R 12 +D 4 +R 11 +U 13 +L 15 +R 13 +D 18 +R 8 +L 7 +R 10 +D 11 +U 8 +R 4 +L 7 +U 15 +L 3 +D 15 +R 3 +U 6 +L 17 +D 17 +L 12 +D 16 +R 14 +L 1 +R 7 +D 15 +U 2 +L 5 +U 16 +D 7 +L 11 +U 1 +R 2 +D 4 +L 13 +U 17 +R 5 +D 17 +R 14 +L 1 +D 11 +U 11 +R 8 +U 12 +D 12 +U 17 +R 15 +L 4 +D 7 +U 8 +R 4 +L 14 +U 11 +L 3 +R 1 +L 14 +U 3 +L 3 +D 15 +L 14 +D 7 +R 2 +L 6 +U 6 +R 12 +U 17 +D 1 +R 15 +D 1 +U 14 +D 6 +U 4 +R 4 +L 3 +U 14 +L 1 +R 4 +U 13 +D 18 +L 11 +U 4 +D 9 +R 10 +U 17 +R 8 +D 12 +R 9 +L 5 +D 6 +L 9 +R 9 +L 17 +D 9 +R 2 +L 4 +R 8 +D 8 +R 8 +D 13 +R 12 +L 13 +U 8 +D 8 +L 16 +D 15 +U 11 +L 8 +R 7 +D 2 +R 6 +U 19 +D 4 +U 7 +L 17 +R 9 +U 18 +D 4 +R 19 +L 14 +U 8 +D 19 +L 12 +R 14 +U 13 +D 3 +L 8 +D 4 +R 9 +U 18 +D 1 +U 2 +L 16 +U 2 +D 12 +U 5 +L 4 +D 6 +U 14 +R 1 +L 7 +D 7 +L 19 +D 5 +U 16 +D 15 +R 14 +U 19 +D 19 +L 6 +R 3 +L 14 +R 16 +L 1 +U 4 +R 19 +U 2 +L 3 +D 19 +L 17 +U 13 +D 5 +L 10 +U 18 +R 13 +D 6 +L 17 +D 9 +R 10 +D 8 +R 19 +L 6 +D 7 +R 18 +U 8 +L 6 +U 18 +L 18 +D 16 +R 8 +L 10 +R 6 +D 1 +L 6 +U 8 +L 19 +D 18 +U 3 +D 17 +U 9 +R 13 +D 18 +R 2 +L 10 +D 17 +L 17 +U 8 +L 13 +D 5 +L 1 +U 10 +L 3 +R 3 +D 12 +U 11 +L 15 +D 15 diff --git a/input/09-test b/input/09-test new file mode 100644 index 0000000..cbea2b3 --- /dev/null +++ b/input/09-test @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 \ No newline at end of file diff --git a/src/bin/09.rs b/src/bin/09.rs new file mode 100644 index 0000000..39581b2 --- /dev/null +++ b/src/bin/09.rs @@ -0,0 +1,174 @@ +use std::{ + collections::HashSet, + fmt::Display, + iter, + ops::{Add, Sub}, + str::FromStr, +}; + +use aoc2022::*; + +const INPUT: &str = include_str!("../../input/09"); + +fn main() { + let mut rope = Rope::new(2); + input().for_each(|a| rope.apply(a)); + solved_level_1(rope.visited.len()); + + let mut rope = Rope::new(10); + input().for_each(|a| rope.apply(a)); + solved_level_2(rope.visited.len()); +} + +#[derive(Debug)] +struct Rope { + nodes: Vec, + visited: HashSet, +} + +impl Rope { + fn new(nodes: usize) -> Self { + Self { + nodes: iter::repeat(Position::default()).take(nodes).collect(), + visited: HashSet::from([Position::default()]), + } + } + + fn apply(&mut self, action: Action) { + self.nodes[0] = self.nodes[0] + action.direction(); + + for i in 1..self.nodes.len() { + let (head, tail) = self.nodes.split_at_mut(i); + let head = head.last_mut().unwrap(); + let tail = tail.first_mut().unwrap(); + let diff = *head - *tail; + + let pull = if (diff.0 == 0) ^ (diff.1 == 0) { + // Horizontal/vertical + let pull_x = if diff.0.abs() > 1 { diff.0.signum() } else { 0 }; + let pull_y = if diff.1.abs() > 1 { diff.1.signum() } else { 0 }; + Position(pull_x, pull_y) + } else if diff.0.abs() > 1 || diff.1.abs() > 1 { + // Diagonal + Position(diff.0.signum(), diff.1.signum()) + } else { + Position::default() + }; + + *tail = *tail + pull; + } + + self.visited.insert(*self.nodes.last().unwrap()); + } +} + +impl Display for Rope { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + // Find bounds + let (min, max) = self.nodes.iter().chain(self.visited.iter()).fold( + (Position::default(), Position::default()), + |(min, max), p| { + ( + Position(min.0.min(p.0), min.1.min(p.1)), + Position(max.0.max(p.0), max.1.max(p.1)), + ) + }, + ); + + // Print field + for y in min.1..=max.1 { + for x in min.0..=max.0 { + let pos = Position(x, y); + + let mut c = '.'; + if self.visited.contains(&pos) { + c = '#'; + } + if pos.is_zero() { + c = 's'; + } + if let Some(node_idx) = self.nodes.iter().position(|&p| p == pos) { + c = "H123456789".chars().nth(node_idx).unwrap(); + } + + write!(f, "{c}")?; + } + writeln!(f)?; + } + + Ok(()) + } +} + +#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq)] +struct Position(i64, i64); + +impl Position { + fn is_zero(self) -> bool { + self.0 == 0 && self.1 == 0 + } +} + +impl Add for Position { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0, self.1 + rhs.1) + } +} + +impl Sub for Position { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0 - rhs.0, self.1 - rhs.1) + } +} + +impl From<(i64, i64)> for Position { + fn from((x, y): (i64, i64)) -> Self { + Self(x, y) + } +} + +#[derive(Debug, Clone, Copy)] +enum Action { + Up, + Down, + Left, + Right, +} + +impl FromStr for Action { + type Err = (); + + fn from_str(s: &str) -> Result { + match s { + "R" => Ok(Self::Right), + "L" => Ok(Self::Left), + "U" => Ok(Self::Up), + "D" => Ok(Self::Down), + _ => Err(()), + } + } +} + +impl Action { + fn direction(self) -> Position { + match self { + Action::Up => (0, -1).into(), + Action::Down => (0, 1).into(), + Action::Left => (-1, 0).into(), + Action::Right => (1, 0).into(), + } + } +} + +fn input() -> impl Iterator { + INPUT.lines().flat_map(|line| { + let (action, count) = line.split_once(' ').unwrap(); + let action: Action = action.parse().unwrap(); + let count: usize = count.parse().unwrap(); + iter::repeat(action).take(count) + }) +}