From 84ec86b63ac38423ce021448e379b87094f7d4ac Mon Sep 17 00:00:00 2001 From: Oscar Najera Date: Sat, 28 Jan 2023 03:46:12 +0100 Subject: more julia and formatted --- AoC2022/05/solver.jl | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 AoC2022/05/solver.jl (limited to 'AoC2022/05') 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 -- cgit v1.2.3