Day 5
This commit is contained in:
@@ -36,9 +36,11 @@ library
|
||||
Days.D02
|
||||
Days.D03
|
||||
Days.D04
|
||||
Days.D05
|
||||
build-depends:
|
||||
megaparsec ^>=9.4.0
|
||||
, text
|
||||
, vector ^>=0.13.0.0
|
||||
|
||||
executable Y2022
|
||||
import: warnings, defaults
|
||||
|
||||
@@ -12,6 +12,7 @@ paths =
|
||||
, "./data/02.in"
|
||||
, "./data/03.in"
|
||||
, "./data/04.in"
|
||||
, "./data/05.in"
|
||||
]
|
||||
|
||||
solutions :: [(Int, Day, FilePath)]
|
||||
|
||||
512
data/05.in
Normal file
512
data/05.in
Normal file
@@ -0,0 +1,512 @@
|
||||
[V] [C] [M]
|
||||
[V] [J] [N] [H] [V]
|
||||
[R] [F] [N] [W] [Z] [N]
|
||||
[H] [R] [D] [Q] [M] [L] [B]
|
||||
[B] [C] [H] [V] [R] [C] [G] [R]
|
||||
[G] [G] [F] [S] [D] [H] [B] [R] [S]
|
||||
[D] [N] [S] [D] [H] [G] [J] [J] [G]
|
||||
[W] [J] [L] [J] [S] [P] [F] [S] [L]
|
||||
1 2 3 4 5 6 7 8 9
|
||||
|
||||
move 2 from 2 to 7
|
||||
move 8 from 5 to 6
|
||||
move 2 from 4 to 5
|
||||
move 1 from 4 to 5
|
||||
move 1 from 5 to 8
|
||||
move 5 from 9 to 2
|
||||
move 7 from 1 to 6
|
||||
move 7 from 3 to 8
|
||||
move 1 from 4 to 6
|
||||
move 2 from 5 to 6
|
||||
move 6 from 7 to 5
|
||||
move 2 from 2 to 4
|
||||
move 4 from 5 to 2
|
||||
move 10 from 8 to 1
|
||||
move 2 from 7 to 4
|
||||
move 4 from 2 to 8
|
||||
move 2 from 9 to 8
|
||||
move 1 from 8 to 4
|
||||
move 2 from 4 to 9
|
||||
move 5 from 8 to 2
|
||||
move 1 from 4 to 6
|
||||
move 1 from 8 to 9
|
||||
move 1 from 7 to 2
|
||||
move 2 from 4 to 2
|
||||
move 1 from 7 to 3
|
||||
move 13 from 2 to 1
|
||||
move 1 from 2 to 4
|
||||
move 1 from 2 to 3
|
||||
move 2 from 5 to 4
|
||||
move 17 from 6 to 4
|
||||
move 3 from 4 to 9
|
||||
move 14 from 1 to 4
|
||||
move 4 from 6 to 8
|
||||
move 1 from 9 to 8
|
||||
move 23 from 4 to 8
|
||||
move 6 from 1 to 7
|
||||
move 3 from 1 to 5
|
||||
move 1 from 3 to 8
|
||||
move 5 from 7 to 8
|
||||
move 1 from 3 to 4
|
||||
move 1 from 5 to 3
|
||||
move 1 from 5 to 1
|
||||
move 1 from 3 to 2
|
||||
move 1 from 9 to 4
|
||||
move 9 from 4 to 9
|
||||
move 1 from 1 to 2
|
||||
move 11 from 8 to 2
|
||||
move 1 from 4 to 5
|
||||
move 13 from 2 to 3
|
||||
move 7 from 9 to 6
|
||||
move 1 from 5 to 6
|
||||
move 1 from 5 to 2
|
||||
move 1 from 9 to 4
|
||||
move 1 from 4 to 9
|
||||
move 2 from 8 to 9
|
||||
move 1 from 7 to 8
|
||||
move 8 from 9 to 1
|
||||
move 8 from 1 to 4
|
||||
move 4 from 6 to 7
|
||||
move 1 from 9 to 4
|
||||
move 2 from 3 to 9
|
||||
move 1 from 9 to 1
|
||||
move 6 from 4 to 1
|
||||
move 2 from 1 to 3
|
||||
move 22 from 8 to 6
|
||||
move 1 from 2 to 5
|
||||
move 3 from 7 to 8
|
||||
move 15 from 6 to 4
|
||||
move 7 from 3 to 7
|
||||
move 4 from 6 to 9
|
||||
move 2 from 9 to 2
|
||||
move 6 from 3 to 5
|
||||
move 3 from 9 to 5
|
||||
move 5 from 5 to 8
|
||||
move 1 from 2 to 1
|
||||
move 6 from 8 to 2
|
||||
move 1 from 1 to 2
|
||||
move 3 from 5 to 3
|
||||
move 1 from 7 to 2
|
||||
move 4 from 7 to 8
|
||||
move 4 from 6 to 1
|
||||
move 1 from 5 to 1
|
||||
move 4 from 8 to 7
|
||||
move 2 from 3 to 2
|
||||
move 1 from 1 to 3
|
||||
move 15 from 4 to 2
|
||||
move 3 from 7 to 3
|
||||
move 4 from 7 to 2
|
||||
move 1 from 4 to 9
|
||||
move 5 from 3 to 8
|
||||
move 29 from 2 to 1
|
||||
move 1 from 9 to 5
|
||||
move 1 from 2 to 1
|
||||
move 11 from 1 to 5
|
||||
move 1 from 4 to 5
|
||||
move 2 from 6 to 3
|
||||
move 1 from 3 to 4
|
||||
move 16 from 1 to 9
|
||||
move 4 from 8 to 4
|
||||
move 3 from 6 to 9
|
||||
move 1 from 3 to 7
|
||||
move 1 from 7 to 3
|
||||
move 6 from 1 to 6
|
||||
move 3 from 4 to 3
|
||||
move 3 from 8 to 5
|
||||
move 3 from 1 to 8
|
||||
move 3 from 1 to 4
|
||||
move 2 from 4 to 9
|
||||
move 3 from 6 to 3
|
||||
move 15 from 5 to 2
|
||||
move 3 from 2 to 3
|
||||
move 4 from 2 to 7
|
||||
move 2 from 5 to 9
|
||||
move 10 from 3 to 6
|
||||
move 11 from 9 to 5
|
||||
move 2 from 4 to 9
|
||||
move 8 from 9 to 4
|
||||
move 1 from 9 to 6
|
||||
move 7 from 4 to 6
|
||||
move 3 from 5 to 8
|
||||
move 22 from 6 to 9
|
||||
move 4 from 7 to 8
|
||||
move 8 from 5 to 8
|
||||
move 2 from 4 to 3
|
||||
move 1 from 8 to 1
|
||||
move 17 from 8 to 3
|
||||
move 3 from 3 to 4
|
||||
move 13 from 3 to 9
|
||||
move 20 from 9 to 7
|
||||
move 2 from 2 to 9
|
||||
move 19 from 9 to 5
|
||||
move 1 from 1 to 4
|
||||
move 3 from 2 to 7
|
||||
move 4 from 4 to 3
|
||||
move 1 from 9 to 8
|
||||
move 18 from 5 to 1
|
||||
move 1 from 9 to 4
|
||||
move 1 from 9 to 7
|
||||
move 2 from 4 to 8
|
||||
move 1 from 5 to 4
|
||||
move 3 from 2 to 7
|
||||
move 3 from 3 to 1
|
||||
move 2 from 1 to 3
|
||||
move 3 from 3 to 8
|
||||
move 1 from 4 to 8
|
||||
move 6 from 8 to 2
|
||||
move 1 from 3 to 9
|
||||
move 1 from 3 to 9
|
||||
move 10 from 1 to 9
|
||||
move 7 from 1 to 7
|
||||
move 4 from 7 to 4
|
||||
move 29 from 7 to 3
|
||||
move 6 from 2 to 9
|
||||
move 25 from 3 to 6
|
||||
move 5 from 3 to 9
|
||||
move 13 from 6 to 9
|
||||
move 12 from 6 to 2
|
||||
move 1 from 8 to 9
|
||||
move 10 from 2 to 6
|
||||
move 7 from 6 to 5
|
||||
move 20 from 9 to 3
|
||||
move 11 from 3 to 6
|
||||
move 1 from 7 to 9
|
||||
move 2 from 2 to 9
|
||||
move 19 from 9 to 2
|
||||
move 14 from 6 to 8
|
||||
move 4 from 5 to 2
|
||||
move 2 from 4 to 6
|
||||
move 3 from 5 to 1
|
||||
move 13 from 8 to 5
|
||||
move 1 from 6 to 1
|
||||
move 2 from 4 to 2
|
||||
move 8 from 2 to 4
|
||||
move 6 from 4 to 7
|
||||
move 1 from 9 to 8
|
||||
move 2 from 4 to 7
|
||||
move 5 from 2 to 4
|
||||
move 4 from 4 to 2
|
||||
move 10 from 5 to 6
|
||||
move 1 from 1 to 7
|
||||
move 1 from 5 to 4
|
||||
move 1 from 4 to 9
|
||||
move 4 from 7 to 8
|
||||
move 5 from 1 to 7
|
||||
move 1 from 9 to 7
|
||||
move 7 from 3 to 2
|
||||
move 2 from 5 to 2
|
||||
move 8 from 6 to 9
|
||||
move 1 from 4 to 6
|
||||
move 3 from 7 to 4
|
||||
move 5 from 9 to 7
|
||||
move 2 from 4 to 3
|
||||
move 20 from 2 to 4
|
||||
move 2 from 4 to 8
|
||||
move 14 from 4 to 2
|
||||
move 12 from 7 to 4
|
||||
move 8 from 2 to 1
|
||||
move 10 from 2 to 4
|
||||
move 6 from 8 to 5
|
||||
move 1 from 7 to 8
|
||||
move 4 from 4 to 3
|
||||
move 1 from 3 to 9
|
||||
move 1 from 2 to 7
|
||||
move 1 from 6 to 8
|
||||
move 5 from 3 to 5
|
||||
move 1 from 3 to 2
|
||||
move 7 from 4 to 5
|
||||
move 6 from 1 to 7
|
||||
move 5 from 7 to 6
|
||||
move 1 from 6 to 5
|
||||
move 2 from 7 to 8
|
||||
move 1 from 2 to 6
|
||||
move 2 from 8 to 2
|
||||
move 5 from 5 to 7
|
||||
move 6 from 6 to 8
|
||||
move 16 from 4 to 9
|
||||
move 16 from 9 to 4
|
||||
move 11 from 5 to 4
|
||||
move 5 from 8 to 3
|
||||
move 2 from 5 to 2
|
||||
move 14 from 4 to 2
|
||||
move 1 from 6 to 3
|
||||
move 1 from 6 to 9
|
||||
move 1 from 5 to 3
|
||||
move 3 from 8 to 2
|
||||
move 10 from 4 to 7
|
||||
move 5 from 9 to 2
|
||||
move 3 from 4 to 7
|
||||
move 1 from 1 to 4
|
||||
move 3 from 2 to 5
|
||||
move 2 from 3 to 7
|
||||
move 1 from 4 to 2
|
||||
move 18 from 2 to 8
|
||||
move 3 from 8 to 4
|
||||
move 5 from 3 to 1
|
||||
move 1 from 3 to 9
|
||||
move 1 from 9 to 3
|
||||
move 8 from 8 to 7
|
||||
move 2 from 5 to 4
|
||||
move 1 from 5 to 6
|
||||
move 1 from 2 to 5
|
||||
move 1 from 5 to 8
|
||||
move 1 from 6 to 9
|
||||
move 3 from 2 to 7
|
||||
move 27 from 7 to 4
|
||||
move 2 from 2 to 4
|
||||
move 4 from 8 to 4
|
||||
move 1 from 9 to 8
|
||||
move 3 from 1 to 6
|
||||
move 1 from 3 to 5
|
||||
move 3 from 8 to 3
|
||||
move 1 from 1 to 4
|
||||
move 1 from 8 to 1
|
||||
move 3 from 1 to 4
|
||||
move 2 from 8 to 2
|
||||
move 2 from 6 to 2
|
||||
move 8 from 4 to 9
|
||||
move 1 from 7 to 1
|
||||
move 1 from 5 to 4
|
||||
move 1 from 7 to 3
|
||||
move 4 from 2 to 7
|
||||
move 1 from 8 to 6
|
||||
move 8 from 9 to 7
|
||||
move 1 from 6 to 3
|
||||
move 3 from 3 to 4
|
||||
move 37 from 4 to 1
|
||||
move 1 from 4 to 5
|
||||
move 13 from 7 to 8
|
||||
move 6 from 8 to 4
|
||||
move 5 from 8 to 3
|
||||
move 1 from 7 to 6
|
||||
move 4 from 1 to 5
|
||||
move 1 from 6 to 5
|
||||
move 2 from 8 to 4
|
||||
move 32 from 1 to 5
|
||||
move 1 from 1 to 4
|
||||
move 5 from 3 to 5
|
||||
move 1 from 3 to 2
|
||||
move 1 from 2 to 9
|
||||
move 19 from 5 to 2
|
||||
move 1 from 9 to 1
|
||||
move 16 from 5 to 1
|
||||
move 7 from 5 to 6
|
||||
move 1 from 3 to 1
|
||||
move 11 from 1 to 2
|
||||
move 18 from 2 to 4
|
||||
move 1 from 5 to 9
|
||||
move 8 from 6 to 1
|
||||
move 10 from 2 to 6
|
||||
move 7 from 4 to 9
|
||||
move 2 from 2 to 1
|
||||
move 7 from 4 to 2
|
||||
move 5 from 4 to 5
|
||||
move 2 from 9 to 6
|
||||
move 9 from 6 to 3
|
||||
move 5 from 5 to 3
|
||||
move 8 from 4 to 9
|
||||
move 7 from 9 to 8
|
||||
move 4 from 2 to 9
|
||||
move 10 from 3 to 1
|
||||
move 6 from 8 to 1
|
||||
move 2 from 6 to 3
|
||||
move 5 from 3 to 8
|
||||
move 3 from 2 to 7
|
||||
move 1 from 9 to 5
|
||||
move 1 from 3 to 5
|
||||
move 2 from 7 to 8
|
||||
move 1 from 8 to 9
|
||||
move 1 from 6 to 1
|
||||
move 23 from 1 to 4
|
||||
move 2 from 5 to 3
|
||||
move 1 from 8 to 2
|
||||
move 2 from 8 to 5
|
||||
move 2 from 5 to 6
|
||||
move 1 from 2 to 7
|
||||
move 1 from 7 to 5
|
||||
move 4 from 9 to 7
|
||||
move 1 from 7 to 5
|
||||
move 1 from 3 to 6
|
||||
move 3 from 7 to 4
|
||||
move 1 from 3 to 8
|
||||
move 1 from 4 to 6
|
||||
move 6 from 1 to 8
|
||||
move 4 from 6 to 4
|
||||
move 2 from 9 to 1
|
||||
move 1 from 5 to 1
|
||||
move 19 from 4 to 2
|
||||
move 2 from 9 to 3
|
||||
move 1 from 9 to 3
|
||||
move 9 from 1 to 8
|
||||
move 1 from 5 to 8
|
||||
move 1 from 9 to 3
|
||||
move 2 from 3 to 9
|
||||
move 3 from 8 to 4
|
||||
move 1 from 4 to 9
|
||||
move 1 from 9 to 5
|
||||
move 2 from 3 to 4
|
||||
move 6 from 4 to 7
|
||||
move 3 from 9 to 5
|
||||
move 4 from 4 to 7
|
||||
move 1 from 5 to 6
|
||||
move 18 from 2 to 7
|
||||
move 13 from 7 to 9
|
||||
move 3 from 5 to 1
|
||||
move 1 from 2 to 1
|
||||
move 1 from 6 to 5
|
||||
move 3 from 1 to 7
|
||||
move 1 from 1 to 5
|
||||
move 7 from 9 to 6
|
||||
move 8 from 7 to 4
|
||||
move 11 from 7 to 6
|
||||
move 5 from 9 to 2
|
||||
move 17 from 6 to 1
|
||||
move 2 from 5 to 1
|
||||
move 11 from 8 to 1
|
||||
move 20 from 1 to 2
|
||||
move 3 from 8 to 1
|
||||
move 1 from 9 to 8
|
||||
move 1 from 6 to 1
|
||||
move 11 from 1 to 7
|
||||
move 18 from 2 to 3
|
||||
move 12 from 4 to 8
|
||||
move 11 from 7 to 3
|
||||
move 7 from 2 to 3
|
||||
move 2 from 1 to 5
|
||||
move 1 from 1 to 3
|
||||
move 1 from 8 to 1
|
||||
move 1 from 5 to 9
|
||||
move 1 from 9 to 6
|
||||
move 1 from 8 to 7
|
||||
move 1 from 5 to 3
|
||||
move 1 from 6 to 7
|
||||
move 2 from 8 to 1
|
||||
move 8 from 3 to 2
|
||||
move 7 from 2 to 9
|
||||
move 6 from 8 to 6
|
||||
move 1 from 9 to 3
|
||||
move 2 from 6 to 4
|
||||
move 5 from 9 to 6
|
||||
move 7 from 6 to 2
|
||||
move 8 from 2 to 9
|
||||
move 2 from 1 to 9
|
||||
move 2 from 7 to 2
|
||||
move 2 from 4 to 8
|
||||
move 1 from 2 to 7
|
||||
move 25 from 3 to 7
|
||||
move 7 from 9 to 7
|
||||
move 1 from 2 to 5
|
||||
move 1 from 1 to 4
|
||||
move 3 from 8 to 1
|
||||
move 3 from 1 to 8
|
||||
move 3 from 7 to 8
|
||||
move 15 from 7 to 3
|
||||
move 10 from 8 to 3
|
||||
move 1 from 5 to 7
|
||||
move 1 from 8 to 5
|
||||
move 3 from 9 to 2
|
||||
move 1 from 6 to 4
|
||||
move 2 from 2 to 7
|
||||
move 1 from 2 to 5
|
||||
move 14 from 7 to 9
|
||||
move 1 from 6 to 2
|
||||
move 1 from 7 to 1
|
||||
move 1 from 5 to 4
|
||||
move 3 from 4 to 3
|
||||
move 1 from 7 to 6
|
||||
move 1 from 2 to 7
|
||||
move 1 from 1 to 2
|
||||
move 3 from 9 to 1
|
||||
move 1 from 6 to 2
|
||||
move 2 from 2 to 6
|
||||
move 17 from 3 to 6
|
||||
move 1 from 8 to 3
|
||||
move 1 from 5 to 4
|
||||
move 2 from 7 to 2
|
||||
move 9 from 9 to 8
|
||||
move 1 from 9 to 3
|
||||
move 16 from 3 to 2
|
||||
move 1 from 7 to 5
|
||||
move 5 from 6 to 5
|
||||
move 1 from 1 to 6
|
||||
move 1 from 4 to 1
|
||||
move 1 from 9 to 3
|
||||
move 9 from 8 to 6
|
||||
move 3 from 1 to 5
|
||||
move 1 from 9 to 1
|
||||
move 16 from 2 to 1
|
||||
move 2 from 2 to 7
|
||||
move 2 from 3 to 9
|
||||
move 2 from 7 to 4
|
||||
move 2 from 9 to 3
|
||||
move 3 from 3 to 5
|
||||
move 1 from 4 to 5
|
||||
move 1 from 4 to 2
|
||||
move 1 from 1 to 7
|
||||
move 1 from 7 to 1
|
||||
move 1 from 3 to 6
|
||||
move 2 from 5 to 1
|
||||
move 3 from 6 to 2
|
||||
move 2 from 5 to 8
|
||||
move 8 from 5 to 4
|
||||
move 1 from 5 to 3
|
||||
move 1 from 3 to 2
|
||||
move 1 from 8 to 3
|
||||
move 1 from 3 to 8
|
||||
move 4 from 1 to 7
|
||||
move 9 from 1 to 7
|
||||
move 6 from 1 to 8
|
||||
move 3 from 7 to 4
|
||||
move 7 from 6 to 7
|
||||
move 11 from 4 to 3
|
||||
move 2 from 3 to 8
|
||||
move 8 from 3 to 8
|
||||
move 4 from 6 to 1
|
||||
move 1 from 7 to 4
|
||||
move 2 from 1 to 2
|
||||
move 8 from 7 to 2
|
||||
move 1 from 4 to 8
|
||||
move 10 from 8 to 2
|
||||
move 2 from 6 to 1
|
||||
move 1 from 1 to 4
|
||||
move 1 from 4 to 8
|
||||
move 2 from 1 to 4
|
||||
move 6 from 6 to 5
|
||||
move 1 from 1 to 9
|
||||
move 2 from 6 to 8
|
||||
move 1 from 4 to 5
|
||||
move 1 from 6 to 9
|
||||
move 4 from 8 to 9
|
||||
move 1 from 7 to 1
|
||||
move 6 from 8 to 6
|
||||
move 1 from 6 to 1
|
||||
move 1 from 4 to 9
|
||||
move 2 from 9 to 5
|
||||
move 5 from 5 to 9
|
||||
move 8 from 9 to 5
|
||||
move 2 from 8 to 5
|
||||
move 3 from 6 to 9
|
||||
move 8 from 5 to 7
|
||||
move 5 from 5 to 6
|
||||
move 1 from 9 to 2
|
||||
move 1 from 3 to 1
|
||||
move 1 from 6 to 7
|
||||
move 1 from 5 to 6
|
||||
move 24 from 2 to 4
|
||||
move 3 from 9 to 7
|
||||
move 16 from 4 to 5
|
||||
move 2 from 1 to 3
|
||||
move 12 from 5 to 6
|
||||
move 1 from 9 to 5
|
||||
move 4 from 5 to 9
|
||||
move 1 from 1 to 6
|
||||
move 1 from 5 to 2
|
||||
move 2 from 9 to 8
|
||||
move 1 from 8 to 1
|
||||
move 5 from 4 to 5
|
||||
move 2 from 3 to 5
|
||||
move 1 from 8 to 3
|
||||
move 1 from 1 to 6
|
||||
move 3 from 5 to 7
|
||||
move 1 from 9 to 1
|
||||
move 1 from 2 to 8
|
||||
74
src/Days/D05.hs
Normal file
74
src/Days/D05.hs
Normal file
@@ -0,0 +1,74 @@
|
||||
{-# LANGUAGE ImportQualifiedPost #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Days.D05 where
|
||||
|
||||
import Common
|
||||
import Parse (Parser, digit, number, parsecDay, someLines)
|
||||
|
||||
import Data.Vector (Vector, (!), (//))
|
||||
import Data.Vector qualified as V
|
||||
import Text.Megaparsec (MonadParsec (try), anySingle, between, endBy, sepBy, skipManyTill, (<|>))
|
||||
import Text.Megaparsec.Char (char, letterChar, newline, string)
|
||||
|
||||
type State = Vector String
|
||||
type Instruction = (Int, Int, Int)
|
||||
type Intermediate = (State, [Instruction])
|
||||
|
||||
data CrateMoverModel = CM9000 | CM9001
|
||||
|
||||
stackOn :: String -> [String] -> [String]
|
||||
stackOn row stacks = zipWith (\c l -> if c == ' ' then l else c : l) paddedRow stacks
|
||||
where
|
||||
paddedRow =
|
||||
if length row < length stacks
|
||||
then row ++ replicate (length stacks - length row) ' '
|
||||
else row
|
||||
|
||||
buildStacks :: [String] -> Vector String
|
||||
buildStacks rows = V.fromList $ foldr stackOn emptyStacks rows
|
||||
where
|
||||
numStacks = maximum (map length rows)
|
||||
emptyStacks = replicate numStacks ""
|
||||
|
||||
parser :: Parser Intermediate
|
||||
parser = do
|
||||
stackMatrix <- try crate `sepBy` char ' ' `endBy` newline
|
||||
_ <- skipManyTill anySingle newline *> newline
|
||||
instructions <- someLines instruction
|
||||
return (buildStacks stackMatrix, instructions)
|
||||
where
|
||||
crate =
|
||||
between (char '[') (char ']') letterChar
|
||||
<|> between (char ' ') (char ' ') (char ' ')
|
||||
|
||||
instruction :: Parser Instruction
|
||||
instruction =
|
||||
(,,)
|
||||
<$ string "move "
|
||||
<*> number
|
||||
<* string " from "
|
||||
<*> (pred <$> digit)
|
||||
<* string " to "
|
||||
<*> (pred <$> digit)
|
||||
|
||||
doReverse :: CrateMoverModel -> [a] -> [a]
|
||||
doReverse CM9000 = reverse
|
||||
doReverse CM9001 = id
|
||||
|
||||
move :: CrateMoverModel -> State -> Instruction -> State
|
||||
move model s (c, src, dst) =
|
||||
let
|
||||
(transfer, newSrc) = splitAt c (s ! src)
|
||||
newDst = doReverse model transfer ++ s ! dst
|
||||
in
|
||||
s // [(src, newSrc), (dst, newDst)]
|
||||
|
||||
part1 :: Intermediate -> Vector Char
|
||||
part1 = uncurry ((fmap head .) . foldl (move CM9000))
|
||||
|
||||
part2 :: Intermediate -> Vector Char
|
||||
part2 = uncurry ((fmap head .) . foldl (move CM9001))
|
||||
|
||||
day :: Day
|
||||
day = parsecDay parser (definitive . part1, definitive . part2)
|
||||
@@ -15,6 +15,7 @@ import Days.D01 qualified as D01
|
||||
import Days.D02 qualified as D02
|
||||
import Days.D03 qualified as D03
|
||||
import Days.D04 qualified as D04
|
||||
import Days.D05 qualified as D05
|
||||
|
||||
import Data.Text.IO qualified as T
|
||||
|
||||
@@ -29,4 +30,5 @@ days =
|
||||
, [D02.day]
|
||||
, [D03.day]
|
||||
, [D04.day]
|
||||
, [D05.day]
|
||||
]
|
||||
|
||||
@@ -3,21 +3,26 @@
|
||||
module Parse where
|
||||
|
||||
import Common
|
||||
import Data.Char (digitToInt)
|
||||
import Data.Function ((&))
|
||||
import Data.Text qualified as T
|
||||
import Data.Void
|
||||
import Text.Megaparsec qualified as M
|
||||
import Text.Megaparsec.Char (digitChar)
|
||||
import Text.Megaparsec.Char qualified as MC
|
||||
import Text.Megaparsec.Char.Lexer qualified as MCL
|
||||
import Util (both)
|
||||
|
||||
type Parser = M.Parsec Void T.Text
|
||||
|
||||
someLines :: Parser a -> Parser [a]
|
||||
someLines p = p `M.sepEndBy1` MC.newline
|
||||
|
||||
number :: Parser Int
|
||||
number = MCL.decimal
|
||||
|
||||
type Parser = M.Parsec Void T.Text
|
||||
digit :: Parser Int
|
||||
digit = digitToInt <$> digitChar
|
||||
|
||||
parsecDay ::
|
||||
Parser a ->
|
||||
|
||||
Reference in New Issue
Block a user