diff --git a/data/day09/example01.txt b/data/day09/example01.txt new file mode 100644 index 0000000..cbea2b3 --- /dev/null +++ b/data/day09/example01.txt @@ -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/data/day09/example02.txt b/data/day09/example02.txt new file mode 100644 index 0000000..c1eba0a --- /dev/null +++ b/data/day09/example02.txt @@ -0,0 +1,8 @@ +R 5 +U 8 +L 8 +D 3 +R 17 +D 10 +L 25 +U 20 \ No newline at end of file diff --git a/data/day09/input.txt b/data/day09/input.txt new file mode 100644 index 0000000..b110a83 --- /dev/null +++ b/data/day09/input.txt @@ -0,0 +1,2000 @@ +D 2 +U 1 +D 2 +R 2 +L 1 +U 2 +L 1 +U 2 +D 1 +R 1 +D 2 +R 1 +D 1 +U 2 +D 2 +R 1 +U 1 +R 1 +U 2 +R 1 +L 1 +U 2 +R 1 +L 2 +U 1 +R 1 +U 1 +R 1 +L 2 +U 2 +D 1 +U 1 +D 2 +L 1 +U 1 +L 1 +R 1 +D 1 +R 1 +D 1 +U 2 +D 1 +R 1 +U 1 +L 1 +U 2 +L 1 +D 1 +U 1 +D 1 +L 1 +U 2 +L 1 +D 2 +R 2 +L 1 +R 2 +D 1 +L 2 +D 2 +U 2 +R 1 +L 1 +D 2 +U 2 +L 1 +D 2 +U 1 +L 2 +R 2 +U 1 +D 1 +U 1 +D 1 +R 1 +D 1 +U 2 +D 1 +R 1 +D 1 +L 1 +D 1 +L 2 +U 2 +D 1 +R 1 +D 1 +L 1 +D 2 +R 2 +U 2 +D 1 +U 2 +D 1 +U 1 +L 1 +R 2 +D 2 +R 1 +D 2 +L 2 +D 2 +R 1 +L 1 +U 1 +D 2 +R 2 +U 2 +R 2 +L 1 +R 1 +L 3 +U 3 +L 3 +D 2 +U 1 +D 1 +U 2 +D 1 +R 1 +D 1 +R 2 +D 3 +U 1 +L 2 +U 1 +D 2 +R 1 +D 1 +L 2 +R 2 +U 1 +L 2 +D 2 +L 1 +U 2 +D 3 +L 1 +U 1 +R 2 +U 3 +D 1 +L 3 +U 1 +L 3 +D 1 +R 2 +L 3 +U 2 +L 2 +U 1 +L 1 +R 3 +D 3 +L 1 +R 2 +D 3 +R 2 +L 3 +D 1 +U 2 +R 3 +U 2 +R 3 +L 2 +U 1 +L 1 +D 3 +U 1 +D 1 +U 2 +D 3 +U 3 +R 1 +U 2 +L 1 +D 1 +L 2 +U 1 +D 1 +L 1 +R 3 +U 3 +L 3 +D 3 +L 2 +D 1 +U 1 +L 1 +U 3 +L 1 +D 3 +R 1 +L 1 +R 2 +U 1 +R 2 +U 3 +R 1 +D 3 +L 3 +U 2 +L 3 +R 1 +D 2 +U 3 +R 3 +D 3 +U 1 +R 3 +D 2 +R 3 +U 1 +D 1 +U 3 +R 1 +L 1 +U 2 +L 1 +U 1 +L 1 +R 1 +D 1 +R 3 +D 4 +L 2 +R 4 +U 3 +D 1 +R 4 +L 4 +R 1 +D 2 +U 3 +R 2 +D 2 +U 3 +R 4 +L 2 +D 3 +L 4 +D 4 +U 4 +R 2 +U 1 +L 3 +D 4 +U 2 +R 1 +L 3 +D 3 +R 4 +D 2 +R 2 +D 4 +U 4 +L 4 +D 4 +R 2 +D 2 +U 3 +D 3 +R 3 +L 2 +D 2 +L 2 +U 3 +L 4 +U 2 +R 4 +D 4 +L 3 +R 1 +U 1 +R 2 +L 1 +D 1 +U 2 +D 3 +L 4 +U 3 +L 1 +U 3 +R 2 +U 3 +R 1 +U 1 +R 2 +U 2 +R 1 +D 4 +U 4 +L 2 +U 2 +D 4 +U 1 +R 4 +L 4 +D 4 +U 3 +D 4 +L 4 +U 3 +L 1 +R 4 +L 3 +D 3 +U 1 +R 4 +D 3 +U 4 +L 2 +U 4 +D 3 +R 2 +D 3 +U 4 +R 4 +L 4 +R 3 +U 1 +R 4 +D 1 +L 3 +U 3 +L 3 +D 1 +L 4 +R 2 +U 1 +L 3 +R 2 +U 4 +L 1 +U 5 +R 2 +L 2 +U 2 +L 2 +R 4 +D 4 +L 5 +D 1 +R 4 +U 5 +L 1 +D 4 +U 1 +L 4 +U 3 +L 1 +R 3 +D 1 +R 2 +L 5 +U 3 +L 5 +U 4 +D 3 +L 5 +D 2 +R 4 +U 2 +L 1 +R 4 +L 5 +R 3 +L 1 +U 2 +L 4 +D 1 +R 2 +L 5 +U 3 +D 2 +R 5 +L 4 +D 2 +R 3 +D 2 +R 4 +D 3 +U 1 +D 1 +U 4 +D 2 +L 2 +R 1 +U 5 +D 5 +U 3 +R 2 +U 3 +L 5 +R 1 +U 3 +L 4 +R 2 +U 3 +D 1 +U 2 +D 2 +L 5 +R 5 +D 3 +L 1 +R 3 +U 2 +D 5 +U 1 +D 5 +R 3 +U 1 +L 5 +R 1 +D 4 +L 4 +D 1 +U 2 +L 4 +R 5 +U 5 +L 4 +D 2 +R 5 +U 1 +L 5 +D 1 +L 1 +U 5 +R 1 +L 2 +R 5 +L 5 +R 2 +L 1 +D 2 +U 1 +L 3 +R 1 +U 5 +D 1 +U 1 +L 5 +U 6 +R 6 +U 5 +D 5 +R 3 +U 1 +R 1 +L 6 +R 6 +D 5 +R 6 +D 4 +L 3 +R 6 +U 5 +D 6 +L 2 +R 1 +D 5 +R 3 +D 2 +L 1 +R 5 +U 5 +D 4 +U 3 +R 5 +U 5 +R 3 +D 5 +R 3 +U 3 +R 2 +D 5 +L 6 +D 3 +U 3 +D 6 +R 5 +U 4 +L 4 +D 3 +U 6 +L 2 +R 1 +U 4 +D 1 +L 2 +U 1 +L 3 +D 4 +U 1 +L 5 +D 1 +R 2 +U 3 +L 1 +R 1 +U 1 +L 4 +U 6 +R 6 +D 3 +U 4 +R 2 +D 5 +L 6 +D 2 +R 4 +D 2 +U 5 +D 3 +U 2 +R 6 +L 5 +R 6 +U 1 +L 5 +U 1 +L 6 +U 1 +D 4 +R 3 +D 3 +L 1 +D 3 +R 2 +L 1 +R 3 +D 4 +L 6 +U 2 +D 5 +U 3 +R 6 +U 2 +R 6 +L 5 +R 1 +U 2 +R 3 +U 1 +R 6 +L 2 +U 6 +R 5 +U 1 +R 4 +L 1 +R 3 +U 3 +L 5 +D 7 +R 2 +D 4 +R 5 +L 3 +R 6 +U 7 +L 7 +U 6 +L 2 +D 2 +R 7 +D 7 +U 3 +R 1 +U 7 +L 2 +D 3 +L 5 +R 4 +U 7 +R 3 +L 7 +D 2 +R 7 +D 5 +L 7 +D 1 +U 7 +R 5 +U 4 +D 4 +U 4 +D 4 +U 1 +R 7 +L 3 +D 3 +U 2 +L 3 +U 1 +D 7 +L 6 +R 3 +U 6 +D 1 +R 6 +D 1 +R 1 +D 7 +U 4 +R 1 +L 4 +U 3 +L 7 +R 2 +D 2 +L 6 +U 2 +R 2 +U 7 +R 5 +L 6 +R 5 +D 1 +R 4 +U 2 +L 1 +D 4 +U 5 +R 4 +D 7 +U 7 +R 1 +U 3 +R 4 +L 1 +R 6 +L 4 +U 4 +L 2 +U 3 +D 2 +L 2 +U 2 +L 6 +R 5 +D 7 +L 2 +U 5 +L 6 +R 7 +L 7 +D 2 +U 6 +D 3 +R 1 +U 1 +D 4 +L 7 +D 7 +U 5 +L 6 +D 1 +L 4 +D 1 +U 1 +L 5 +U 1 +R 5 +D 8 +R 7 +L 5 +U 3 +D 2 +R 2 +L 6 +R 1 +L 4 +R 8 +U 8 +L 5 +R 7 +D 7 +L 2 +R 5 +L 6 +D 2 +L 7 +U 3 +R 2 +D 3 +U 3 +L 6 +U 5 +D 3 +L 6 +U 5 +D 5 +L 1 +U 4 +L 8 +D 3 +L 3 +R 2 +U 6 +D 8 +U 7 +L 6 +D 2 +U 4 +D 1 +U 3 +L 6 +R 2 +D 2 +U 4 +R 8 +D 3 +R 6 +D 6 +U 1 +L 4 +U 3 +L 6 +D 8 +U 7 +D 5 +L 3 +U 4 +D 2 +R 7 +L 8 +U 1 +R 3 +D 5 +U 5 +D 6 +R 3 +L 2 +R 8 +L 3 +U 5 +L 3 +U 5 +L 7 +U 7 +L 2 +U 1 +L 5 +D 7 +U 7 +D 8 +R 2 +D 7 +U 4 +R 4 +U 6 +L 2 +U 8 +D 1 +U 1 +D 4 +L 4 +U 1 +L 5 +R 8 +U 5 +D 4 +R 2 +D 6 +L 1 +D 8 +U 4 +D 5 +L 8 +U 3 +L 5 +D 1 +U 3 +R 1 +D 7 +R 9 +U 8 +R 7 +L 3 +D 8 +U 9 +D 1 +U 7 +L 6 +U 4 +R 8 +U 1 +D 6 +R 3 +L 5 +D 3 +U 1 +L 3 +U 2 +L 3 +U 2 +R 7 +D 2 +R 7 +D 8 +R 1 +D 4 +R 1 +D 6 +R 8 +U 8 +L 2 +U 8 +L 5 +D 1 +U 7 +R 4 +L 9 +U 2 +L 3 +U 4 +L 2 +D 3 +L 4 +U 9 +D 2 +R 2 +U 9 +R 1 +L 4 +D 5 +R 9 +U 3 +L 3 +U 8 +R 5 +U 7 +D 5 +U 9 +R 3 +D 9 +R 1 +D 7 +R 3 +D 6 +L 6 +D 5 +U 9 +D 8 +U 4 +L 5 +R 6 +D 7 +R 6 +L 8 +R 3 +U 3 +R 9 +U 8 +R 6 +L 9 +U 2 +R 9 +L 8 +U 1 +R 9 +L 5 +D 5 +U 9 +L 6 +D 7 +U 3 +D 3 +R 4 +D 1 +L 4 +D 5 +L 4 +U 2 +R 9 +U 7 +L 4 +D 7 +U 9 +R 4 +D 7 +R 7 +D 4 +L 1 +D 2 +L 1 +U 7 +R 8 +D 2 +U 9 +D 6 +L 7 +R 5 +L 3 +R 5 +D 8 +L 3 +R 8 +L 6 +U 6 +L 6 +U 5 +R 7 +L 9 +U 1 +R 3 +D 7 +U 10 +D 1 +U 8 +D 8 +L 5 +U 6 +D 5 +U 9 +R 8 +D 8 +R 9 +D 2 +L 1 +D 8 +R 2 +D 6 +L 10 +R 1 +U 3 +L 8 +U 7 +R 7 +U 7 +D 6 +L 7 +U 3 +L 4 +R 9 +D 8 +U 4 +D 3 +L 8 +R 7 +U 1 +L 9 +D 10 +U 2 +L 5 +U 3 +L 4 +R 10 +L 2 +D 6 +L 6 +D 2 +U 5 +D 3 +R 9 +D 2 +U 1 +D 5 +U 9 +D 7 +R 2 +U 5 +R 4 +D 9 +U 6 +L 10 +D 3 +U 1 +L 1 +D 9 +U 2 +L 8 +U 3 +R 5 +U 7 +D 8 +R 5 +L 8 +U 9 +L 1 +D 5 +U 8 +R 4 +D 7 +U 4 +R 10 +U 9 +R 9 +U 7 +R 3 +U 10 +R 5 +U 7 +R 6 +U 10 +R 9 +U 8 +D 8 +L 1 +U 2 +D 1 +R 9 +U 10 +D 6 +L 3 +D 4 +R 11 +D 11 +R 7 +U 3 +L 3 +U 11 +D 11 +U 5 +R 9 +U 3 +R 4 +D 1 +U 11 +R 2 +L 7 +R 8 +L 2 +D 4 +U 4 +L 9 +R 10 +L 3 +R 7 +D 7 +L 9 +U 6 +L 5 +D 8 +U 4 +D 4 +L 4 +D 2 +U 8 +R 4 +D 4 +U 10 +D 5 +R 5 +D 5 +U 8 +D 2 +L 6 +U 8 +L 2 +D 8 +R 5 +D 5 +U 1 +D 1 +L 9 +R 7 +U 2 +L 7 +R 1 +L 1 +U 2 +R 10 +D 2 +U 8 +L 1 +R 6 +L 3 +R 4 +D 6 +L 2 +D 11 +R 8 +D 11 +L 3 +R 4 +L 10 +U 7 +L 9 +U 4 +L 8 +D 6 +U 8 +R 7 +L 5 +R 8 +L 4 +U 6 +R 5 +U 7 +D 3 +L 8 +U 2 +R 7 +D 3 +R 4 +D 11 +L 8 +U 6 +D 1 +R 11 +L 7 +D 4 +R 4 +L 4 +U 5 +L 8 +R 7 +U 8 +D 12 +R 9 +D 8 +R 7 +L 9 +R 2 +D 1 +L 7 +D 3 +L 1 +R 5 +U 1 +D 12 +R 4 +U 1 +D 4 +L 9 +U 10 +R 5 +D 11 +R 2 +L 3 +U 8 +R 5 +D 8 +U 12 +D 6 +R 2 +D 5 +R 12 +U 7 +L 2 +U 4 +D 5 +U 8 +R 12 +U 1 +L 11 +U 7 +D 10 +L 6 +D 6 +R 1 +L 6 +D 2 +U 5 +R 6 +D 8 +R 4 +L 7 +D 2 +L 7 +D 8 +U 10 +R 1 +U 6 +R 5 +L 4 +R 8 +D 9 +R 5 +U 11 +D 4 +U 11 +R 8 +L 8 +U 2 +R 11 +L 12 +U 7 +L 12 +U 10 +R 3 +D 11 +R 1 +L 8 +D 2 +L 5 +R 4 +U 3 +D 9 +R 8 +D 11 +L 12 +R 11 +L 4 +R 10 +D 6 +U 4 +R 6 +D 6 +U 9 +R 12 +U 5 +R 8 +L 10 +D 1 +U 7 +D 12 +L 3 +U 10 +D 2 +U 6 +D 12 +R 3 +U 2 +D 2 +U 3 +D 11 +R 2 +U 2 +D 9 +R 11 +D 4 +U 6 +R 11 +L 9 +R 10 +D 13 +L 2 +D 2 +L 4 +D 13 +R 7 +L 3 +U 8 +D 5 +R 7 +D 7 +U 13 +D 5 +U 5 +L 12 +D 9 +L 2 +D 6 +U 13 +R 2 +D 10 +L 9 +D 7 +R 2 +U 3 +D 2 +L 3 +R 9 +U 3 +L 12 +U 4 +R 1 +U 13 +R 4 +U 1 +D 10 +R 10 +D 10 +U 5 +L 7 +D 8 +R 1 +D 12 +L 13 +R 10 +D 6 +R 9 +U 4 +R 9 +U 1 +L 3 +R 3 +D 8 +U 6 +L 11 +R 8 +D 5 +U 2 +L 9 +R 7 +L 7 +D 8 +L 12 +R 12 +U 9 +D 9 +U 7 +D 10 +L 3 +R 3 +D 8 +L 11 +U 8 +D 7 +U 11 +L 4 +D 4 +R 3 +U 4 +R 6 +D 5 +U 5 +L 8 +U 4 +L 9 +U 6 +L 8 +D 3 +U 12 +D 5 +L 8 +D 11 +U 4 +R 12 +U 7 +L 5 +D 4 +R 4 +U 7 +R 9 +L 5 +U 2 +L 3 +D 2 +R 6 +U 2 +R 8 +D 10 +U 14 +L 3 +R 4 +U 10 +R 7 +L 11 +R 7 +U 4 +R 8 +L 14 +D 11 +U 12 +R 10 +L 8 +R 11 +L 4 +U 1 +L 2 +R 7 +U 13 +D 5 +U 2 +L 6 +D 7 +R 5 +U 4 +D 10 +U 5 +D 2 +R 9 +U 13 +L 10 +U 1 +R 10 +D 14 +L 5 +R 12 +L 7 +D 2 +L 2 +D 5 +R 4 +U 6 +D 7 +R 12 +U 9 +D 9 +R 6 +U 1 +D 14 +U 14 +D 14 +L 7 +R 10 +U 3 +D 2 +R 10 +L 14 +R 7 +D 5 +U 1 +L 8 +U 2 +D 3 +U 6 +L 11 +R 13 +L 10 +D 9 +U 5 +R 6 +U 2 +D 7 +U 5 +L 6 +R 8 +D 11 +R 14 +D 5 +R 10 +L 13 +R 1 +U 4 +L 9 +R 2 +D 1 +U 10 +D 6 +U 3 +R 13 +L 9 +R 2 +D 3 +R 14 +L 2 +R 14 +U 1 +R 7 +L 1 +U 6 +D 6 +R 10 +L 12 +D 10 +R 11 +D 13 +L 3 +R 2 +L 1 +R 10 +U 1 +L 7 +R 5 +D 6 +U 11 +L 8 +R 7 +D 10 +U 13 +R 12 +D 8 +L 7 +U 8 +R 14 +U 10 +L 6 +D 15 +R 8 +L 10 +U 13 +L 3 +U 13 +L 9 +R 4 +D 6 +R 12 +L 12 +R 4 +U 12 +D 6 +R 2 +L 11 +R 7 +D 1 +U 4 +R 14 +U 6 +D 1 +U 15 +D 14 +R 3 +D 14 +L 1 +R 9 +L 2 +D 11 +R 11 +D 10 +R 1 +L 9 +U 6 +R 8 +L 4 +R 9 +U 13 +D 15 +L 2 +D 2 +L 2 +D 6 +R 10 +U 10 +L 8 +D 11 +L 8 +R 10 +U 3 +R 7 +U 15 +R 11 +L 10 +U 2 +R 8 +L 8 +D 5 +R 11 +U 7 +L 13 +D 15 +U 4 +D 10 +R 11 +D 6 +L 2 +U 3 +R 2 +L 1 +D 14 +U 5 +L 14 +D 13 +R 12 +U 8 +R 1 +L 14 +U 6 +D 10 +R 3 +U 8 +L 2 +R 6 +D 10 +U 9 +L 2 +D 13 +L 13 +D 9 +L 10 +U 14 +R 11 +L 14 +U 10 +L 6 +D 14 +L 11 +R 4 +L 9 +U 3 +D 13 +L 5 +R 16 +U 3 +L 9 +D 6 +R 15 +U 6 +L 4 +R 10 +D 12 +R 4 +D 2 +U 11 +D 13 +R 6 +U 15 +R 14 +D 14 +U 8 +R 9 +L 5 +D 16 +U 9 +R 15 +D 13 +R 3 +L 2 +R 3 +U 14 +D 9 +U 2 +D 6 +U 9 +D 7 +L 13 +D 7 +L 5 +R 3 +U 2 +L 13 +R 9 +D 1 +L 16 +D 8 +R 12 +U 15 +R 4 +D 15 +L 12 +D 13 +R 4 +L 2 +U 5 +R 13 +L 15 +D 12 +L 3 +D 13 +L 5 +D 16 +L 11 +D 13 +U 1 +D 9 +L 10 +U 11 +D 12 +U 11 +D 14 +U 16 +D 14 +U 10 +R 7 +L 11 +R 14 +U 11 +R 5 +U 1 +D 16 +R 16 +L 9 +U 7 +D 7 +R 8 +D 7 +U 10 +L 7 +D 6 +U 4 +D 2 +L 3 +D 3 +L 2 +R 3 +L 9 +D 2 +R 12 +D 11 +U 11 +L 14 +U 4 +L 12 +R 13 +L 9 +D 11 +R 12 +L 15 +R 15 +L 15 +R 16 +U 17 +D 4 +L 9 +U 9 +D 17 +L 8 +U 15 +D 17 +U 9 +R 4 +U 6 +L 1 +D 7 +R 3 +D 11 +L 10 +R 1 +U 14 +D 13 +R 7 +L 8 +U 16 +L 16 +U 12 +D 3 +R 4 +D 8 +R 8 +D 1 +L 12 +R 16 +D 3 +R 7 +D 16 +U 11 +R 6 +D 13 +R 4 +L 3 +R 6 +U 1 +R 4 +D 4 +U 13 +L 7 +D 17 +R 4 +D 6 +L 1 +U 17 +L 16 +U 12 +L 11 +R 1 +L 11 +D 8 +U 15 +D 6 +L 5 +U 16 +R 6 +D 11 +L 17 +D 7 +L 1 +D 8 +L 16 +U 8 +R 4 +L 17 +D 2 +L 1 +U 16 +D 8 +L 17 +U 12 +D 4 +R 1 +D 12 +U 2 +L 11 +U 17 +L 3 +R 7 +L 10 +U 16 +R 8 +U 6 +L 3 +D 15 +L 11 +R 7 +U 14 +R 8 +L 9 +D 6 +L 3 +U 17 +R 1 +D 13 +U 15 +L 18 +U 11 +R 3 +U 16 +D 12 +R 1 +D 6 +L 17 +R 9 +L 6 +U 2 +D 2 +U 16 +D 12 +R 1 +U 17 +R 16 +D 12 +U 3 +D 11 +L 13 +U 11 +R 15 +U 13 +D 11 +U 8 +L 3 +D 1 +L 7 +R 9 +D 18 +R 17 +U 2 +L 16 +D 8 +L 14 +D 11 +R 4 +D 12 +U 5 +D 6 +U 2 +D 4 +L 1 +R 11 +D 3 +U 10 +L 1 +R 16 +U 10 +L 17 +D 5 +R 16 +U 18 +R 1 +D 16 +R 14 +D 11 +U 13 +D 13 +R 5 +L 9 +U 11 +R 18 +L 14 +U 14 +L 18 +R 15 +D 10 +U 10 +R 17 +U 12 +L 2 +D 11 +R 15 +U 3 +R 17 +L 1 +R 1 +U 1 +L 8 +U 15 +R 15 +L 12 +U 2 +R 1 +L 9 +R 3 +L 6 +R 18 +D 9 +R 12 +U 6 +L 17 +R 11 +D 8 +R 17 +D 12 +L 2 +R 9 +U 4 +D 17 +R 18 +D 12 +L 9 +R 16 +U 5 +R 1 +L 12 +R 9 +L 8 +U 8 +R 2 +U 9 +L 2 +D 18 +U 11 +L 17 +U 3 +L 11 +R 3 +L 5 +D 1 +R 4 +U 10 +D 18 +R 10 +D 10 +L 5 +R 7 +D 2 +R 2 +L 18 +U 4 +D 10 +U 16 +D 1 +L 2 +U 17 +D 5 +U 9 +R 13 +D 6 +R 14 +D 10 +L 15 +R 13 +L 6 +U 11 +R 6 +L 4 +R 19 +L 4 +D 13 +R 1 +L 9 +D 4 +R 12 +U 18 +D 3 +U 17 +R 19 +L 6 +R 6 +D 8 +R 12 +L 10 +R 3 +U 5 +L 2 +D 7 +L 9 +D 16 +L 16 +U 14 +L 12 +R 2 +L 17 +R 18 +D 12 +R 16 +D 19 +U 6 +D 19 +U 13 +R 4 +D 18 +L 14 +U 14 +D 12 +R 10 +L 13 +D 10 +U 10 +D 2 +U 18 +L 19 +R 15 +D 6 +L 1 +D 10 +R 7 +D 2 +R 19 +D 5 +U 19 +L 13 +U 17 +L 3 +R 19 +U 9 +L 7 +D 6 +R 12 +L 10 +R 9 +D 9 +U 13 +R 7 +L 1 +U 1 +D 17 \ No newline at end of file diff --git a/src/days/day09/mod.rs b/src/days/day09/mod.rs new file mode 100644 index 0000000..533acf4 --- /dev/null +++ b/src/days/day09/mod.rs @@ -0,0 +1,152 @@ +use super::template::{DayTrait, ResultType}; +use crate::common::{direction::Direction, pos::Pos}; +use std::{collections::HashSet, num::ParseIntError}; +use thiserror::Error; + +const DAY_NUMBER: usize = 9; + +pub struct Day; + +impl DayTrait for Day { + fn get_day_number(&self) -> usize { + DAY_NUMBER + } + + fn part1(&self, lines: &[String]) -> anyhow::Result { + let commands = parse_commands(lines)?; + let mut rope = Rope::create(2); + let result = rope.run(&commands); + Ok(ResultType::Integer(result)) + } + + fn part2(&self, lines: &[String]) -> anyhow::Result { + let commands = parse_commands(lines)?; + let mut rope = Rope::create(10); + let result = rope.run(&commands); + Ok(ResultType::Integer(result)) + } +} + +#[derive(Debug, Error)] +enum RopeError { + #[error("Not a legal command {0}")] + CommandUnknown(String), + + #[error["not a legal Direction {0}"]] + DirectionUnknown(String), + + #[error("Not a legal Integer")] + StepParseError(#[from] ParseIntError), +} + +fn parse_commands(lines: &[String]) -> Result, RopeError> { + lines.iter().map(parse_line).collect::>() +} + +fn parse_line(line: &String) -> Result<(Direction, usize), RopeError> { + match line.split_whitespace().collect::>()[..] { + [direction, steps] => { + let direction = match direction { + "U" => Direction::North, + "D" => Direction::South, + "R" => Direction::East, + "L" => Direction::West, + _ => { + return Err(RopeError::DirectionUnknown(direction.to_owned())); + } + }; + let steps = steps.parse()?; + Ok((direction, steps)) + } + _ => Err(RopeError::CommandUnknown(line.to_owned())), + } +} + +fn get_closer(first: Pos, second: Pos) -> Option> { + let diff = second - first; + if diff.x().abs() <= 1 && diff.y().abs() <= 1 { + None + } else { + Some(Pos::new(diff.x().signum(), diff.y().signum())) + } +} + +#[derive(Debug)] +struct Rope { + head: Pos, + knots: Vec>, +} + +impl Rope { + pub fn create(length: usize) -> Self { + assert!(length >= 2); + Rope { + head: Pos::new(0, 0), + knots: vec![Pos::new(0, 0); length - 1], + } + } + + /** + * Moves the head one step into the given direction + * returns true if the whole rope moved, otherwise false + */ + pub fn move_rope(&mut self, head_direction: Direction) -> bool { + self.head = self.head + head_direction; + let mut prev = self.head; + let mut knots_unmoved = self.knots.len(); + + for knot in self.knots.iter_mut() { + if let Some(diff) = get_closer(*knot, prev) { + *knot = *knot + diff; + prev = *knot; + knots_unmoved -= 1; + } else { + break; + } + } + knots_unmoved == 0 + } + + pub fn run(&mut self, commands: &[(Direction, usize)]) -> i64 { + let mut tail_visited = HashSet::new(); + tail_visited.insert(self.knots.last().copied().unwrap()); + + for (direction, steps) in commands { + for _ in 0..*steps { + if self.move_rope(*direction) { + tail_visited.insert(self.knots.last().copied().unwrap()); + } + } + } + tail_visited.len() as i64 + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::common::file::read_lines; + use anyhow::Result; + + #[test] + fn test_part1() -> Result<()> { + let day = Day {}; + let lines = read_lines(day.get_day_number(), "example01.txt")?; + let expected = ResultType::Integer(13); + let result = day.part1(&lines)?; + assert_eq!(result, expected); + + Ok(()) + } + + #[test] + fn test_part2() -> Result<()> { + let day = Day {}; + let lines = read_lines(day.get_day_number(), "example02.txt")?; + let expected = ResultType::Integer(36); + let result = day.part2(&lines)?; + assert_eq!(result, expected); + + Ok(()) + } +} diff --git a/src/days/mod.rs b/src/days/mod.rs index 703a165..4f4726e 100644 --- a/src/days/mod.rs +++ b/src/days/mod.rs @@ -6,6 +6,7 @@ mod day05; mod day06; mod day07; mod day08; +mod day09; mod template; pub use template::DayTrait; @@ -15,7 +16,7 @@ pub mod day_provider { use super::*; use thiserror::Error; - const MAX_DAY: usize = 8; + const MAX_DAY: usize = 9; pub fn get_day(day_num: usize) -> Result, ProviderError> { match day_num { @@ -27,6 +28,7 @@ pub mod day_provider { 6 => Ok(Box::new(day06::Day)), 7 => Ok(Box::new(day07::Day)), 8 => Ok(Box::new(day08::Day)), + 9 => Ok(Box::new(day09::Day)), _ => Err(ProviderError::InvalidNumber(day_num)), } }