day 5
parent
bfcf12a4a5
commit
8b15b5f2c6
@ -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
|
@ -0,0 +1,514 @@
|
||||
[B] [B] [S]
|
||||
[M] [P] [L] [B] [J]
|
||||
[D] [R] [V] [D] [Q] [D]
|
||||
[T] [R] [Z] [H] [H] [G] [C]
|
||||
[P] [W] [J] [B] [J] [F] [J] [S]
|
||||
[N] [S] [Z] [V] [M] [N] [Z] [F] [M]
|
||||
[W] [Z] [H] [D] [H] [G] [Q] [S] [W]
|
||||
[B] [L] [Q] [W] [S] [L] [J] [W] [Z]
|
||||
1 2 3 4 5 6 7 8 9
|
||||
|
||||
move 3 from 5 to 2
|
||||
move 5 from 3 to 1
|
||||
move 4 from 4 to 9
|
||||
move 6 from 1 to 4
|
||||
move 6 from 8 to 7
|
||||
move 5 from 2 to 7
|
||||
move 1 from 5 to 4
|
||||
move 11 from 9 to 7
|
||||
move 1 from 1 to 9
|
||||
move 6 from 4 to 6
|
||||
move 12 from 6 to 7
|
||||
move 1 from 9 to 2
|
||||
move 2 from 4 to 6
|
||||
move 1 from 8 to 9
|
||||
move 1 from 9 to 4
|
||||
move 1 from 6 to 1
|
||||
move 2 from 7 to 5
|
||||
move 2 from 6 to 7
|
||||
move 2 from 1 to 6
|
||||
move 2 from 4 to 7
|
||||
move 1 from 5 to 4
|
||||
move 1 from 5 to 6
|
||||
move 1 from 6 to 1
|
||||
move 1 from 1 to 3
|
||||
move 1 from 4 to 1
|
||||
move 1 from 1 to 4
|
||||
move 1 from 4 to 5
|
||||
move 1 from 3 to 9
|
||||
move 1 from 5 to 1
|
||||
move 4 from 2 to 1
|
||||
move 20 from 7 to 8
|
||||
move 24 from 7 to 3
|
||||
move 3 from 6 to 4
|
||||
move 1 from 1 to 9
|
||||
move 1 from 9 to 3
|
||||
move 2 from 1 to 2
|
||||
move 2 from 4 to 1
|
||||
move 2 from 2 to 1
|
||||
move 14 from 3 to 6
|
||||
move 6 from 1 to 6
|
||||
move 10 from 3 to 2
|
||||
move 1 from 2 to 3
|
||||
move 6 from 6 to 5
|
||||
move 2 from 3 to 4
|
||||
move 13 from 8 to 4
|
||||
move 1 from 9 to 7
|
||||
move 1 from 6 to 3
|
||||
move 10 from 4 to 2
|
||||
move 1 from 3 to 6
|
||||
move 2 from 8 to 7
|
||||
move 1 from 7 to 2
|
||||
move 11 from 6 to 8
|
||||
move 2 from 6 to 1
|
||||
move 2 from 1 to 3
|
||||
move 1 from 8 to 6
|
||||
move 1 from 3 to 9
|
||||
move 3 from 8 to 2
|
||||
move 1 from 3 to 6
|
||||
move 2 from 6 to 4
|
||||
move 1 from 6 to 5
|
||||
move 11 from 2 to 9
|
||||
move 2 from 4 to 6
|
||||
move 1 from 6 to 1
|
||||
move 1 from 1 to 5
|
||||
move 11 from 2 to 7
|
||||
move 12 from 7 to 5
|
||||
move 1 from 6 to 2
|
||||
move 10 from 8 to 7
|
||||
move 6 from 5 to 3
|
||||
move 4 from 5 to 4
|
||||
move 11 from 9 to 7
|
||||
move 7 from 4 to 9
|
||||
move 4 from 9 to 6
|
||||
move 12 from 7 to 3
|
||||
move 1 from 8 to 9
|
||||
move 1 from 5 to 1
|
||||
move 1 from 1 to 2
|
||||
move 1 from 6 to 9
|
||||
move 3 from 4 to 1
|
||||
move 1 from 9 to 7
|
||||
move 8 from 7 to 2
|
||||
move 3 from 6 to 1
|
||||
move 8 from 2 to 3
|
||||
move 1 from 7 to 4
|
||||
move 2 from 7 to 2
|
||||
move 1 from 5 to 2
|
||||
move 8 from 5 to 1
|
||||
move 3 from 9 to 6
|
||||
move 1 from 6 to 2
|
||||
move 1 from 4 to 5
|
||||
move 1 from 5 to 4
|
||||
move 2 from 9 to 3
|
||||
move 1 from 8 to 6
|
||||
move 1 from 4 to 5
|
||||
move 1 from 5 to 1
|
||||
move 1 from 6 to 8
|
||||
move 1 from 8 to 1
|
||||
move 7 from 1 to 5
|
||||
move 11 from 3 to 7
|
||||
move 1 from 1 to 9
|
||||
move 4 from 2 to 1
|
||||
move 5 from 1 to 3
|
||||
move 1 from 5 to 9
|
||||
move 1 from 6 to 3
|
||||
move 6 from 2 to 1
|
||||
move 5 from 7 to 3
|
||||
move 1 from 6 to 8
|
||||
move 1 from 8 to 4
|
||||
move 6 from 7 to 9
|
||||
move 4 from 9 to 8
|
||||
move 2 from 8 to 9
|
||||
move 2 from 5 to 8
|
||||
move 13 from 3 to 7
|
||||
move 1 from 3 to 8
|
||||
move 2 from 1 to 9
|
||||
move 3 from 1 to 5
|
||||
move 1 from 4 to 1
|
||||
move 6 from 5 to 9
|
||||
move 8 from 9 to 8
|
||||
move 2 from 7 to 3
|
||||
move 1 from 9 to 7
|
||||
move 1 from 5 to 2
|
||||
move 5 from 9 to 8
|
||||
move 1 from 8 to 7
|
||||
move 1 from 2 to 9
|
||||
move 7 from 1 to 2
|
||||
move 4 from 7 to 5
|
||||
move 6 from 2 to 3
|
||||
move 1 from 2 to 1
|
||||
move 10 from 8 to 9
|
||||
move 3 from 8 to 9
|
||||
move 4 from 5 to 1
|
||||
move 2 from 8 to 6
|
||||
move 9 from 9 to 8
|
||||
move 1 from 9 to 6
|
||||
move 8 from 8 to 4
|
||||
move 12 from 3 to 5
|
||||
move 1 from 4 to 2
|
||||
move 3 from 8 to 1
|
||||
move 3 from 9 to 7
|
||||
move 1 from 3 to 2
|
||||
move 1 from 6 to 9
|
||||
move 8 from 3 to 8
|
||||
move 6 from 4 to 5
|
||||
move 1 from 7 to 6
|
||||
move 1 from 8 to 1
|
||||
move 6 from 8 to 7
|
||||
move 1 from 3 to 6
|
||||
move 7 from 1 to 5
|
||||
move 1 from 4 to 9
|
||||
move 4 from 6 to 5
|
||||
move 13 from 7 to 5
|
||||
move 1 from 8 to 2
|
||||
move 2 from 9 to 3
|
||||
move 4 from 7 to 2
|
||||
move 1 from 3 to 8
|
||||
move 1 from 3 to 4
|
||||
move 4 from 1 to 2
|
||||
move 1 from 5 to 7
|
||||
move 23 from 5 to 6
|
||||
move 1 from 8 to 6
|
||||
move 1 from 9 to 4
|
||||
move 5 from 2 to 6
|
||||
move 1 from 4 to 9
|
||||
move 1 from 9 to 3
|
||||
move 1 from 7 to 8
|
||||
move 1 from 4 to 3
|
||||
move 1 from 3 to 7
|
||||
move 1 from 7 to 5
|
||||
move 1 from 8 to 7
|
||||
move 12 from 6 to 1
|
||||
move 1 from 2 to 5
|
||||
move 1 from 3 to 1
|
||||
move 20 from 5 to 2
|
||||
move 14 from 2 to 4
|
||||
move 11 from 2 to 6
|
||||
move 1 from 7 to 8
|
||||
move 13 from 1 to 8
|
||||
move 9 from 8 to 4
|
||||
move 3 from 8 to 6
|
||||
move 10 from 6 to 8
|
||||
move 6 from 6 to 4
|
||||
move 4 from 8 to 5
|
||||
move 26 from 4 to 2
|
||||
move 2 from 5 to 2
|
||||
move 5 from 8 to 1
|
||||
move 1 from 8 to 3
|
||||
move 2 from 1 to 3
|
||||
move 2 from 3 to 7
|
||||
move 27 from 2 to 7
|
||||
move 2 from 8 to 1
|
||||
move 1 from 3 to 7
|
||||
move 6 from 6 to 2
|
||||
move 4 from 6 to 1
|
||||
move 4 from 6 to 4
|
||||
move 2 from 5 to 4
|
||||
move 4 from 2 to 1
|
||||
move 3 from 1 to 8
|
||||
move 1 from 2 to 8
|
||||
move 8 from 4 to 3
|
||||
move 1 from 2 to 8
|
||||
move 5 from 8 to 6
|
||||
move 1 from 4 to 2
|
||||
move 1 from 2 to 1
|
||||
move 6 from 3 to 1
|
||||
move 13 from 7 to 1
|
||||
move 1 from 2 to 8
|
||||
move 1 from 8 to 2
|
||||
move 1 from 6 to 2
|
||||
move 1 from 2 to 8
|
||||
move 1 from 8 to 2
|
||||
move 14 from 7 to 1
|
||||
move 5 from 6 to 3
|
||||
move 2 from 3 to 1
|
||||
move 3 from 3 to 2
|
||||
move 3 from 7 to 4
|
||||
move 1 from 4 to 9
|
||||
move 1 from 9 to 7
|
||||
move 2 from 3 to 6
|
||||
move 5 from 2 to 7
|
||||
move 1 from 7 to 6
|
||||
move 5 from 7 to 6
|
||||
move 2 from 6 to 7
|
||||
move 1 from 6 to 8
|
||||
move 1 from 4 to 7
|
||||
move 4 from 6 to 9
|
||||
move 35 from 1 to 8
|
||||
move 3 from 7 to 2
|
||||
move 1 from 2 to 5
|
||||
move 24 from 8 to 3
|
||||
move 1 from 5 to 8
|
||||
move 13 from 3 to 6
|
||||
move 2 from 2 to 6
|
||||
move 6 from 6 to 4
|
||||
move 11 from 1 to 6
|
||||
move 12 from 6 to 1
|
||||
move 1 from 8 to 1
|
||||
move 2 from 1 to 3
|
||||
move 5 from 4 to 1
|
||||
move 1 from 6 to 4
|
||||
move 1 from 8 to 3
|
||||
move 13 from 3 to 9
|
||||
move 3 from 8 to 2
|
||||
move 3 from 2 to 7
|
||||
move 1 from 3 to 6
|
||||
move 3 from 7 to 8
|
||||
move 14 from 1 to 3
|
||||
move 1 from 1 to 9
|
||||
move 6 from 3 to 8
|
||||
move 17 from 8 to 6
|
||||
move 1 from 3 to 7
|
||||
move 1 from 7 to 8
|
||||
move 26 from 6 to 7
|
||||
move 1 from 1 to 9
|
||||
move 3 from 4 to 1
|
||||
move 2 from 3 to 8
|
||||
move 1 from 8 to 4
|
||||
move 14 from 9 to 7
|
||||
move 12 from 7 to 3
|
||||
move 2 from 1 to 4
|
||||
move 2 from 7 to 8
|
||||
move 2 from 8 to 3
|
||||
move 4 from 9 to 8
|
||||
move 1 from 4 to 7
|
||||
move 1 from 1 to 3
|
||||
move 2 from 4 to 2
|
||||
move 24 from 7 to 6
|
||||
move 1 from 8 to 1
|
||||
move 1 from 7 to 2
|
||||
move 1 from 7 to 9
|
||||
move 3 from 2 to 9
|
||||
move 1 from 1 to 6
|
||||
move 5 from 8 to 2
|
||||
move 5 from 3 to 4
|
||||
move 1 from 2 to 5
|
||||
move 3 from 9 to 8
|
||||
move 2 from 4 to 9
|
||||
move 16 from 6 to 3
|
||||
move 14 from 3 to 8
|
||||
move 1 from 7 to 9
|
||||
move 8 from 6 to 9
|
||||
move 4 from 8 to 5
|
||||
move 8 from 8 to 3
|
||||
move 1 from 5 to 8
|
||||
move 1 from 2 to 4
|
||||
move 4 from 8 to 7
|
||||
move 1 from 5 to 6
|
||||
move 12 from 9 to 5
|
||||
move 15 from 5 to 8
|
||||
move 1 from 6 to 1
|
||||
move 2 from 2 to 6
|
||||
move 3 from 4 to 2
|
||||
move 4 from 2 to 7
|
||||
move 8 from 7 to 3
|
||||
move 1 from 1 to 4
|
||||
move 3 from 6 to 9
|
||||
move 16 from 8 to 3
|
||||
move 3 from 9 to 4
|
||||
move 1 from 8 to 9
|
||||
move 2 from 9 to 4
|
||||
move 24 from 3 to 8
|
||||
move 19 from 8 to 7
|
||||
move 2 from 8 to 7
|
||||
move 7 from 4 to 5
|
||||
move 13 from 7 to 5
|
||||
move 4 from 7 to 8
|
||||
move 7 from 8 to 1
|
||||
move 3 from 5 to 3
|
||||
move 3 from 7 to 2
|
||||
move 1 from 1 to 4
|
||||
move 1 from 7 to 2
|
||||
move 3 from 2 to 4
|
||||
move 8 from 3 to 1
|
||||
move 11 from 1 to 3
|
||||
move 12 from 3 to 4
|
||||
move 1 from 2 to 5
|
||||
move 18 from 3 to 8
|
||||
move 3 from 1 to 9
|
||||
move 1 from 3 to 5
|
||||
move 15 from 5 to 4
|
||||
move 4 from 5 to 1
|
||||
move 23 from 4 to 6
|
||||
move 3 from 1 to 6
|
||||
move 13 from 8 to 3
|
||||
move 25 from 6 to 2
|
||||
move 1 from 9 to 5
|
||||
move 5 from 3 to 8
|
||||
move 17 from 2 to 8
|
||||
move 4 from 4 to 1
|
||||
move 1 from 9 to 7
|
||||
move 5 from 2 to 6
|
||||
move 2 from 2 to 4
|
||||
move 1 from 9 to 4
|
||||
move 6 from 3 to 9
|
||||
move 16 from 8 to 3
|
||||
move 2 from 1 to 8
|
||||
move 1 from 7 to 4
|
||||
move 5 from 4 to 7
|
||||
move 1 from 5 to 3
|
||||
move 2 from 7 to 1
|
||||
move 9 from 8 to 4
|
||||
move 3 from 7 to 2
|
||||
move 2 from 8 to 3
|
||||
move 10 from 4 to 1
|
||||
move 1 from 2 to 3
|
||||
move 5 from 3 to 7
|
||||
move 2 from 8 to 9
|
||||
move 2 from 9 to 8
|
||||
move 1 from 2 to 1
|
||||
move 3 from 9 to 6
|
||||
move 2 from 2 to 8
|
||||
move 4 from 7 to 3
|
||||
move 4 from 8 to 6
|
||||
move 1 from 7 to 1
|
||||
move 1 from 4 to 8
|
||||
move 4 from 3 to 4
|
||||
move 4 from 4 to 2
|
||||
move 6 from 1 to 2
|
||||
move 1 from 4 to 3
|
||||
move 5 from 3 to 8
|
||||
move 6 from 3 to 8
|
||||
move 2 from 2 to 8
|
||||
move 3 from 2 to 9
|
||||
move 8 from 1 to 6
|
||||
move 3 from 2 to 7
|
||||
move 2 from 7 to 2
|
||||
move 13 from 6 to 5
|
||||
move 7 from 5 to 9
|
||||
move 3 from 2 to 7
|
||||
move 1 from 2 to 9
|
||||
move 2 from 5 to 2
|
||||
move 3 from 8 to 5
|
||||
move 5 from 3 to 4
|
||||
move 2 from 2 to 1
|
||||
move 9 from 8 to 7
|
||||
move 1 from 1 to 8
|
||||
move 6 from 5 to 2
|
||||
move 4 from 2 to 8
|
||||
move 4 from 7 to 1
|
||||
move 1 from 2 to 6
|
||||
move 5 from 1 to 6
|
||||
move 1 from 8 to 2
|
||||
move 1 from 2 to 9
|
||||
move 13 from 6 to 5
|
||||
move 2 from 7 to 2
|
||||
move 1 from 8 to 7
|
||||
move 4 from 4 to 7
|
||||
move 1 from 4 to 1
|
||||
move 4 from 8 to 4
|
||||
move 6 from 5 to 9
|
||||
move 2 from 1 to 4
|
||||
move 1 from 8 to 6
|
||||
move 11 from 9 to 5
|
||||
move 1 from 7 to 8
|
||||
move 1 from 8 to 1
|
||||
move 1 from 1 to 3
|
||||
move 6 from 4 to 8
|
||||
move 1 from 8 to 4
|
||||
move 1 from 1 to 6
|
||||
move 6 from 9 to 7
|
||||
move 1 from 4 to 5
|
||||
move 3 from 2 to 1
|
||||
move 1 from 8 to 2
|
||||
move 1 from 3 to 2
|
||||
move 20 from 5 to 6
|
||||
move 3 from 1 to 6
|
||||
move 2 from 2 to 9
|
||||
move 3 from 8 to 3
|
||||
move 5 from 3 to 8
|
||||
move 1 from 1 to 6
|
||||
move 2 from 8 to 9
|
||||
move 7 from 9 to 5
|
||||
move 3 from 5 to 4
|
||||
move 3 from 8 to 3
|
||||
move 9 from 7 to 9
|
||||
move 1 from 8 to 5
|
||||
move 7 from 7 to 9
|
||||
move 2 from 5 to 2
|
||||
move 9 from 9 to 2
|
||||
move 1 from 7 to 3
|
||||
move 2 from 9 to 1
|
||||
move 2 from 5 to 9
|
||||
move 2 from 1 to 4
|
||||
move 2 from 3 to 7
|
||||
move 18 from 6 to 7
|
||||
move 7 from 9 to 1
|
||||
move 7 from 6 to 8
|
||||
move 4 from 4 to 9
|
||||
move 4 from 8 to 3
|
||||
move 2 from 8 to 2
|
||||
move 1 from 8 to 5
|
||||
move 1 from 4 to 7
|
||||
move 1 from 5 to 1
|
||||
move 2 from 9 to 3
|
||||
move 12 from 2 to 5
|
||||
move 6 from 5 to 6
|
||||
move 5 from 7 to 2
|
||||
move 3 from 6 to 4
|
||||
move 1 from 4 to 7
|
||||
move 1 from 4 to 1
|
||||
move 2 from 5 to 8
|
||||
move 1 from 8 to 2
|
||||
move 2 from 9 to 7
|
||||
move 8 from 1 to 8
|
||||
move 11 from 7 to 1
|
||||
move 5 from 8 to 2
|
||||
move 7 from 7 to 5
|
||||
move 1 from 9 to 4
|
||||
move 1 from 7 to 5
|
||||
move 7 from 5 to 7
|
||||
move 2 from 6 to 1
|
||||
move 1 from 8 to 2
|
||||
move 12 from 1 to 7
|
||||
move 2 from 1 to 2
|
||||
move 3 from 8 to 5
|
||||
move 3 from 5 to 2
|
||||
move 8 from 7 to 3
|
||||
move 1 from 3 to 1
|
||||
move 3 from 6 to 4
|
||||
move 4 from 5 to 6
|
||||
move 14 from 2 to 9
|
||||
move 3 from 6 to 9
|
||||
move 3 from 4 to 2
|
||||
move 1 from 1 to 7
|
||||
move 1 from 7 to 1
|
||||
move 3 from 3 to 5
|
||||
move 8 from 7 to 4
|
||||
move 1 from 5 to 9
|
||||
move 3 from 2 to 4
|
||||
move 1 from 3 to 4
|
||||
move 4 from 2 to 6
|
||||
move 2 from 6 to 7
|
||||
move 3 from 5 to 4
|
||||
move 16 from 4 to 1
|
||||
move 7 from 9 to 8
|
||||
move 1 from 5 to 1
|
||||
move 3 from 7 to 9
|
||||
move 3 from 9 to 4
|
||||
move 7 from 1 to 7
|
||||
move 6 from 7 to 1
|
||||
move 5 from 3 to 1
|
||||
move 11 from 9 to 2
|
||||
move 3 from 4 to 6
|
||||
move 9 from 2 to 8
|
||||
move 6 from 3 to 5
|
||||
move 2 from 8 to 6
|
||||
move 5 from 5 to 3
|
||||
move 2 from 7 to 1
|
||||
move 3 from 3 to 9
|
||||
move 1 from 2 to 4
|
||||
move 1 from 5 to 1
|
||||
move 13 from 1 to 2
|
||||
move 5 from 8 to 6
|
||||
move 2 from 3 to 9
|
||||
move 2 from 4 to 7
|
||||
move 5 from 6 to 9
|
||||
move 7 from 9 to 1
|
||||
move 3 from 7 to 2
|
||||
move 6 from 8 to 6
|
||||
move 5 from 6 to 2
|
||||
move 2 from 8 to 3
|
||||
move 2 from 9 to 4
|
||||
move 6 from 2 to 5
|
||||
move 1 from 3 to 7
|
@ -0,0 +1,115 @@
|
||||
module Day5Lib
|
||||
( Crate (..),
|
||||
Command (..),
|
||||
crate,
|
||||
crateOrNothing,
|
||||
crateRow,
|
||||
crateNumbers,
|
||||
command,
|
||||
transposeRows,
|
||||
--
|
||||
processInput1,
|
||||
processInput2,
|
||||
)
|
||||
where
|
||||
|
||||
-- import Text.ParserCombinators.Parsec
|
||||
import Debug.Trace
|
||||
import Text.Parsec
|
||||
|
||||
newtype Crate = Crate Char deriving (Show, Eq)
|
||||
|
||||
data Command = Command
|
||||
{ cnt :: Int,
|
||||
from :: Int,
|
||||
to :: Int
|
||||
}
|
||||
deriving (Show, Eq)
|
||||
|
||||
crate :: Parsec String () Crate
|
||||
crate = do
|
||||
char '['
|
||||
crateLabel <- oneOf ['A' .. 'Z']
|
||||
char ']'
|
||||
return $ Crate crateLabel
|
||||
|
||||
nothing = do
|
||||
string " "
|
||||
return Nothing
|
||||
|
||||
crateOrNothing :: Parsec String () (Maybe Crate)
|
||||
crateOrNothing = nothing <|> (crate >>= return . return)
|
||||
|
||||
crateRow :: Parsec String () [Maybe Crate]
|
||||
crateRow = do
|
||||
c <- crateOrNothing `sepBy1` (char ' ')
|
||||
char '\n'
|
||||
return c
|
||||
|
||||
crateNumbers :: Parsec String () ()
|
||||
crateNumbers = do
|
||||
char ' '
|
||||
oneOf ['1' .. '9'] `sepBy1` try (string " ")
|
||||
char ' '
|
||||
char '\n'
|
||||
return ()
|
||||
|
||||
command :: Parsec String () Command
|
||||
command = do
|
||||
string "move "
|
||||
countS <- many $ oneOf ['0' .. '9']
|
||||
char ' '
|
||||
string "from "
|
||||
from <- many $ oneOf ['0' .. '9']
|
||||
char ' '
|
||||
string "to "
|
||||
to <- many $ oneOf ['0' .. '9']
|
||||
-- char '\n'
|
||||
return Command {cnt = read countS, from = read from - 1, to = read to - 1}
|
||||
|
||||
taskFile = do
|
||||
crateRows <- many (try crateRow)
|
||||
crateNumbers
|
||||
char '\n'
|
||||
commands <- sepBy command (char '\n')
|
||||
eof
|
||||
return (transposeRows crateRows, commands)
|
||||
|
||||
transposeRows :: [[Maybe Crate]] -> [[Crate]]
|
||||
transposeRows = foldr applyRow (repeat [])
|
||||
|
||||
applyRow :: [Maybe Crate] -> [[Crate]] -> [[Crate]]
|
||||
applyRow (Nothing : ow) (s : tacks) = s : (applyRow ow tacks)
|
||||
applyRow ((Just c) : ow) (s : tacks) = (c : s) : (applyRow ow tacks)
|
||||
applyRow [] stacks = []
|
||||
applyRow _ [] = error "stacks error"
|
||||
|
||||
applyCommand1 :: [[Crate]] -> Command -> [[Crate]]
|
||||
applyCommand1 crates cmd = last . take (cnt cmd + 1) . iterate applyThisMove $ crates
|
||||
where
|
||||
applyThisMove = applyMove 1 (from cmd) (to cmd)
|
||||
|
||||
applyCommand :: [[Crate]] -> Command -> [[Crate]]
|
||||
applyCommand crates cmd = applyMove (cnt cmd) (from cmd) (to cmd) crates
|
||||
|
||||
applyMove :: Int -> Int -> Int -> [[Crate]] -> [[Crate]]
|
||||
applyMove cnt from to crates =
|
||||
let (lf, f : rf) = splitAt from crates
|
||||
(lt, t : rt) = splitAt to (lf ++ (drop cnt f) : rf)
|
||||
in lt ++ ((take cnt f) ++ t) : rt
|
||||
|
||||
-- ####################
|
||||
|
||||
processInput1 :: String -> String
|
||||
processInput1 input =
|
||||
let (crates, commands) = case parse taskFile "" input of
|
||||
Left e -> error (show e)
|
||||
Right p -> p
|
||||
in map ((\(Crate a) -> a) . head) $ foldl applyCommand1 crates commands
|
||||
|
||||
processInput2 :: String -> String
|
||||
processInput2 input =
|
||||
let (crates, commands) = case parse taskFile "" input of
|
||||
Left e -> error (show e)
|
||||
Right p -> p
|
||||
in map ((\(Crate a) -> a) . head) $ foldl applyCommand crates commands
|
@ -0,0 +1,41 @@
|
||||
import Day5Lib (processInput1, processInput2)
|
||||
import System.IO
|
||||
import Test.HUnit
|
||||
|
||||
testCases1 =
|
||||
[ ("data/input050.txt", "CMZ"),
|
||||
("data/input051.txt", "MQSHJMWNH")
|
||||
]
|
||||
|
||||
testCase1 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput1 contents
|
||||
)
|
||||
|
||||
testCases2 =
|
||||
[ ("data/input050.txt", "MCD"),
|
||||
("data/input051.txt", "LLWJRBHVZ")
|
||||
]
|
||||
|
||||
testCase2 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput2 contents
|
||||
)
|
||||
|
||||
tests =
|
||||
TestList $
|
||||
[TestCase (testCase1 c) | c <- testCases1]
|
||||
++ [TestCase (testCase2 c) | c <- testCases2]
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
runTestTT tests
|
||||
return ()
|
@ -0,0 +1,89 @@
|
||||
import Day5Lib
|
||||
import Test.HUnit
|
||||
import Text.Parsec
|
||||
|
||||
-- trange = TestCase (assertEqual "1-2" (Range (1,2)) $ parseRange "1-2")
|
||||
-- trangel = TestCase (assertEqual "131231-215562" (Range (131231,215562)) $ parseRange "1-2")
|
||||
|
||||
-- trow = TestCase (assertEqual "1-2,3-4" [Range (1,2), Range(3,4)] $ parseRow "1-2,3-4")
|
||||
-- trowl = TestCase (assertEqual "1-2,3-4" [Range (1,2), Range(34524,62345)] $ parseRow "1-2,34524-62345")
|
||||
|
||||
tParseCrate = TestCase $ assertEqual "parse crate" (Right (Crate 'A')) (parse crate "" "[A]")
|
||||
|
||||
tParseCrateOrNothing1 =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"parse crate or nothing: crate"
|
||||
(Right (Just (Crate 'A')))
|
||||
(parse crateOrNothing "" "[A]")
|
||||
|
||||
tParseCrateOrNothing2 =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"parse crate or nothing: nothing"
|
||||
(Right Nothing)
|
||||
(parse crateOrNothing "" " ")
|
||||
|
||||
tCrateRow =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"parse row"
|
||||
(Right [Nothing, Just (Crate 'D'), Nothing])
|
||||
(parse crateRow "" " [D] \n")
|
||||
|
||||
tNumberRow =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"number row"
|
||||
(Right ())
|
||||
(parse crateNumbers " " " 1 2 3 \n")
|
||||
|
||||
tCommand1 =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"command"
|
||||
(Right Command {cnt = 1, from = 0, to = 1})
|
||||
(parse command " " "move 1 from 1 to 2\n")
|
||||
|
||||
tCommand2 =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"command"
|
||||
(Right Command {cnt = 1, from = 0, to = 1})
|
||||
(parse command " " "move 1 from 1 to 2")
|
||||
|
||||
tStackBuild1 =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"stack build"
|
||||
[[], [Crate 'D'], []]
|
||||
(transposeRows [[Nothing, Just (Crate 'D'), Nothing]])
|
||||
|
||||
tStackBuild2 =
|
||||
TestCase $
|
||||
assertEqual
|
||||
"stack build"
|
||||
[[Crate 'A'], [Crate 'D', Crate 'B'], [Crate 'C']]
|
||||
( transposeRows
|
||||
[ [Nothing, Just (Crate 'D'), Nothing],
|
||||
[Just (Crate 'A'), Just (Crate 'B'), Just (Crate 'C')]
|
||||
]
|
||||
)
|
||||
|
||||
tests =
|
||||
TestList $
|
||||
[ tParseCrate,
|
||||
tParseCrateOrNothing1,
|
||||
tParseCrateOrNothing2,
|
||||
tCrateRow,
|
||||
tNumberRow,
|
||||
tCommand1,
|
||||
tCommand2,
|
||||
tStackBuild1,
|
||||
tStackBuild2
|
||||
]
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
runTestTT tests
|
||||
return ()
|
Loading…
Reference in New Issue