diff --git a/README.md b/README.md index 8352107..45d9ea3 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ I use python 3.11 without any libraries beyond the standard. | Day | Time | Rank | Score | Time | Rank | Score | | --- | --------- | ----- | ----- | -------- | ----- | ----- | +| 9 | 00:54:18 | 7719 | 0 | 01:07:37 | 4901 | 0 | | 8 | 00:41:51 | 7831 | 0 | 00:59:27 | 6325 | 0 | | 7 | 00:34:59 | 2683 | 0 | 00:45:45 | 2943 | 0 | | 6 | 00:14:52 | 9153 | 0 | 00:17:06 | 8413 | 0 | diff --git a/advent/days/day09/__init__.py b/advent/days/day09/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/advent/days/day09/data/input.txt b/advent/days/day09/data/input.txt new file mode 100644 index 0000000..694003a --- /dev/null +++ b/advent/days/day09/data/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 diff --git a/advent/days/day09/data/test01.txt b/advent/days/day09/data/test01.txt new file mode 100644 index 0000000..9874df2 --- /dev/null +++ b/advent/days/day09/data/test01.txt @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/advent/days/day09/data/test02.txt b/advent/days/day09/data/test02.txt new file mode 100644 index 0000000..c1eba0a --- /dev/null +++ b/advent/days/day09/data/test02.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/advent/days/day09/solution.py b/advent/days/day09/solution.py new file mode 100644 index 0000000..9d3d195 --- /dev/null +++ b/advent/days/day09/solution.py @@ -0,0 +1,92 @@ +from __future__ import annotations +from dataclasses import dataclass + +from typing import Iterator + +day_num = 9 + + +def part1(lines: Iterator[str]) -> int: + lst = [Command.parse(line) for line in lines] + return Command.walk(lst, 2) + + +def part2(lines: Iterator[str]) -> int: + lst = [Command.parse(line) for line in lines] + return Command.walk(lst, 10) + + +@dataclass(frozen=True, slots=True) +class Point: + x: int + y: int + + @staticmethod + def parse_direction(char: str) -> Point: + """ Parses the given direction to a Point. May raise if invalid """ + match char: + case 'R': + return Point(1, 0) + case 'U': + return Point(0, 1) + case 'L': + return Point(-1, 0) + case 'D': + return Point(0, -1) + case _: + raise Exception(f"Unkown Direction: {char}") + + def add(self, other: Point) -> Point: + return Point(self.x + other.x, self.y + other.y) + + def sub(self, other: Point) -> Point: + return Point(self.x - other.x, self.y - other.y) + + def is_unit(self) -> bool: + """ return true, if this discribes any point (diagonally) adjacent to the origin""" + return abs(self.x) <= 1 and abs(self.y) <= 1 + + def as_unit(self) -> Point: + """ Compresses this Point to a point with unit components """ + def unit(num: int) -> int: + return 0 if num == 0 else num // abs(num) + return Point(unit(self.x), unit(self.y)) + + def step_to(self, other: Point) -> Point | None: + diff = other.sub(self) + if diff.is_unit(): + return None + return self.add(diff.as_unit()) + + +@dataclass(frozen=True, slots=True) +class Command: + dir: Point + steps: int + + @staticmethod + def parse(line: str) -> Command: + """ Parse a command line. My raise exception if the was an illegal line""" + match line.split(): + case [dir, steps]: + return Command(Point.parse_direction(dir), int(steps)) + case _: + raise Exception(f"Illegal line: {line}") + + @staticmethod + def walk(lst: list[Command], rope_length: int): + """ Walks the whole rope in Planck length steps """ + rope = [Point(0, 0)] * rope_length + visited = {rope[-1]} + for command in lst: + for _ in range(command.steps): + rope[0] = rope[0].add(command.dir) + for n in range(1, rope_length): + moved_piece = rope[n].step_to(rope[n - 1]) + if not moved_piece: + break + rope[n] = moved_piece + if n == rope_length - 1: + visited.add(rope[n]) + + return len(visited) diff --git a/advent/days/day09/test_solution.py b/advent/days/day09/test_solution.py new file mode 100644 index 0000000..f97b41e --- /dev/null +++ b/advent/days/day09/test_solution.py @@ -0,0 +1,41 @@ +from advent.common import utils + +from .solution import Command, day_num, part1, part2 + + +def test_part1(): + data = utils.read_data(day_num, 'test01.txt') + expected = 13 + result = part1(data) + assert result == expected + + +def test_part2(): + data = utils.read_data(day_num, 'test02.txt') + expected = 36 + result = part2(data) + assert result == expected + + +def test_short(): + data = utils.read_data(day_num, 'test01.txt') + expected = 13 + lst = [Command.parse(line) for line in data] + result = Command.walk(lst, 2) + assert result == expected + + +def test_long1(): + data = utils.read_data(day_num, 'test01.txt') + expected = 1 + lst = [Command.parse(line) for line in data] + result = Command.walk(lst, 10) + assert result == expected + + +def test_long2(): + data = utils.read_data(day_num, 'test02.txt') + expected = 36 + lst = [Command.parse(line) for line in data] + result = Command.walk(lst, 10) + assert result == expected