aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/05/solver.jl
blob: 78ff27e66bea7935e034349caf9874479e65108c (plain)
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