Day 14
file:test/Day14Spec.jl
# add tests
file:src/Day14.jl
module Day14
using ..Monads
using ..Parsing
struct Robot
::NTuple{2,Int}
p::NTuple{2,Int}
vend
@kwdef struct Box
::NTuple{2,Int} = (101, 103)
sizeend
position(r::Robot) = r.p
Broadcast.broadcastable(m::Box) = Ref(m)
function quadrant(b::Box, p::NTuple{2,Int})
= b.size .รท 2
middle 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})
= zeros(Int, 5)
counts = v .|> (r->r.p)
positions @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)
= fmap(splat(Robot),sequence(
line_p 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