diff options
Diffstat (limited to 'AoC2022/05/solver.jl')
-rw-r--r-- | AoC2022/05/solver.jl | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/AoC2022/05/solver.jl b/AoC2022/05/solver.jl new file mode 100644 index 0000000..78ff27e --- /dev/null +++ b/AoC2022/05/solver.jl @@ -0,0 +1,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 |