day05 finished
This commit is contained in:
parent
543d0823c3
commit
380b825929
6 changed files with 706 additions and 0 deletions
|
|
@ -8,6 +8,7 @@ I use python 3.11 without any libraries beyond the standard.
|
|||
|
||||
| Day | Time | Rank | Score | Time | Rank | Score |
|
||||
| --- | --------- | ----- | ----- | -------- | ----- | ----- |
|
||||
| 5 | 01:01:27 | 11570 | 0 | 01:05:20 | 10701 | 0 |
|
||||
| 4 | 00:12:09 | 5789 | 0 | 00:16:03 | 5187 | 0 |
|
||||
| 3 | 00:47:15 | 13278 | 0 | 01:07:44 | 12947 | 0 |
|
||||
| 2 | 00:21:47 | 8874 | 0 | 00:36:49 | 9949 | 0 |
|
||||
|
|
|
|||
0
advent/days/day05/__init__.py
Normal file
0
advent/days/day05/__init__.py
Normal file
515
advent/days/day05/data/input.txt
Normal file
515
advent/days/day05/data/input.txt
Normal file
|
|
@ -0,0 +1,515 @@
|
|||
[G] [W] [Q]
|
||||
[Z] [Q] [M] [J] [F]
|
||||
[V] [V] [S] [F] [N] [R]
|
||||
[T] [F] [C] [H] [F] [W] [P]
|
||||
[B] [L] [L] [J] [C] [V] [D] [V]
|
||||
[J] [V] [F] [N] [T] [T] [C] [Z] [W]
|
||||
[G] [R] [Q] [H] [Q] [W] [Z] [G] [B]
|
||||
[R] [J] [S] [Z] [R] [S] [D] [L] [J]
|
||||
1 2 3 4 5 6 7 8 9
|
||||
|
||||
move 6 from 5 to 7
|
||||
move 2 from 9 to 1
|
||||
move 4 from 8 to 6
|
||||
move 1 from 8 to 1
|
||||
move 2 from 9 to 1
|
||||
move 1 from 6 to 1
|
||||
move 13 from 7 to 8
|
||||
move 1 from 2 to 8
|
||||
move 9 from 1 to 5
|
||||
move 1 from 3 to 8
|
||||
move 3 from 6 to 7
|
||||
move 4 from 4 to 1
|
||||
move 11 from 5 to 6
|
||||
move 6 from 6 to 9
|
||||
move 3 from 4 to 2
|
||||
move 7 from 8 to 6
|
||||
move 1 from 7 to 5
|
||||
move 1 from 4 to 3
|
||||
move 7 from 1 to 5
|
||||
move 2 from 2 to 7
|
||||
move 4 from 9 to 6
|
||||
move 1 from 3 to 6
|
||||
move 1 from 1 to 9
|
||||
move 1 from 3 to 6
|
||||
move 1 from 5 to 8
|
||||
move 4 from 6 to 7
|
||||
move 3 from 8 to 7
|
||||
move 7 from 5 to 7
|
||||
move 1 from 3 to 1
|
||||
move 1 from 2 to 6
|
||||
move 14 from 6 to 5
|
||||
move 2 from 5 to 2
|
||||
move 3 from 9 to 2
|
||||
move 6 from 2 to 9
|
||||
move 7 from 8 to 6
|
||||
move 7 from 7 to 3
|
||||
move 2 from 8 to 7
|
||||
move 6 from 3 to 7
|
||||
move 17 from 7 to 1
|
||||
move 1 from 3 to 1
|
||||
move 1 from 2 to 5
|
||||
move 4 from 5 to 6
|
||||
move 17 from 6 to 9
|
||||
move 7 from 9 to 4
|
||||
move 1 from 2 to 7
|
||||
move 2 from 5 to 4
|
||||
move 3 from 7 to 8
|
||||
move 7 from 5 to 2
|
||||
move 6 from 2 to 8
|
||||
move 8 from 9 to 6
|
||||
move 1 from 2 to 3
|
||||
move 8 from 4 to 9
|
||||
move 7 from 6 to 9
|
||||
move 18 from 1 to 7
|
||||
move 1 from 1 to 8
|
||||
move 2 from 6 to 9
|
||||
move 1 from 3 to 9
|
||||
move 1 from 4 to 6
|
||||
move 1 from 8 to 3
|
||||
move 1 from 3 to 1
|
||||
move 10 from 7 to 2
|
||||
move 9 from 8 to 4
|
||||
move 1 from 6 to 4
|
||||
move 2 from 7 to 8
|
||||
move 5 from 4 to 9
|
||||
move 17 from 9 to 5
|
||||
move 2 from 7 to 6
|
||||
move 5 from 9 to 7
|
||||
move 5 from 4 to 2
|
||||
move 8 from 2 to 4
|
||||
move 8 from 4 to 3
|
||||
move 2 from 6 to 5
|
||||
move 2 from 8 to 5
|
||||
move 3 from 9 to 3
|
||||
move 4 from 7 to 3
|
||||
move 6 from 9 to 6
|
||||
move 4 from 6 to 9
|
||||
move 5 from 9 to 3
|
||||
move 8 from 5 to 2
|
||||
move 1 from 1 to 9
|
||||
move 1 from 6 to 3
|
||||
move 1 from 9 to 4
|
||||
move 5 from 7 to 4
|
||||
move 19 from 3 to 1
|
||||
move 4 from 2 to 8
|
||||
move 13 from 5 to 1
|
||||
move 1 from 6 to 3
|
||||
move 3 from 3 to 6
|
||||
move 2 from 8 to 9
|
||||
move 4 from 2 to 9
|
||||
move 2 from 2 to 6
|
||||
move 1 from 1 to 6
|
||||
move 5 from 1 to 9
|
||||
move 10 from 9 to 3
|
||||
move 15 from 1 to 6
|
||||
move 21 from 6 to 2
|
||||
move 20 from 2 to 1
|
||||
move 2 from 8 to 9
|
||||
move 28 from 1 to 2
|
||||
move 6 from 4 to 6
|
||||
move 2 from 1 to 5
|
||||
move 3 from 3 to 4
|
||||
move 2 from 5 to 4
|
||||
move 1 from 4 to 3
|
||||
move 3 from 4 to 5
|
||||
move 2 from 5 to 4
|
||||
move 1 from 1 to 8
|
||||
move 25 from 2 to 9
|
||||
move 1 from 4 to 6
|
||||
move 1 from 3 to 8
|
||||
move 4 from 3 to 6
|
||||
move 1 from 4 to 9
|
||||
move 2 from 6 to 3
|
||||
move 1 from 5 to 9
|
||||
move 5 from 2 to 8
|
||||
move 7 from 9 to 6
|
||||
move 2 from 9 to 4
|
||||
move 3 from 2 to 1
|
||||
move 3 from 3 to 4
|
||||
move 1 from 3 to 5
|
||||
move 16 from 6 to 3
|
||||
move 7 from 8 to 3
|
||||
move 5 from 4 to 3
|
||||
move 1 from 1 to 3
|
||||
move 1 from 2 to 6
|
||||
move 1 from 5 to 6
|
||||
move 21 from 3 to 5
|
||||
move 2 from 1 to 2
|
||||
move 1 from 6 to 7
|
||||
move 10 from 9 to 8
|
||||
move 1 from 6 to 5
|
||||
move 5 from 8 to 7
|
||||
move 12 from 5 to 3
|
||||
move 20 from 3 to 6
|
||||
move 4 from 7 to 9
|
||||
move 1 from 7 to 3
|
||||
move 1 from 2 to 5
|
||||
move 1 from 3 to 8
|
||||
move 2 from 8 to 4
|
||||
move 4 from 8 to 7
|
||||
move 3 from 6 to 1
|
||||
move 1 from 1 to 5
|
||||
move 2 from 9 to 2
|
||||
move 2 from 1 to 5
|
||||
move 2 from 5 to 6
|
||||
move 3 from 7 to 1
|
||||
move 2 from 1 to 4
|
||||
move 4 from 6 to 8
|
||||
move 3 from 4 to 7
|
||||
move 3 from 2 to 5
|
||||
move 2 from 7 to 9
|
||||
move 9 from 9 to 8
|
||||
move 1 from 4 to 1
|
||||
move 7 from 5 to 7
|
||||
move 1 from 7 to 8
|
||||
move 1 from 3 to 1
|
||||
move 4 from 7 to 5
|
||||
move 2 from 1 to 9
|
||||
move 1 from 1 to 2
|
||||
move 5 from 5 to 4
|
||||
move 1 from 2 to 6
|
||||
move 5 from 7 to 9
|
||||
move 5 from 4 to 7
|
||||
move 11 from 9 to 6
|
||||
move 14 from 8 to 9
|
||||
move 23 from 6 to 5
|
||||
move 6 from 9 to 5
|
||||
move 1 from 6 to 2
|
||||
move 10 from 5 to 3
|
||||
move 1 from 4 to 9
|
||||
move 1 from 2 to 1
|
||||
move 2 from 7 to 3
|
||||
move 10 from 5 to 7
|
||||
move 8 from 5 to 2
|
||||
move 5 from 3 to 5
|
||||
move 7 from 5 to 8
|
||||
move 1 from 2 to 7
|
||||
move 9 from 7 to 9
|
||||
move 3 from 2 to 3
|
||||
move 2 from 6 to 2
|
||||
move 2 from 3 to 6
|
||||
move 4 from 7 to 5
|
||||
move 1 from 1 to 5
|
||||
move 4 from 3 to 1
|
||||
move 2 from 5 to 2
|
||||
move 1 from 3 to 2
|
||||
move 2 from 6 to 8
|
||||
move 7 from 5 to 3
|
||||
move 9 from 2 to 4
|
||||
move 2 from 1 to 2
|
||||
move 2 from 5 to 3
|
||||
move 1 from 4 to 9
|
||||
move 1 from 6 to 9
|
||||
move 1 from 4 to 2
|
||||
move 2 from 1 to 7
|
||||
move 3 from 2 to 6
|
||||
move 4 from 8 to 7
|
||||
move 2 from 8 to 3
|
||||
move 2 from 3 to 7
|
||||
move 1 from 6 to 5
|
||||
move 2 from 8 to 2
|
||||
move 5 from 4 to 1
|
||||
move 8 from 9 to 8
|
||||
move 1 from 5 to 7
|
||||
move 10 from 9 to 2
|
||||
move 8 from 8 to 2
|
||||
move 1 from 1 to 6
|
||||
move 12 from 3 to 9
|
||||
move 7 from 7 to 4
|
||||
move 13 from 2 to 4
|
||||
move 7 from 2 to 7
|
||||
move 1 from 6 to 7
|
||||
move 3 from 9 to 8
|
||||
move 2 from 6 to 3
|
||||
move 1 from 3 to 2
|
||||
move 1 from 3 to 9
|
||||
move 3 from 1 to 5
|
||||
move 1 from 1 to 6
|
||||
move 4 from 7 to 6
|
||||
move 5 from 7 to 1
|
||||
move 1 from 2 to 1
|
||||
move 6 from 9 to 4
|
||||
move 5 from 9 to 7
|
||||
move 3 from 8 to 3
|
||||
move 22 from 4 to 9
|
||||
move 24 from 9 to 8
|
||||
move 1 from 9 to 2
|
||||
move 2 from 4 to 3
|
||||
move 10 from 8 to 3
|
||||
move 1 from 2 to 1
|
||||
move 1 from 3 to 8
|
||||
move 1 from 6 to 3
|
||||
move 1 from 1 to 4
|
||||
move 4 from 3 to 4
|
||||
move 4 from 6 to 1
|
||||
move 2 from 4 to 5
|
||||
move 4 from 7 to 2
|
||||
move 7 from 4 to 6
|
||||
move 4 from 6 to 1
|
||||
move 2 from 6 to 3
|
||||
move 1 from 6 to 2
|
||||
move 5 from 5 to 2
|
||||
move 12 from 3 to 5
|
||||
move 3 from 7 to 8
|
||||
move 6 from 2 to 3
|
||||
move 11 from 1 to 9
|
||||
move 1 from 1 to 7
|
||||
move 1 from 7 to 5
|
||||
move 2 from 3 to 9
|
||||
move 2 from 9 to 7
|
||||
move 4 from 2 to 5
|
||||
move 2 from 7 to 1
|
||||
move 17 from 8 to 1
|
||||
move 1 from 3 to 2
|
||||
move 16 from 1 to 3
|
||||
move 8 from 3 to 4
|
||||
move 2 from 8 to 3
|
||||
move 2 from 1 to 5
|
||||
move 1 from 2 to 6
|
||||
move 12 from 5 to 8
|
||||
move 1 from 6 to 3
|
||||
move 9 from 3 to 9
|
||||
move 8 from 4 to 6
|
||||
move 2 from 1 to 6
|
||||
move 6 from 8 to 4
|
||||
move 3 from 4 to 6
|
||||
move 1 from 1 to 9
|
||||
move 11 from 6 to 8
|
||||
move 3 from 4 to 3
|
||||
move 17 from 9 to 5
|
||||
move 2 from 6 to 7
|
||||
move 1 from 9 to 1
|
||||
move 2 from 8 to 6
|
||||
move 1 from 7 to 5
|
||||
move 1 from 8 to 9
|
||||
move 1 from 1 to 7
|
||||
move 3 from 9 to 6
|
||||
move 2 from 7 to 8
|
||||
move 1 from 9 to 6
|
||||
move 15 from 5 to 2
|
||||
move 9 from 3 to 9
|
||||
move 11 from 8 to 3
|
||||
move 6 from 9 to 8
|
||||
move 4 from 6 to 7
|
||||
move 3 from 3 to 7
|
||||
move 5 from 5 to 6
|
||||
move 7 from 7 to 5
|
||||
move 3 from 6 to 1
|
||||
move 2 from 1 to 4
|
||||
move 1 from 9 to 2
|
||||
move 2 from 9 to 3
|
||||
move 2 from 6 to 3
|
||||
move 1 from 1 to 8
|
||||
move 6 from 5 to 9
|
||||
move 8 from 2 to 5
|
||||
move 10 from 8 to 5
|
||||
move 1 from 2 to 9
|
||||
move 21 from 5 to 9
|
||||
move 2 from 8 to 4
|
||||
move 5 from 9 to 1
|
||||
move 2 from 5 to 2
|
||||
move 15 from 9 to 2
|
||||
move 1 from 5 to 9
|
||||
move 9 from 9 to 3
|
||||
move 1 from 1 to 6
|
||||
move 3 from 4 to 1
|
||||
move 20 from 3 to 5
|
||||
move 20 from 5 to 4
|
||||
move 7 from 4 to 3
|
||||
move 1 from 1 to 7
|
||||
move 11 from 4 to 5
|
||||
move 4 from 3 to 2
|
||||
move 11 from 5 to 4
|
||||
move 2 from 6 to 7
|
||||
move 4 from 3 to 9
|
||||
move 2 from 2 to 8
|
||||
move 2 from 9 to 4
|
||||
move 6 from 4 to 6
|
||||
move 2 from 7 to 9
|
||||
move 1 from 7 to 6
|
||||
move 1 from 4 to 9
|
||||
move 4 from 4 to 6
|
||||
move 2 from 8 to 6
|
||||
move 1 from 4 to 3
|
||||
move 1 from 4 to 6
|
||||
move 1 from 3 to 1
|
||||
move 3 from 4 to 3
|
||||
move 9 from 2 to 8
|
||||
move 2 from 3 to 7
|
||||
move 5 from 6 to 2
|
||||
move 2 from 7 to 5
|
||||
move 1 from 5 to 2
|
||||
move 1 from 9 to 3
|
||||
move 1 from 5 to 1
|
||||
move 13 from 2 to 5
|
||||
move 4 from 9 to 5
|
||||
move 1 from 3 to 4
|
||||
move 9 from 2 to 3
|
||||
move 7 from 3 to 2
|
||||
move 11 from 5 to 6
|
||||
move 5 from 8 to 7
|
||||
move 1 from 3 to 1
|
||||
move 2 from 8 to 5
|
||||
move 2 from 8 to 1
|
||||
move 1 from 4 to 1
|
||||
move 6 from 2 to 7
|
||||
move 3 from 5 to 3
|
||||
move 1 from 2 to 5
|
||||
move 7 from 7 to 9
|
||||
move 3 from 3 to 5
|
||||
move 1 from 2 to 5
|
||||
move 2 from 3 to 2
|
||||
move 6 from 1 to 7
|
||||
move 10 from 7 to 3
|
||||
move 1 from 2 to 3
|
||||
move 6 from 9 to 8
|
||||
move 1 from 2 to 4
|
||||
move 2 from 6 to 1
|
||||
move 5 from 1 to 9
|
||||
move 8 from 5 to 8
|
||||
move 2 from 1 to 6
|
||||
move 6 from 3 to 4
|
||||
move 1 from 5 to 3
|
||||
move 4 from 9 to 6
|
||||
move 1 from 1 to 4
|
||||
move 2 from 9 to 2
|
||||
move 5 from 6 to 1
|
||||
move 11 from 6 to 7
|
||||
move 1 from 2 to 8
|
||||
move 6 from 7 to 5
|
||||
move 10 from 8 to 4
|
||||
move 2 from 3 to 9
|
||||
move 3 from 3 to 5
|
||||
move 4 from 7 to 9
|
||||
move 2 from 1 to 3
|
||||
move 10 from 5 to 8
|
||||
move 6 from 6 to 1
|
||||
move 2 from 6 to 8
|
||||
move 2 from 9 to 5
|
||||
move 4 from 9 to 6
|
||||
move 7 from 4 to 8
|
||||
move 5 from 6 to 1
|
||||
move 4 from 8 to 2
|
||||
move 2 from 5 to 6
|
||||
move 5 from 4 to 5
|
||||
move 1 from 7 to 5
|
||||
move 2 from 3 to 6
|
||||
move 1 from 3 to 8
|
||||
move 4 from 6 to 1
|
||||
move 4 from 2 to 3
|
||||
move 5 from 5 to 1
|
||||
move 2 from 3 to 2
|
||||
move 2 from 3 to 2
|
||||
move 20 from 8 to 2
|
||||
move 5 from 4 to 8
|
||||
move 1 from 4 to 3
|
||||
move 8 from 2 to 1
|
||||
move 1 from 5 to 6
|
||||
move 5 from 2 to 3
|
||||
move 1 from 6 to 5
|
||||
move 5 from 3 to 2
|
||||
move 1 from 3 to 7
|
||||
move 6 from 8 to 5
|
||||
move 13 from 2 to 9
|
||||
move 7 from 9 to 8
|
||||
move 1 from 7 to 8
|
||||
move 5 from 8 to 3
|
||||
move 2 from 2 to 5
|
||||
move 2 from 8 to 4
|
||||
move 27 from 1 to 5
|
||||
move 1 from 2 to 3
|
||||
move 5 from 3 to 1
|
||||
move 22 from 5 to 7
|
||||
move 1 from 8 to 5
|
||||
move 1 from 3 to 2
|
||||
move 7 from 1 to 3
|
||||
move 2 from 3 to 7
|
||||
move 2 from 2 to 4
|
||||
move 5 from 9 to 1
|
||||
move 5 from 3 to 9
|
||||
move 3 from 1 to 5
|
||||
move 3 from 1 to 6
|
||||
move 3 from 6 to 3
|
||||
move 4 from 4 to 2
|
||||
move 8 from 5 to 3
|
||||
move 8 from 7 to 4
|
||||
move 14 from 7 to 4
|
||||
move 1 from 1 to 7
|
||||
move 6 from 9 to 6
|
||||
move 7 from 5 to 3
|
||||
move 14 from 3 to 6
|
||||
move 2 from 2 to 1
|
||||
move 4 from 3 to 7
|
||||
move 6 from 7 to 6
|
||||
move 1 from 7 to 6
|
||||
move 1 from 5 to 1
|
||||
move 2 from 1 to 5
|
||||
move 3 from 5 to 7
|
||||
move 8 from 6 to 5
|
||||
move 5 from 5 to 1
|
||||
move 1 from 7 to 3
|
||||
move 1 from 3 to 8
|
||||
move 22 from 4 to 7
|
||||
move 7 from 6 to 3
|
||||
move 4 from 3 to 2
|
||||
move 3 from 1 to 3
|
||||
move 17 from 7 to 6
|
||||
move 1 from 8 to 1
|
||||
move 2 from 2 to 4
|
||||
move 3 from 7 to 2
|
||||
move 2 from 2 to 9
|
||||
move 1 from 1 to 8
|
||||
move 2 from 3 to 1
|
||||
move 6 from 6 to 8
|
||||
move 2 from 9 to 2
|
||||
move 4 from 5 to 1
|
||||
move 5 from 8 to 9
|
||||
move 1 from 7 to 3
|
||||
move 4 from 3 to 4
|
||||
move 1 from 7 to 4
|
||||
move 4 from 9 to 7
|
||||
move 5 from 7 to 9
|
||||
move 1 from 7 to 3
|
||||
move 2 from 2 to 8
|
||||
move 5 from 4 to 2
|
||||
move 21 from 6 to 8
|
||||
move 2 from 3 to 8
|
||||
move 23 from 8 to 6
|
||||
move 1 from 2 to 6
|
||||
move 2 from 9 to 8
|
||||
move 22 from 6 to 7
|
||||
move 2 from 9 to 3
|
||||
move 2 from 3 to 7
|
||||
move 2 from 1 to 6
|
||||
move 1 from 2 to 5
|
||||
move 3 from 1 to 3
|
||||
move 6 from 7 to 4
|
||||
move 5 from 8 to 5
|
||||
move 1 from 3 to 8
|
||||
move 1 from 9 to 3
|
||||
move 6 from 4 to 8
|
||||
move 1 from 5 to 3
|
||||
move 6 from 2 to 8
|
||||
move 15 from 7 to 5
|
||||
move 1 from 7 to 1
|
||||
move 14 from 5 to 8
|
||||
move 1 from 4 to 9
|
||||
move 5 from 1 to 7
|
||||
move 3 from 6 to 2
|
||||
move 4 from 5 to 6
|
||||
move 1 from 4 to 8
|
||||
move 4 from 3 to 1
|
||||
move 2 from 9 to 2
|
||||
move 7 from 7 to 1
|
||||
move 7 from 2 to 7
|
||||
move 9 from 8 to 6
|
||||
move 7 from 7 to 1
|
||||
move 12 from 6 to 8
|
||||
move 25 from 8 to 6
|
||||
move 3 from 8 to 1
|
||||
move 28 from 6 to 2
|
||||
move 15 from 2 to 3
|
||||
move 1 from 5 to 4
|
||||
move 3 from 2 to 7
|
||||
move 6 from 2 to 9
|
||||
9
advent/days/day05/data/test01.txt
Normal file
9
advent/days/day05/data/test01.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
[D]
|
||||
[N] [C]
|
||||
[Z] [M] [P]
|
||||
1 2 3
|
||||
|
||||
move 1 from 2 to 1
|
||||
move 3 from 1 to 3
|
||||
move 2 from 2 to 1
|
||||
move 1 from 1 to 2
|
||||
105
advent/days/day05/solution.py
Normal file
105
advent/days/day05/solution.py
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
from __future__ import annotations
|
||||
from dataclasses import dataclass
|
||||
|
||||
from typing import Iterator
|
||||
|
||||
from advent.parser.parser import P
|
||||
|
||||
day_num = 5
|
||||
|
||||
|
||||
def part1(lines: Iterator[str]) -> str:
|
||||
state = State.parse(lines)
|
||||
crates = state.all_moves9000()
|
||||
return State.top(crates)
|
||||
|
||||
|
||||
def part2(lines: Iterator[str]) -> str:
|
||||
state = State.parse(lines)
|
||||
crates = state.all_moves9001()
|
||||
return State.top(crates)
|
||||
|
||||
|
||||
crate_parser: P[str | None] = P.either(P.any_char().in_brackets(), P.string(" ").replace(None))
|
||||
crate_row_parser = crate_parser.sep_by(P.is_char(' '))
|
||||
amount_parser = P.snd(P.string("move "), P.unsigned())
|
||||
from_parser = P.snd(P.string(" from "), P.unsigned())
|
||||
to_parser = P.snd(P.string(" to "), P.unsigned())
|
||||
move_parser = P.seq(amount_parser, from_parser, to_parser)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class State:
|
||||
crates: list[str]
|
||||
moves: list[tuple[int, int, int]]
|
||||
|
||||
@staticmethod
|
||||
def parse_crate_line(line: str) -> list[None | str] | None:
|
||||
return crate_row_parser.parse(line).get_or(None)
|
||||
|
||||
@staticmethod
|
||||
def parse_drawing(lines: Iterator[str]) -> list[str]:
|
||||
result: list[str] = []
|
||||
for line in lines:
|
||||
crates = State.parse_crate_line(line)
|
||||
if crates is None:
|
||||
return result
|
||||
|
||||
if len(result) < len(crates):
|
||||
result += [""] * (len(crates) - len(result))
|
||||
for stack, crate in enumerate(crates):
|
||||
if crate is not None:
|
||||
result[stack] = crate + result[stack]
|
||||
|
||||
raise Exception("Can never happen")
|
||||
|
||||
@staticmethod
|
||||
def parse_move(line: str) -> tuple[int, int, int]:
|
||||
amount, frm, to = move_parser.parse(line).get()
|
||||
return amount, frm - 1, to - 1
|
||||
|
||||
@staticmethod
|
||||
def parse(lines: Iterator[str]) -> State:
|
||||
drawing = State.parse_drawing(lines)
|
||||
next(lines)
|
||||
moves = [State.parse_move(line) for line in lines]
|
||||
return State(drawing, moves)
|
||||
|
||||
@staticmethod
|
||||
def do_move9000(crates: list[str], move: tuple[int, int, int]) -> list[str]:
|
||||
"""
|
||||
Moves the given crates by the provided move. Will fail if there are not enough crates
|
||||
in the from stack
|
||||
"""
|
||||
for _ in range(move[0]):
|
||||
crates[move[2]] += crates[move[1]][-1]
|
||||
crates[move[1]] = crates[move[1]][:-1]
|
||||
|
||||
return crates
|
||||
|
||||
def all_moves9000(self) -> list[str]:
|
||||
crates = self.crates
|
||||
for move in self.moves:
|
||||
crates = State.do_move9000(crates, move)
|
||||
return crates
|
||||
|
||||
@staticmethod
|
||||
def do_move9001(crates: list[str], move: tuple[int, int, int]) -> list[str]:
|
||||
"""
|
||||
Moves the given crates by the provided move. Will fail if there are not enough crates
|
||||
in the from stack
|
||||
"""
|
||||
crates[move[2]] += crates[move[1]][-move[0]:]
|
||||
crates[move[1]] = crates[move[1]][:-move[0]]
|
||||
return crates
|
||||
|
||||
def all_moves9001(self) -> list[str]:
|
||||
crates = self.crates
|
||||
for move in self.moves:
|
||||
crates = State.do_move9001(crates, move)
|
||||
return crates
|
||||
|
||||
@staticmethod
|
||||
def top(crates: list[str]) -> str:
|
||||
""" Lists the last item in the given stacks. Fails if any stack is empty """
|
||||
return ''.join(stack[-1] for stack in crates)
|
||||
76
advent/days/day05/test_solution.py
Normal file
76
advent/days/day05/test_solution.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
from advent.common import utils
|
||||
|
||||
from .solution import day_num, part1, part2, State
|
||||
|
||||
|
||||
def test_part1():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
expected = "CMZ"
|
||||
result = part1(data)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_part2():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
expected = "MCD"
|
||||
result = part2(data)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_parse_line():
|
||||
input = " [D] "
|
||||
expected = [None, 'D', None]
|
||||
result = State.parse_crate_line(input)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_parse_line2():
|
||||
input = "[Z] [M] [P]"
|
||||
expected = ["Z", 'M', "P"]
|
||||
result = State.parse_crate_line(input)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_drawing():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
expected = ["ZN", "MCD", "P"]
|
||||
result = State.parse_drawing(data)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_parse_move():
|
||||
input = "move 1 from 2 to 1"
|
||||
expected = 1, 1, 0
|
||||
result = State.parse_move(input)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_parse_all():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
expected = State(["ZN", "MCD", "P"], [(1, 1, 0), (3, 0, 2), (2, 1, 0), (1, 0, 1)])
|
||||
result = State.parse(data)
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_step():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
state = State.parse(data)
|
||||
expected = ["ZND", "MC", "P"]
|
||||
result = State.do_move9000(state.crates, state.moves[0])
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_all_moves():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
state = State.parse(data)
|
||||
expected = ["C", "M", "PDNZ"]
|
||||
result = state.all_moves9000()
|
||||
assert result == expected
|
||||
|
||||
|
||||
def test_all_moves9001():
|
||||
data = utils.read_data(day_num, 'test01.txt')
|
||||
state = State.parse(data)
|
||||
expected = ["M", "C", "PZND"]
|
||||
result = state.all_moves9001()
|
||||
assert result == expected
|
||||
Loading…
Add table
Add a link
Reference in a new issue