Advent of Code 2024

thoughts and solutions

 

Day 14

file:test/Day14Spec.jl
# add tests
file:src/Day14.jl
module Day14

using ..Monads
using ..Parsing

struct Robot
    p::NTuple{2,Int}
    v::NTuple{2,Int}
end

@kwdef struct Box
    size::NTuple{2,Int} = (101, 103)
end

position(r::Robot) = r.p

Broadcast.broadcastable(m::Box) = Ref(m)

function quadrant(b::Box, p::NTuple{2,Int})
    middle = b.size .รท 2
    any(p .== middle) && return 0
    sum((p .< middle) .* (1, 2)) + 1
end

quadrant(b::Box) = Base.Fix1(quadrant, b)

move(b::Box, dt::Int, r::Robot) =
    Robot(mod.(r.p .+ dt .* r.v, b.size), r.v)

function safety_factor(b::Box, v::Vector{Robot})
    counts = zeros(Int, 5)
    positions = v .|> (r->r.p)
    @views counts[quadrant.(b, positions) .+ 1] .+= 1
    reduce(*, counts[2:end])
end

function part1(input::Vector{Robot})
    box = Box()
    safety_factor(box, move.(box, 100, input))
end

function read_input(io::IO)
    line_p = fmap(splat(Robot),sequence(
        token(sequence(
            match_p("p=") >>> integer_p,
            match_p(",") >>> integer_p)),
        token(sequence(
            match_p("v=") >>> integer_p,
            match_p(",") >>> integer_p))))
    readlines(io) .|> parse(line_p) .|> result
end

function main(io::IO)
    return nothing
end

end