1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
using Test
function parse_input()
stacks, instruct = open(f -> split(read(f, String), "\n\n"), "input")
stacks_reversed = reverse(split(stacks, "\n"))
number = parse.(Int, eachsplit(stacks_reversed[1]))
crates = Dict(i => Char[] for i ∈ number)
for line ∈ stacks_reversed[2:end]
for (i, c) ∈ enumerate(line[2:4:end])
if c != ' '
push!(crates[i], c)
end
end
end
instruction_regex = r"move (\d+) from (\d+) to (\d+)"
crates,
map(
l -> parse.(Int, match(instruction_regex, l).captures),
eachsplit(instruct, "\n", keepempty = false),
)
end
function single_move!(crates, amount, from, to)
for _ = 1:amount
push!(crates[to], pop!(crates[from]))
end
end
function bulk_move!(crates, amount, from, to)
l = length(crates[from])
push!(crates[to], splice!(crates[from], l-amount+1:l)...)
end
function solution(mover)
crates, instructions = parse_input()
for inst ∈ instructions
mover(crates, inst...)
end
join(crates[i][end] for i ∈ sort(collect(keys(crates))))
end
@testset "solution" begin
@test solution(single_move!) == "TPGVQPFDH"
@test solution(bulk_move!) == "DMRDFRHHH"
end
|