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