diff --git a/9/input b/9/input new file mode 100644 index 0000000..b429d1b --- /dev/null +++ b/9/input @@ -0,0 +1,2000 @@ +R 1 +U 1 +D 1 +U 1 +R 2 +D 2 +R 2 +D 2 +R 1 +U 1 +L 1 +U 2 +D 2 +R 1 +D 1 +R 2 +U 2 +R 2 +L 2 +D 2 +L 2 +U 2 +D 2 +L 2 +R 2 +D 1 +U 2 +D 2 +U 1 +L 2 +D 2 +R 1 +U 2 +D 2 +L 1 +D 2 +L 2 +R 2 +U 2 +D 2 +U 1 +R 1 +U 1 +D 1 +R 2 +L 2 +D 1 +U 1 +R 1 +L 1 +U 1 +D 1 +L 1 +U 1 +D 1 +U 2 +D 2 +U 1 +D 1 +U 1 +L 1 +R 2 +L 1 +D 1 +U 1 +R 1 +L 2 +U 2 +L 2 +U 2 +D 1 +R 2 +D 2 +L 2 +R 1 +U 2 +R 1 +D 2 +L 1 +D 1 +L 1 +D 2 +R 1 +U 1 +L 1 +U 2 +D 2 +L 1 +U 2 +D 2 +R 1 +U 1 +R 1 +L 2 +D 1 +L 2 +U 2 +L 2 +D 2 +L 2 +D 2 +U 1 +L 1 +U 2 +R 1 +D 1 +R 1 +D 1 +R 1 +D 2 +U 1 +R 1 +U 1 +R 1 +D 1 +U 3 +L 2 +R 2 +L 3 +R 1 +L 1 +U 2 +L 1 +U 3 +D 3 +L 3 +D 2 +L 3 +U 1 +L 1 +R 2 +D 3 +L 1 +R 1 +U 2 +L 2 +D 3 +U 2 +D 3 +R 3 +U 1 +D 3 +L 3 +R 2 +U 3 +D 1 +U 1 +R 1 +L 2 +R 1 +L 2 +D 3 +L 1 +D 3 +R 2 +U 1 +D 1 +R 3 +D 1 +L 1 +U 2 +D 1 +L 3 +U 3 +R 1 +D 1 +U 3 +D 2 +L 3 +R 2 +L 1 +D 2 +U 1 +R 2 +L 1 +U 2 +R 2 +L 2 +U 2 +L 2 +U 2 +R 1 +U 2 +D 3 +U 1 +D 1 +L 2 +U 1 +L 2 +R 3 +L 2 +R 3 +L 1 +R 2 +L 2 +R 1 +D 3 +L 3 +D 2 +R 1 +D 1 +U 1 +D 2 +R 3 +U 3 +D 3 +R 3 +L 1 +U 1 +R 3 +U 2 +L 1 +R 1 +L 3 +D 3 +R 2 +U 1 +L 2 +D 2 +R 1 +U 3 +D 2 +R 1 +L 4 +D 3 +R 3 +L 1 +D 1 +R 3 +U 3 +L 2 +D 4 +U 3 +D 2 +L 4 +D 2 +R 1 +D 3 +R 3 +D 1 +U 4 +R 1 +U 4 +D 2 +U 4 +L 1 +R 1 +L 2 +R 1 +D 1 +L 4 +U 1 +R 4 +D 3 +R 1 +U 3 +R 3 +U 2 +L 3 +U 2 +L 2 +R 4 +U 2 +D 3 +R 4 +D 1 +U 4 +D 3 +R 2 +D 3 +R 1 +D 1 +U 1 +R 3 +L 1 +U 3 +L 1 +D 3 +L 3 +D 3 +R 3 +D 3 +U 1 +R 4 +D 2 +R 2 +U 1 +R 1 +D 1 +L 4 +D 2 +L 1 +U 4 +D 1 +L 2 +U 4 +D 3 +U 3 +L 2 +R 2 +D 1 +L 4 +D 2 +R 3 +D 4 +R 4 +U 1 +D 1 +L 2 +R 1 +D 4 +R 2 +L 1 +D 4 +L 3 +R 3 +U 4 +R 3 +D 3 +L 2 +R 1 +D 3 +L 2 +R 3 +D 1 +L 2 +U 3 +R 4 +D 4 +U 3 +R 2 +D 3 +R 3 +D 1 +R 4 +U 3 +R 5 +U 1 +D 2 +R 5 +U 1 +R 3 +L 1 +U 1 +L 1 +D 1 +R 5 +U 2 +D 3 +R 4 +L 5 +R 2 +D 1 +L 2 +U 2 +D 3 +R 5 +D 2 +R 5 +D 5 +U 5 +D 1 +L 5 +U 3 +D 2 +R 1 +D 5 +R 2 +D 2 +R 5 +U 3 +L 2 +U 1 +L 4 +R 5 +L 3 +R 2 +U 2 +D 3 +L 1 +U 3 +L 4 +R 5 +L 1 +U 4 +L 1 +D 5 +R 3 +U 5 +R 3 +L 2 +U 4 +D 2 +U 4 +L 1 +U 1 +L 1 +R 4 +D 4 +U 4 +R 5 +D 2 +U 2 +L 3 +U 4 +D 3 +L 2 +R 4 +U 1 +L 3 +R 3 +D 1 +L 2 +R 5 +U 2 +L 2 +R 2 +L 4 +D 4 +L 2 +U 4 +R 2 +L 3 +U 4 +L 5 +D 5 +L 5 +U 3 +L 5 +R 2 +D 4 +L 5 +U 3 +D 2 +L 2 +D 2 +U 2 +D 4 +R 5 +U 5 +L 3 +R 5 +D 3 +L 1 +D 1 +L 1 +D 5 +R 2 +L 1 +U 2 +L 3 +U 2 +R 2 +L 5 +R 3 +U 2 +R 1 +L 4 +D 4 +U 3 +R 2 +L 2 +D 3 +L 2 +R 4 +L 1 +U 6 +R 2 +D 5 +L 4 +U 3 +R 6 +D 6 +L 4 +D 3 +R 2 +D 2 +L 2 +R 2 +D 4 +L 6 +D 3 +L 5 +R 4 +L 5 +U 3 +L 6 +U 5 +L 3 +R 2 +U 3 +L 1 +D 1 +L 3 +U 4 +L 5 +D 3 +L 2 +U 5 +D 4 +L 3 +R 1 +U 3 +D 4 +U 3 +D 3 +U 6 +D 4 +R 3 +U 6 +R 1 +U 3 +R 3 +U 3 +R 5 +U 6 +L 1 +R 2 +D 5 +U 3 +D 4 +U 4 +D 4 +L 1 +U 4 +D 3 +L 1 +U 5 +R 3 +U 3 +R 1 +U 1 +L 3 +R 3 +U 4 +R 1 +L 3 +U 2 +L 2 +D 2 +L 4 +U 4 +L 3 +U 4 +R 2 +U 1 +D 2 +U 2 +D 5 +L 5 +R 1 +D 3 +L 4 +R 3 +D 6 +U 7 +D 5 +L 7 +D 5 +U 3 +D 1 +L 2 +R 2 +D 7 +U 7 +D 3 +L 2 +U 1 +L 6 +D 5 +R 4 +U 3 +R 5 +U 6 +L 6 +U 6 +L 1 +R 5 +U 7 +R 5 +U 5 +R 4 +U 5 +D 6 +R 4 +D 7 +L 7 +U 5 +R 2 +U 7 +R 3 +D 5 +R 5 +D 4 +U 1 +L 6 +R 4 +D 6 +L 6 +R 2 +U 7 +L 3 +D 5 +L 4 +R 3 +L 1 +U 3 +D 3 +R 5 +U 1 +L 6 +U 7 +R 7 +D 4 +L 4 +U 6 +R 7 +U 4 +R 1 +L 1 +R 4 +U 7 +D 1 +U 5 +D 3 +R 7 +L 1 +D 4 +U 6 +D 2 +L 3 +U 1 +D 6 +L 1 +D 5 +R 3 +U 3 +L 6 +D 5 +R 4 +U 5 +L 4 +R 4 +U 7 +R 1 +L 7 +U 2 +R 4 +L 1 +D 5 +U 4 +L 6 +D 2 +R 3 +L 2 +D 5 +R 5 +U 7 +R 4 +D 7 +U 6 +R 6 +L 6 +R 6 +U 1 +D 1 +R 3 +D 2 +U 3 +R 3 +D 8 +U 1 +R 5 +L 8 +D 8 +L 7 +D 3 +U 6 +R 6 +U 8 +D 3 +U 2 +R 2 +D 7 +U 8 +D 5 +L 2 +R 8 +U 3 +L 2 +R 5 +U 3 +R 6 +L 8 +U 8 +R 8 +L 2 +U 1 +D 1 +U 4 +L 1 +U 2 +L 4 +D 2 +U 4 +D 3 +L 8 +D 3 +R 3 +L 2 +D 7 +L 5 +R 5 +L 3 +R 4 +L 7 +D 6 +U 3 +L 3 +D 4 +R 4 +L 3 +D 5 +U 2 +R 4 +U 6 +L 7 +D 2 +R 6 +L 3 +D 8 +L 8 +R 2 +U 7 +D 7 +U 3 +R 7 +U 8 +L 5 +D 6 +R 6 +U 8 +R 1 +U 3 +R 5 +L 4 +D 7 +U 6 +R 8 +L 2 +R 6 +U 1 +L 4 +D 1 +L 2 +U 4 +R 2 +U 4 +R 5 +L 3 +R 1 +L 4 +R 7 +D 7 +R 1 +U 5 +L 6 +D 4 +R 4 +D 5 +U 8 +L 3 +D 8 +L 6 +U 5 +D 1 +R 7 +L 2 +D 1 +R 7 +L 5 +D 8 +U 6 +D 1 +L 8 +U 8 +L 1 +R 1 +U 2 +D 9 +L 5 +D 9 +L 4 +U 8 +D 3 +R 6 +L 1 +R 8 +D 7 +L 6 +U 7 +R 6 +U 2 +L 3 +D 6 +L 5 +U 3 +R 1 +U 6 +D 1 +U 2 +L 9 +R 2 +L 2 +R 9 +D 1 +R 2 +U 7 +D 7 +U 5 +R 4 +U 9 +L 5 +U 9 +D 5 +L 1 +R 3 +L 1 +U 1 +D 7 +L 8 +D 2 +L 7 +D 1 +L 6 +R 2 +D 1 +U 9 +D 4 +U 8 +L 8 +U 1 +L 8 +D 6 +U 1 +R 2 +U 3 +R 4 +D 4 +U 4 +L 9 +D 5 +L 2 +U 6 +D 8 +U 6 +R 1 +L 6 +D 5 +R 3 +L 4 +R 6 +L 5 +R 4 +L 6 +D 5 +R 8 +D 6 +L 1 +U 8 +R 8 +U 8 +R 3 +U 2 +D 9 +L 9 +U 3 +D 5 +L 2 +D 2 +R 3 +L 2 +D 8 +R 6 +D 9 +R 5 +L 9 +R 2 +L 9 +U 5 +R 9 +D 3 +R 1 +U 1 +L 6 +R 7 +D 7 +U 3 +R 2 +L 5 +D 2 +L 8 +U 8 +R 9 +U 5 +R 1 +U 9 +D 8 +R 10 +U 9 +D 5 +R 4 +D 8 +U 4 +L 7 +U 10 +L 8 +R 10 +L 9 +D 9 +L 4 +R 7 +U 4 +D 3 +U 10 +R 6 +D 9 +L 5 +R 3 +D 7 +R 9 +D 4 +L 9 +D 3 +R 7 +U 6 +L 6 +R 6 +L 7 +D 8 +L 7 +U 5 +D 8 +L 8 +U 9 +L 5 +D 9 +U 9 +R 3 +D 1 +U 9 +L 9 +U 6 +R 4 +U 6 +D 10 +U 4 +R 9 +D 9 +R 2 +D 10 +L 9 +U 8 +L 2 +D 7 +L 10 +R 2 +L 9 +R 9 +L 10 +U 6 +D 7 +R 1 +D 9 +R 5 +L 7 +D 4 +U 7 +L 3 +D 3 +R 4 +L 8 +U 1 +L 1 +D 10 +U 2 +D 9 +L 2 +D 8 +U 2 +D 3 +R 6 +U 3 +R 5 +U 4 +L 6 +R 10 +L 1 +D 2 +L 3 +U 11 +R 5 +U 11 +D 11 +U 10 +D 2 +L 10 +U 8 +R 4 +D 11 +U 11 +R 11 +U 5 +D 3 +R 7 +D 9 +U 9 +R 5 +U 8 +D 7 +U 9 +D 2 +U 11 +L 7 +D 1 +R 9 +D 2 +R 5 +U 4 +R 11 +D 1 +L 2 +R 1 +U 5 +D 4 +L 10 +R 11 +U 6 +L 3 +U 11 +R 1 +D 1 +L 2 +U 5 +R 6 +U 9 +R 11 +D 9 +L 11 +U 6 +R 5 +L 7 +D 6 +U 9 +D 5 +U 6 +R 10 +D 11 +R 4 +U 7 +L 5 +U 7 +L 2 +R 6 +L 10 +D 3 +R 6 +L 9 +D 8 +L 1 +R 1 +L 1 +R 3 +D 8 +L 10 +D 2 +U 1 +D 1 +L 3 +R 10 +L 3 +U 1 +D 2 +U 2 +D 3 +U 1 +R 8 +U 8 +D 10 +U 6 +L 5 +U 6 +D 4 +R 9 +D 9 +R 9 +D 11 +L 3 +D 7 +R 9 +L 7 +U 7 +D 7 +R 4 +L 3 +R 5 +U 3 +L 9 +D 10 +L 1 +R 9 +L 6 +D 5 +L 6 +D 4 +U 7 +L 8 +R 7 +L 5 +U 9 +R 1 +L 1 +D 12 +R 5 +U 1 +L 8 +D 11 +U 5 +D 5 +R 4 +D 10 +R 2 +U 6 +D 2 +L 12 +D 1 +R 10 +U 4 +D 8 +L 7 +D 9 +R 7 +D 1 +R 10 +D 5 +U 7 +D 12 +R 9 +U 2 +D 3 +U 5 +D 2 +U 6 +D 3 +U 7 +D 4 +R 11 +D 2 +L 3 +R 9 +L 2 +R 12 +L 3 +D 5 +U 7 +D 6 +R 9 +D 12 +R 11 +D 5 +U 5 +D 2 +R 1 +U 6 +R 6 +D 5 +L 9 +U 10 +D 4 +U 1 +R 3 +D 10 +U 1 +R 9 +D 8 +L 1 +D 12 +U 11 +D 12 +L 2 +R 9 +U 12 +D 6 +L 1 +R 4 +L 8 +D 8 +L 6 +R 10 +L 8 +D 4 +U 11 +L 1 +R 5 +L 6 +R 10 +D 12 +R 3 +L 9 +D 10 +U 6 +D 9 +R 7 +U 9 +R 10 +U 10 +L 10 +U 1 +L 3 +D 7 +L 12 +U 4 +R 3 +U 1 +L 8 +R 5 +U 4 +L 4 +D 5 +R 4 +D 11 +L 9 +D 5 +L 7 +U 6 +R 8 +U 7 +D 3 +U 1 +L 6 +U 8 +D 2 +R 7 +D 2 +U 1 +L 9 +U 8 +L 10 +U 4 +D 12 +L 12 +D 5 +R 3 +U 1 +D 1 +R 11 +L 10 +R 11 +L 6 +R 3 +L 13 +R 6 +L 4 +R 10 +D 9 +R 13 +U 8 +L 7 +R 7 +L 10 +R 9 +U 4 +L 1 +D 1 +L 12 +D 6 +L 3 +R 4 +U 6 +L 12 +D 2 +U 5 +R 11 +L 2 +U 8 +R 10 +D 2 +U 6 +L 4 +D 2 +U 9 +L 7 +D 5 +L 6 +U 9 +R 6 +L 9 +R 1 +U 3 +L 6 +R 6 +U 8 +D 1 +R 5 +U 12 +D 9 +U 10 +D 13 +L 10 +R 4 +L 13 +R 9 +L 9 +D 6 +U 8 +D 6 +U 8 +D 10 +R 3 +L 11 +R 8 +D 4 +R 2 +U 10 +D 9 +U 8 +R 5 +D 10 +L 11 +R 7 +D 9 +U 7 +L 6 +U 3 +L 5 +U 6 +D 1 +U 3 +R 8 +L 5 +U 3 +R 13 +L 8 +D 1 +U 8 +L 6 +D 11 +U 4 +D 1 +R 9 +D 11 +R 1 +D 2 +R 10 +U 2 +D 12 +U 6 +R 13 +U 6 +D 4 +R 11 +U 6 +R 9 +U 10 +D 3 +R 2 +L 13 +U 14 +D 14 +R 6 +D 9 +U 5 +D 2 +L 5 +R 10 +L 3 +R 8 +D 9 +U 10 +R 11 +U 8 +L 8 +R 12 +D 13 +U 7 +R 14 +D 9 +L 12 +R 13 +L 10 +D 11 +L 7 +U 6 +D 14 +L 14 +D 13 +U 11 +R 11 +U 9 +L 8 +D 2 +L 9 +R 12 +U 5 +D 9 +U 10 +R 1 +L 2 +D 8 +L 8 +R 4 +U 2 +L 13 +R 9 +L 12 +D 7 +L 14 +D 13 +R 12 +D 10 +L 5 +U 12 +R 6 +L 3 +U 14 +R 8 +U 10 +R 5 +U 3 +D 1 +R 6 +U 9 +R 4 +L 9 +U 7 +R 6 +U 8 +R 10 +U 9 +R 9 +U 12 +L 14 +R 2 +U 11 +L 12 +D 5 +R 15 +L 10 +U 8 +R 6 +U 8 +R 6 +D 2 +U 9 +L 15 +D 13 +L 14 +U 1 +D 9 +U 6 +R 8 +L 6 +D 3 +L 13 +R 7 +U 1 +L 8 +U 7 +D 8 +R 1 +D 6 +L 8 +R 14 +D 14 +U 9 +L 14 +R 15 +U 11 +L 14 +D 14 +L 1 +U 5 +L 3 +R 4 +L 13 +R 5 +D 14 +R 4 +U 7 +D 9 +R 4 +U 6 +D 11 +R 12 +D 13 +U 15 +D 10 +R 1 +D 1 +U 10 +L 14 +R 13 +U 6 +D 10 +U 15 +D 3 +U 8 +D 2 +U 15 +R 6 +U 12 +L 9 +R 2 +D 6 +R 15 +D 13 +R 2 +D 5 +R 8 +U 3 +R 10 +D 6 +L 7 +D 6 +R 11 +U 13 +D 1 +L 7 +U 7 +L 4 +U 10 +D 4 +R 10 +U 2 +L 2 +U 4 +R 7 +D 15 +R 15 +D 7 +R 14 +U 3 +D 8 +L 2 +U 11 +D 11 +U 9 +R 5 +L 3 +D 9 +R 12 +L 2 +R 10 +D 6 +R 6 +U 15 +R 10 +D 16 +R 5 +U 14 +R 16 +U 5 +L 10 +R 14 +L 15 +R 13 +L 15 +R 12 +L 9 +D 16 +U 13 +D 16 +R 2 +U 1 +D 15 +L 7 +D 5 +R 9 +U 8 +R 12 +U 3 +D 16 +R 11 +D 1 +U 3 +D 4 +U 10 +L 8 +R 4 +L 8 +R 8 +U 8 +L 9 +D 16 +U 7 +D 6 +R 1 +D 3 +L 15 +U 9 +D 9 +U 1 +L 9 +D 7 +U 14 +R 1 +D 11 +L 16 +U 13 +L 3 +R 12 +L 9 +R 9 +L 9 +U 5 +R 10 +D 14 +L 8 +R 7 +L 12 +R 13 +D 5 +U 10 +R 12 +U 11 +L 7 +R 9 +D 7 +L 11 +D 1 +R 8 +D 7 +U 6 +D 10 +R 13 +L 16 +U 10 +L 5 +R 12 +L 16 +U 6 +D 10 +U 3 +D 7 +U 7 +D 15 +L 2 +R 9 +U 8 +D 11 +L 15 +U 10 +D 10 +L 6 +D 14 +L 5 +U 3 +D 9 +U 2 +D 16 +U 6 +D 3 +R 15 +D 12 +R 9 +L 16 +R 4 +U 9 +L 8 +R 11 +L 14 +D 6 +U 11 +L 6 +R 7 +U 8 +R 7 +U 8 +D 7 +U 6 +L 15 +U 3 +D 6 +U 3 +R 6 +D 3 +L 10 +R 14 +L 17 +D 12 +L 15 +D 5 +R 6 +D 4 +R 6 +D 5 +U 8 +D 10 +R 13 +D 6 +U 3 +L 5 +U 3 +R 11 +D 11 +U 8 +L 5 +U 11 +L 7 +R 16 +L 11 +D 3 +L 16 +D 14 +R 1 +U 10 +L 7 +U 4 +D 11 +L 9 +R 3 +D 1 +L 7 +R 17 +D 17 +R 11 +U 4 +R 15 +L 10 +R 13 +U 17 +D 16 +L 16 +U 14 +D 11 +U 10 +D 12 +L 11 +R 5 +D 17 +U 1 +R 5 +L 14 +D 14 +R 5 +L 6 +R 11 +U 13 +R 10 +U 15 +L 2 +R 8 +D 3 +R 11 +L 8 +R 11 +U 5 +L 12 +U 2 +L 16 +D 5 +L 17 +R 10 +D 15 +L 16 +U 1 +D 10 +R 13 +L 6 +D 5 +R 13 +U 2 +D 16 +L 9 +U 11 +D 13 +U 16 +L 6 +R 15 +D 10 +U 17 +L 15 +D 7 +R 6 +D 15 +R 11 +L 14 +U 12 +D 18 +R 6 +U 16 +L 1 +U 10 +R 15 +U 3 +L 12 +D 9 +L 11 +D 18 +R 11 +L 12 +U 5 +L 13 +D 2 +R 11 +D 10 +L 15 +R 5 +D 17 +R 6 +L 16 +R 11 +D 1 +R 5 +U 13 +R 11 +D 13 +L 12 +U 10 +D 9 +R 1 +D 15 +R 1 +D 17 +R 10 +U 11 +R 14 +L 17 +R 2 +L 1 +D 12 +R 6 +U 18 +R 3 +L 8 +R 11 +L 15 +U 8 +L 7 +D 2 +L 9 +D 9 +L 11 +U 5 +D 8 +U 16 +R 13 +L 7 +D 6 +U 16 +L 9 +U 3 +R 4 +L 12 +U 18 +D 7 +L 10 +R 16 +D 1 +R 4 +U 4 +R 13 +D 6 +L 5 +R 3 +D 10 +U 4 +L 17 +D 9 +R 8 +L 1 +D 8 +L 16 +D 3 +U 3 +R 1 +U 9 +R 13 +D 3 +L 4 +R 6 +D 10 +U 16 +L 9 +U 5 +L 14 +U 8 +D 17 +L 18 +D 5 +U 10 +R 14 +L 8 +U 6 +R 5 +U 19 +L 9 +U 2 +D 7 +U 14 +R 17 +L 16 +D 15 +U 11 +D 4 +L 16 +U 14 +D 6 +L 3 +R 18 +L 17 +D 6 +L 10 +U 7 +D 11 +L 15 +U 12 +L 6 +D 6 +L 14 +U 17 +L 7 +D 2 +L 7 +U 12 +L 17 +R 16 +U 19 +L 12 +U 10 +L 6 +U 3 +D 16 +L 5 +D 15 +L 7 +R 6 +D 2 +R 19 +L 4 +D 18 +R 19 +D 9 +R 11 +L 17 +R 1 +U 15 +R 3 +D 18 +L 13 +U 7 +D 7 +R 15 +U 4 +D 16 +R 6 +U 4 +R 10 +U 10 +R 1 +D 19 +R 13 +U 7 +L 13 +D 15 +U 2 +L 18 +D 5 +U 5 +D 10 +L 8 +D 13 +U 8 +L 15 +D 12 +U 11 +D 17 +L 14 +R 4 +D 19 +L 6 +D 5 +L 13 +D 16 +U 1 +R 14 +U 15 +L 18 +D 7 +L 14 +D 11 +L 7 +D 18 +U 16 +L 1 +R 18 +L 1 +U 19 +R 3 +D 1 diff --git a/9/solution.mjs b/9/solution.mjs new file mode 100644 index 0000000..6960f55 --- /dev/null +++ b/9/solution.mjs @@ -0,0 +1,83 @@ +import { readFileSync } from 'node:fs'; + +const input = readFileSync('input', 'utf-8'); + +const moves = input + .split('\n') + .filter(line => line) + .map(line => { + const [direction, multiplier] = line.split(' ', 2); + return new Array(parseInt(multiplier)).fill(direction); + }) + .flat(); + + +function ropeSimulation(nTailKnots) { + const positions = [new Array(nTailKnots + 1).fill().map(_ => [0, 0])]; + + for (const move of moves) { + const lastKnots = positions[positions.length - 1]; + let [x, y] = lastKnots[0]; + + switch (move) { + case 'U': y += 1; break; + case 'D': y -= 1; break; + case 'L': x -= 1; break; + case 'R': x += 1; break; + default: throw new Error('Invalid move'); + } + + const knots = [[x, y]]; + + for (let n = 0; n < nTailKnots; n++) { + ([x, y] = knots[knots.length - 1]); + let [tx, ty] = lastKnots[n + 1]; + + if (y === ty && Math.abs(x - tx) === 2) { + // Horizontal tavel + tx += (x - tx) / Math.abs(x - tx); + } else if (x === tx && Math.abs(y - ty) === 2) { + // Vertical travel + ty += (y - ty) / Math.abs(y - ty); + } else if (Math.abs(x - tx) === 2 || Math.abs(y - ty) === 2) { + // Diagonal travel + tx += (x - tx) / Math.abs(x - tx); + ty += (y - ty) / Math.abs(y - ty); + } + + knots.push([tx, ty]); + } + + positions.push(knots); + } + + return positions; +} + +function countLastKnotPositions(positions) { + // Count unique positions of tail + return positions + .map(position => position[position.length - 1]) + .filter((tailPosition, i, arr) => + arr.findLastIndex(tp => + tp[0] === tailPosition[0] && + tp[1] === tailPosition[1] + ) === i + ) + .length; +} + +let positions = ropeSimulation(1); +const totalPositionsOneKnot = countLastKnotPositions(positions); +console.log( + `Total unique positions of tail with 1 knot: ${totalPositionsOneKnot}` +); + + +positions = ropeSimulation(9); +const totalPositionsTenKnots = countLastKnotPositions(positions); +console.log( + `Total unique positions of tail with 10 knots: ${totalPositionsTenKnots}` +); + +