diff --git a/input/9.txt b/input/9.txt new file mode 100644 index 0000000..475cb5b --- /dev/null +++ b/input/9.txt @@ -0,0 +1,2000 @@ +R 2 +D 2 +U 1 +D 2 +U 2 +R 2 +U 2 +R 2 +L 2 +D 2 +R 1 +D 2 +R 1 +L 1 +R 2 +U 1 +R 1 +L 1 +U 1 +L 2 +R 2 +L 2 +R 2 +L 2 +R 2 +D 2 +U 2 +L 1 +D 1 +R 2 +L 1 +R 2 +D 1 +R 1 +D 2 +R 2 +D 1 +R 1 +D 1 +L 2 +R 1 +U 2 +D 1 +R 1 +L 2 +D 2 +U 2 +L 2 +U 2 +L 2 +R 1 +D 1 +L 1 +R 2 +L 2 +R 1 +L 2 +D 2 +L 1 +U 2 +D 1 +L 1 +D 2 +U 1 +L 1 +R 2 +D 2 +L 2 +R 2 +U 2 +L 2 +R 2 +L 2 +R 2 +L 2 +R 1 +L 2 +U 1 +D 1 +R 2 +L 1 +R 1 +U 2 +R 1 +U 1 +D 1 +U 1 +L 1 +R 2 +U 1 +L 1 +R 2 +L 1 +R 2 +U 1 +L 1 +D 1 +U 2 +R 2 +L 1 +D 2 +R 2 +D 2 +R 1 +L 2 +D 1 +U 2 +D 1 +L 2 +U 1 +R 1 +L 1 +U 2 +R 3 +U 1 +R 1 +U 3 +R 1 +D 2 +R 2 +U 3 +R 1 +U 2 +L 2 +D 2 +U 3 +L 3 +D 2 +U 1 +L 3 +D 2 +R 2 +U 1 +L 1 +D 3 +L 2 +U 2 +L 3 +U 1 +R 1 +U 3 +R 3 +U 1 +D 1 +U 2 +L 2 +D 1 +U 2 +R 2 +U 3 +R 2 +L 2 +R 1 +D 1 +U 3 +R 1 +U 3 +R 3 +U 3 +L 1 +D 2 +R 3 +L 2 +R 2 +D 1 +L 2 +D 1 +R 1 +D 2 +U 3 +D 2 +L 2 +D 2 +L 1 +D 2 +U 3 +D 3 +R 3 +L 3 +D 2 +U 2 +D 1 +R 3 +D 2 +L 3 +D 3 +L 1 +D 1 +U 3 +L 3 +R 3 +U 3 +R 2 +L 2 +D 2 +R 3 +U 1 +D 3 +R 2 +U 2 +R 1 +U 3 +L 1 +U 2 +D 2 +U 3 +L 1 +U 3 +R 1 +U 2 +R 2 +L 3 +U 2 +D 3 +L 2 +R 3 +D 2 +U 3 +D 1 +U 2 +L 3 +U 1 +R 4 +D 1 +R 4 +D 2 +R 3 +L 3 +U 4 +D 1 +L 4 +U 2 +D 1 +U 1 +L 3 +D 2 +U 4 +D 2 +U 3 +R 2 +L 4 +U 1 +D 3 +U 2 +L 3 +D 1 +R 2 +D 1 +R 1 +D 3 +U 4 +D 3 +L 3 +R 1 +U 1 +D 2 +L 2 +R 1 +D 2 +L 3 +R 2 +D 3 +R 3 +U 1 +D 2 +R 4 +D 3 +L 3 +D 1 +R 2 +D 1 +L 1 +D 1 +L 2 +D 1 +U 1 +R 1 +D 3 +L 1 +U 1 +L 2 +R 2 +U 1 +D 4 +U 1 +L 2 +R 3 +D 1 +U 4 +R 4 +L 2 +D 2 +U 4 +R 2 +U 3 +R 4 +U 1 +D 1 +U 2 +D 2 +U 3 +L 3 +U 4 +R 3 +D 2 +U 2 +L 1 +R 2 +U 4 +D 4 +U 1 +D 2 +L 4 +U 4 +R 4 +U 3 +R 3 +L 1 +R 1 +U 3 +L 2 +U 3 +L 2 +R 3 +D 2 +R 1 +L 1 +U 3 +D 1 +U 3 +L 1 +D 1 +R 1 +L 4 +R 1 +L 1 +R 5 +D 5 +R 5 +D 2 +R 3 +U 2 +D 5 +L 4 +U 2 +L 2 +U 1 +D 3 +L 1 +D 2 +L 2 +D 3 +L 1 +U 2 +L 1 +R 4 +U 5 +L 2 +U 5 +R 4 +L 3 +R 4 +U 5 +L 3 +D 2 +R 2 +L 4 +D 2 +L 1 +U 2 +L 1 +R 5 +D 5 +U 3 +R 4 +U 4 +L 3 +U 3 +D 1 +R 2 +L 5 +D 2 +R 4 +L 2 +R 1 +D 4 +R 2 +L 2 +D 3 +L 4 +D 1 +L 1 +D 1 +U 5 +R 5 +U 5 +L 1 +U 5 +D 5 +R 5 +L 2 +U 5 +L 2 +D 1 +U 4 +R 1 +U 2 +R 2 +U 2 +R 2 +L 4 +R 3 +U 3 +R 5 +L 5 +R 4 +L 4 +U 4 +D 2 +U 3 +L 1 +R 2 +U 3 +D 1 +L 3 +R 4 +D 5 +L 3 +R 2 +U 2 +L 1 +R 1 +D 2 +L 5 +U 2 +L 3 +U 2 +D 5 +R 2 +L 1 +R 3 +U 1 +R 5 +L 5 +U 6 +L 6 +R 5 +L 2 +R 2 +D 4 +U 3 +L 5 +R 4 +D 6 +R 2 +L 2 +U 1 +D 6 +R 2 +D 4 +U 3 +D 4 +L 5 +U 1 +D 6 +R 6 +U 2 +R 3 +L 6 +D 3 +U 2 +L 3 +D 6 +R 5 +D 4 +L 1 +U 3 +L 5 +U 3 +R 2 +D 2 +R 3 +U 3 +D 5 +L 3 +R 6 +U 2 +R 6 +L 3 +U 1 +D 3 +U 1 +R 3 +L 1 +D 3 +R 2 +L 3 +U 5 +R 6 +U 3 +D 2 +U 5 +R 6 +D 5 +L 6 +R 5 +D 2 +R 3 +U 6 +L 6 +D 3 +R 6 +L 4 +R 1 +U 4 +D 5 +L 4 +U 2 +D 1 +R 4 +U 3 +L 1 +D 6 +L 6 +R 1 +D 2 +R 2 +L 2 +U 4 +D 2 +L 2 +U 5 +R 2 +L 4 +U 2 +L 5 +R 1 +L 2 +D 4 +R 1 +L 2 +U 6 +R 1 +U 6 +R 4 +D 3 +R 1 +L 1 +R 1 +L 4 +U 2 +L 6 +R 6 +U 4 +L 2 +U 2 +L 7 +R 4 +L 6 +R 4 +L 7 +U 4 +D 3 +L 3 +R 7 +L 2 +R 6 +L 2 +R 6 +D 6 +U 3 +D 7 +R 3 +U 6 +R 3 +D 6 +U 4 +D 3 +L 5 +U 5 +L 3 +R 3 +D 7 +L 3 +U 3 +R 7 +L 1 +U 2 +L 6 +R 7 +D 3 +L 1 +D 7 +R 4 +U 5 +L 3 +R 3 +U 6 +R 6 +U 1 +D 5 +U 4 +L 1 +U 6 +L 2 +D 1 +R 2 +D 3 +R 1 +U 3 +D 6 +U 7 +D 6 +U 3 +R 7 +U 2 +R 2 +U 1 +R 4 +L 6 +U 4 +D 5 +R 1 +L 1 +D 7 +L 4 +R 2 +U 6 +R 4 +D 1 +R 5 +L 5 +R 3 +D 1 +L 4 +R 5 +L 4 +U 1 +D 6 +L 1 +D 3 +L 4 +R 2 +U 5 +L 6 +R 4 +U 6 +L 4 +U 5 +D 1 +L 4 +D 3 +R 1 +U 3 +R 2 +L 2 +D 6 +R 1 +L 5 +D 6 +U 3 +D 2 +L 6 +D 1 +U 7 +D 3 +U 2 +D 8 +R 2 +D 3 +L 4 +R 3 +U 7 +R 8 +D 3 +R 2 +D 8 +L 4 +R 4 +L 7 +R 1 +U 8 +R 7 +U 2 +D 5 +L 6 +D 8 +U 3 +L 5 +R 4 +D 1 +R 4 +L 6 +U 1 +R 5 +L 8 +D 6 +L 3 +D 6 +L 4 +U 2 +R 3 +D 4 +R 6 +D 6 +U 6 +D 5 +R 5 +L 5 +U 6 +D 5 +L 6 +R 8 +D 6 +R 6 +U 5 +D 6 +U 3 +D 7 +L 8 +R 2 +D 8 +L 5 +R 7 +L 5 +U 5 +L 2 +D 3 +R 3 +D 2 +R 2 +D 8 +R 8 +D 2 +L 2 +U 1 +D 4 +U 6 +R 2 +L 2 +R 5 +L 3 +R 2 +D 6 +R 2 +U 5 +L 7 +D 7 +L 7 +R 1 +D 4 +L 3 +D 1 +R 3 +L 8 +D 8 +R 4 +U 7 +R 2 +L 6 +D 5 +U 4 +D 3 +L 2 +U 5 +D 5 +U 1 +D 7 +L 7 +U 7 +D 4 +U 3 +L 7 +U 6 +L 6 +R 5 +U 5 +D 2 +L 3 +U 6 +L 6 +U 2 +R 3 +U 5 +D 1 +U 8 +D 1 +L 6 +D 5 +L 8 +R 6 +L 9 +U 3 +D 2 +R 9 +U 1 +L 3 +R 8 +U 6 +R 8 +L 6 +R 2 +L 3 +R 7 +D 6 +R 3 +U 2 +R 1 +U 3 +L 4 +R 6 +L 9 +D 4 +L 7 +U 2 +D 4 +L 8 +U 7 +R 7 +U 5 +D 4 +U 1 +L 8 +R 4 +D 5 +R 3 +D 5 +U 9 +D 6 +R 3 +D 6 +L 7 +U 7 +L 1 +R 3 +U 2 +L 4 +R 7 +L 9 +D 3 +L 6 +D 4 +R 6 +D 2 +L 6 +D 3 +L 3 +R 2 +L 7 +D 4 +R 9 +D 7 +U 1 +L 3 +R 9 +L 7 +R 2 +L 2 +D 5 +L 9 +D 6 +R 5 +D 8 +U 7 +D 5 +R 1 +D 4 +R 5 +D 3 +R 4 +D 5 +U 7 +D 5 +U 3 +D 3 +L 8 +U 1 +R 5 +U 3 +L 7 +D 5 +R 4 +D 6 +L 5 +D 7 +R 5 +D 7 +U 7 +R 8 +U 6 +D 1 +U 4 +R 5 +U 4 +D 5 +U 2 +D 5 +L 4 +D 1 +R 7 +L 10 +D 4 +R 10 +U 8 +D 5 +L 4 +R 3 +D 10 +U 1 +R 8 +L 4 +R 7 +L 5 +U 8 +L 3 +U 6 +R 5 +D 4 +L 7 +D 9 +R 10 +U 9 +L 7 +R 1 +D 9 +R 3 +U 1 +L 7 +D 3 +U 7 +L 4 +D 2 +R 5 +L 1 +U 3 +L 1 +D 1 +R 9 +U 8 +L 4 +D 7 +R 5 +U 9 +L 10 +U 9 +R 4 +D 6 +U 9 +R 8 +D 3 +R 8 +D 4 +U 2 +R 7 +L 9 +D 3 +U 8 +L 8 +R 1 +L 9 +D 9 +U 9 +L 9 +R 8 +L 5 +D 6 +L 5 +U 10 +L 1 +U 2 +R 7 +D 7 +U 5 +L 1 +D 5 +U 8 +D 10 +U 10 +R 2 +L 4 +R 5 +U 9 +L 4 +U 10 +D 5 +U 7 +D 1 +U 1 +R 7 +U 2 +L 3 +U 3 +L 9 +U 5 +L 10 +U 7 +L 1 +D 1 +L 2 +U 7 +L 4 +U 6 +D 9 +U 6 +R 4 +L 6 +R 4 +L 8 +R 4 +D 4 +L 11 +U 7 +R 6 +D 2 +L 1 +D 3 +L 2 +R 8 +D 2 +L 7 +U 9 +L 9 +D 1 +U 9 +D 2 +R 1 +L 6 +R 10 +L 2 +U 2 +L 9 +R 8 +L 3 +R 6 +L 9 +U 1 +R 3 +D 7 +U 10 +D 1 +L 1 +D 5 +L 1 +U 2 +L 6 +D 11 +R 11 +L 3 +D 6 +R 6 +D 8 +L 6 +R 5 +U 9 +D 7 +R 2 +U 6 +R 4 +U 11 +D 2 +R 4 +L 11 +D 1 +R 6 +D 8 +L 11 +U 7 +D 6 +R 6 +L 4 +R 5 +L 4 +R 3 +D 2 +R 1 +U 6 +D 9 +R 11 +U 4 +L 10 +R 5 +L 2 +U 7 +R 4 +L 2 +R 9 +D 1 +R 7 +L 11 +R 3 +L 4 +D 7 +L 10 +D 3 +U 11 +L 6 +U 9 +R 8 +U 3 +D 10 +U 8 +D 5 +R 1 +L 5 +R 11 +L 11 +R 9 +U 7 +R 1 +L 9 +D 3 +L 9 +U 1 +L 5 +D 10 +L 8 +R 4 +D 10 +R 4 +D 5 +L 12 +D 2 +U 1 +D 1 +U 9 +R 2 +D 2 +L 2 +D 6 +R 10 +U 3 +R 8 +L 3 +R 11 +L 5 +U 11 +D 5 +U 4 +L 3 +D 11 +R 5 +D 4 +L 11 +D 2 +U 9 +R 10 +L 10 +R 7 +D 11 +R 1 +U 9 +L 4 +U 3 +L 7 +U 1 +L 10 +R 7 +L 11 +U 11 +R 9 +L 4 +R 2 +L 10 +R 1 +U 3 +R 11 +D 5 +U 1 +R 12 +D 9 +R 4 +L 9 +D 8 +R 7 +L 2 +D 7 +R 8 +D 5 +U 7 +L 12 +R 6 +U 3 +R 11 +L 9 +R 8 +U 8 +R 4 +L 10 +U 4 +R 7 +D 10 +U 4 +L 11 +D 1 +U 6 +L 4 +D 2 +L 2 +D 3 +L 7 +U 6 +R 3 +U 9 +L 8 +R 8 +U 10 +R 8 +U 9 +R 4 +U 6 +R 12 +U 8 +L 10 +D 8 +R 10 +L 1 +U 5 +D 7 +L 10 +R 9 +U 2 +D 2 +R 12 +L 1 +D 12 +U 8 +R 4 +L 12 +R 7 +D 4 +U 10 +L 11 +U 8 +L 4 +R 1 +L 10 +U 12 +R 5 +U 2 +R 5 +L 11 +U 6 +D 8 +L 11 +D 1 +U 13 +D 8 +R 4 +D 6 +R 11 +L 10 +R 6 +L 4 +D 7 +U 10 +R 1 +L 8 +U 7 +D 1 +R 5 +D 5 +L 1 +U 7 +L 2 +U 4 +D 13 +R 10 +U 11 +D 13 +L 8 +R 2 +L 2 +D 2 +L 9 +R 10 +U 10 +D 3 +U 13 +R 4 +D 9 +L 9 +U 10 +D 7 +U 4 +R 13 +U 6 +D 1 +U 8 +L 1 +R 13 +U 3 +L 11 +U 12 +R 9 +L 8 +R 9 +L 2 +R 5 +L 7 +D 11 +L 8 +R 13 +D 10 +U 4 +R 5 +D 13 +L 2 +R 9 +L 5 +D 8 +L 13 +U 13 +D 1 +L 4 +U 5 +D 13 +R 2 +L 6 +D 12 +L 4 +U 5 +R 10 +U 2 +L 1 +R 8 +U 10 +L 9 +U 3 +D 3 +U 12 +D 6 +U 13 +L 5 +D 6 +U 14 +L 13 +U 7 +D 2 +U 8 +L 13 +R 10 +U 12 +R 5 +D 10 +U 5 +R 8 +D 2 +L 4 +R 9 +U 11 +R 10 +U 7 +L 14 +R 14 +U 14 +D 13 +U 9 +D 13 +R 5 +D 14 +U 11 +R 7 +U 11 +D 8 +R 11 +U 2 +R 4 +U 6 +L 11 +U 6 +R 8 +L 6 +D 1 +L 1 +D 5 +R 2 +U 11 +D 9 +R 14 +L 13 +U 4 +R 8 +L 4 +R 8 +D 14 +U 3 +L 3 +D 4 +L 4 +D 11 +U 4 +L 5 +U 3 +L 1 +R 2 +D 8 +L 11 +R 7 +U 13 +L 9 +R 14 +D 1 +R 8 +U 10 +R 9 +L 5 +U 7 +L 2 +R 14 +D 6 +U 12 +D 10 +U 1 +L 14 +D 2 +R 14 +U 6 +L 7 +U 3 +L 6 +U 7 +L 6 +D 7 +R 9 +U 11 +D 9 +U 7 +R 14 +U 8 +L 4 +U 8 +R 1 +L 12 +U 1 +R 2 +D 11 +R 8 +D 9 +U 9 +D 3 +U 5 +D 8 +U 8 +D 1 +L 12 +U 15 +L 2 +D 13 +R 4 +U 2 +R 7 +U 1 +R 4 +L 4 +D 1 +R 5 +D 9 +L 12 +D 11 +R 4 +D 14 +L 1 +U 13 +R 6 +D 13 +U 6 +D 10 +L 3 +U 8 +L 12 +D 1 +L 6 +D 5 +R 12 +D 11 +L 10 +U 14 +R 2 +D 4 +U 15 +D 10 +R 12 +D 7 +U 14 +L 14 +R 7 +U 15 +D 5 +U 13 +R 5 +U 6 +D 10 +L 12 +D 1 +U 2 +R 14 +D 9 +U 7 +L 5 +D 9 +R 14 +L 12 +R 2 +L 6 +R 13 +U 11 +L 10 +U 2 +R 2 +L 5 +R 8 +L 7 +U 7 +L 15 +R 5 +U 11 +L 10 +R 11 +L 5 +U 6 +R 4 +D 14 +U 13 +R 8 +L 10 +R 5 +U 8 +L 14 +D 6 +L 5 +D 7 +R 11 +L 15 +R 6 +L 15 +D 7 +R 9 +D 12 +L 3 +R 11 +L 10 +D 6 +L 6 +U 9 +L 10 +R 11 +D 7 +L 13 +D 11 +R 1 +U 4 +L 2 +R 4 +D 6 +U 8 +R 15 +L 10 +U 16 +R 10 +D 1 +U 14 +L 6 +D 1 +R 8 +U 6 +D 11 +L 9 +R 13 +U 12 +R 8 +D 7 +R 15 +U 1 +D 3 +U 13 +L 11 +D 6 +U 2 +D 1 +R 14 +U 10 +R 8 +L 9 +D 12 +U 16 +L 8 +U 10 +D 8 +U 2 +L 4 +D 4 +L 3 +R 3 +D 5 +U 2 +L 11 +D 16 +L 15 +R 15 +L 12 +D 8 +R 1 +D 11 +U 5 +R 10 +U 12 +D 9 +L 16 +U 10 +L 13 +R 10 +L 4 +R 6 +D 15 +U 12 +L 2 +R 15 +U 5 +R 1 +L 8 +D 6 +L 7 +D 13 +L 7 +D 10 +R 11 +L 14 +U 12 +D 7 +R 1 +L 1 +R 3 +U 1 +L 1 +R 14 +U 8 +D 7 +L 4 +D 15 +R 8 +U 1 +L 4 +R 12 +U 6 +L 13 +R 14 +U 3 +L 4 +D 9 +R 6 +U 5 +R 14 +L 6 +D 5 +U 6 +R 14 +L 10 +U 13 +L 16 +R 15 +L 12 +U 10 +L 2 +D 8 +L 7 +D 16 +L 17 +U 16 +R 13 +D 6 +U 8 +L 13 +D 9 +U 13 +D 3 +R 1 +U 12 +D 6 +L 8 +U 15 +R 6 +L 14 +U 15 +D 4 +U 9 +R 6 +D 8 +L 10 +D 3 +R 12 +L 10 +R 2 +D 2 +U 17 +D 16 +R 5 +L 13 +R 12 +L 4 +U 4 +L 12 +U 3 +L 15 +U 10 +L 5 +U 2 +D 13 +R 10 +U 7 +R 9 +D 7 +R 12 +U 14 +L 7 +R 10 +D 11 +U 8 +L 5 +R 4 +U 17 +L 12 +R 6 +L 17 +D 11 +R 17 +U 1 +D 2 +U 14 +D 17 +L 2 +D 14 +R 14 +L 1 +U 5 +D 8 +U 1 +R 12 +U 8 +D 3 +L 1 +D 8 +R 5 +U 9 +D 13 +U 15 +D 3 +R 15 +L 2 +R 2 +U 8 +R 1 +L 17 +U 16 +L 10 +D 2 +R 6 +L 11 +D 14 +R 3 +L 15 +U 16 +R 12 +U 1 +D 2 +U 2 +R 7 +L 4 +D 12 +U 12 +L 12 +U 15 +R 4 +U 8 +R 12 +L 5 +R 3 +L 5 +R 18 +L 4 +D 14 +R 4 +L 17 +R 18 +U 9 +D 18 +R 4 +U 13 +R 3 +D 6 +R 15 +L 1 +U 5 +L 3 +U 2 +R 15 +U 8 +L 7 +D 9 +L 15 +U 13 +L 17 +D 17 +R 15 +D 15 +L 14 +D 15 +R 16 +U 3 +D 6 +L 1 +R 14 +U 16 +L 7 +U 2 +L 14 +D 5 +L 6 +D 12 +R 18 +U 16 +D 7 +L 18 +D 10 +R 1 +L 8 +R 16 +L 5 +U 4 +R 18 +D 18 +R 5 +D 10 +L 18 +R 8 +L 2 +R 13 +L 16 +D 16 +U 17 +L 2 +R 5 +L 12 +D 10 +L 10 +D 6 +R 12 +L 17 +R 8 +L 14 +R 15 +L 18 +D 5 +R 1 +L 8 +U 13 +R 9 +U 14 +L 18 +U 4 +D 16 +L 7 +U 16 +L 14 +D 18 +R 1 +D 2 +R 11 +D 3 +U 12 +D 11 +U 2 +L 12 +U 7 +D 2 +R 8 +D 1 +U 9 +L 5 +D 14 +L 9 +D 5 +L 18 +D 16 +U 3 +R 13 +D 16 +R 18 +D 10 +L 4 +R 2 +L 5 +D 13 +L 15 +U 16 +R 9 +D 15 +R 5 +L 3 +U 5 +R 10 +U 3 +L 11 +R 14 +L 4 +D 7 +R 11 +D 12 +L 14 +R 13 +U 15 +R 14 +D 2 +R 16 +U 3 +D 3 +L 17 +D 11 +U 10 +L 2 +U 12 +D 3 +L 5 +D 9 +U 7 +D 14 +R 5 +L 14 +D 3 +R 11 +L 17 +U 7 +L 8 +U 2 +R 3 +D 18 +L 16 +U 12 +D 16 +R 6 +U 16 +D 10 +R 1 +L 7 +U 18 +R 2 +U 13 +R 15 +D 1 +R 15 +D 9 +U 9 +R 15 +D 6 +L 14 +D 15 +R 15 +D 10 +U 15 +L 17 +D 12 +R 6 +L 1 +R 15 +L 7 +D 11 +R 12 +D 9 +L 17 +D 18 +L 19 +D 2 +L 9 +D 1 +L 7 +R 5 +L 5 +R 1 +D 2 +L 1 +U 19 +L 5 +U 2 +D 15 +L 10 +R 7 +L 18 +D 13 +R 2 +D 18 +U 8 +D 15 +U 14 +R 5 +L 9 +U 9 +D 18 +L 9 +U 6 +R 7 +L 10 diff --git a/src/s9a.d b/src/s9a.d new file mode 100644 index 0000000..6b525ac --- /dev/null +++ b/src/s9a.d @@ -0,0 +1,49 @@ +module s9a; +import util; + +struct Vec2 { + int x; + int y; +} + +void main() { + string[] commands = readText("input/9.txt").strip.splitter("\n").array; + Vec2 head; + Vec2 tail; + Set!Vec2 visited = Set!Vec2([]); + foreach (command; commands) { + char direction; + int amount; + formattedRead(command, "%c %d", direction, amount); + Vec2 dirVec; + if (direction == 'U') { + dirVec = Vec2(0, 1); + } else if (direction == 'D') { + dirVec = Vec2(0, -1); + } else if (direction == 'R') { + dirVec = Vec2(1, 0); + } else { + dirVec = Vec2(-1, 0); + } + for (int i = 0; i < amount; i++) { + Vec2 prevHeadPos = head; + head.x += dirVec.x; + head.y += dirVec.y; + int distX = abs(head.x - tail.x); + int distY = abs(head.y - tail.y); + if (distX > 1 || distY > 1) { + if (distX == 0 || distY == 0) { + if (head.x > tail.x) tail.x++; + if (head.x < tail.x) tail.x--; + if (head.y > tail.y) tail.y++; + if (head.y < tail.y) tail.y--; + } else { + tail.x = prevHeadPos.x; + tail.y = prevHeadPos.y; + } + } + visited.add(tail); + } + } + writeln(visited.items.length); +} diff --git a/src/s9b.d b/src/s9b.d new file mode 100644 index 0000000..1fa9aa1 --- /dev/null +++ b/src/s9b.d @@ -0,0 +1,51 @@ +module s9b; +import util; + +struct Vec2 { + int x; + int y; +} + +void main() { + string[] commands = readText("input/9.txt").strip.splitter("\n").array; + Set!Vec2 visited = Set!Vec2([]); + Vec2[10] rope; + foreach (command; commands) { + char direction; + int amount; + formattedRead(command, "%c %d", direction, amount); + Vec2 dirVec; + if (direction == 'U') { + dirVec = Vec2(0, 1); + } else if (direction == 'D') { + dirVec = Vec2(0, -1); + } else if (direction == 'R') { + dirVec = Vec2(1, 0); + } else { + dirVec = Vec2(-1, 0); + } + for (int i = 0; i < amount; i++) { + rope[0].x += dirVec.x; + rope[0].y += dirVec.y; + for (int r = 0; r + 1 < rope.length; r++) { + Vec2* head = &rope[r]; + Vec2* tail = &rope[r + 1]; + int distX = head.x - tail.x; + int distY = head.y - tail.y; + if (abs(distX) > 1 || abs(distY) > 1) { + if (distX == 0 || distY == 0) { + if (head.x > tail.x) tail.x++; + if (head.x < tail.x) tail.x--; + if (head.y > tail.y) tail.y++; + if (head.y < tail.y) tail.y--; + } else { + tail.x += distX > 0 ? 1 : -1; + tail.y += distY > 0 ? 1 : -1; + } + } + if (r + 2 == rope.length) visited.add(*tail); + } + } + } + writeln(visited.items.length); +} diff --git a/src/util.d b/src/util.d index 83d5084..a9a070f 100644 --- a/src/util.d +++ b/src/util.d @@ -12,6 +12,7 @@ public import std.path; public import std.uni; public import std.array; public import std.format; +public import std.math; /** * Simple set implementation since the stdlib doesn't really have a good one. @@ -38,7 +39,7 @@ struct Set(T) { bool remove(T element) { size_t[] indexes; - foreach (e, i; this.items) { + foreach (i, e; this.items) { if (e == element) indexes ~= i; } this.items = this.items.remove(indexes);