Day 22
file:test/Day22Spec.jl
# add tests
file:src/Day22.jl
module Day22
using .Iterators: drop, peel, take
jumble(n) = x -> (x ⊻ (x << n)) % 16777216
next_secret(x) = x |> jumble(6) |> jumble(-5) |> jumble(11)
struct Seed
::UInt64
xend
tee(x::T) where {T} = (x, x)
Base.iterate(s::Seed) = tee(s.x)
Base.iterate(::Seed, s::UInt64) = tee(next_secret(s))
Base.IteratorSize(::Seed) = Base.IsInfinite()
Base.IteratorEltype(::Type{Seed}) = Base.HasEltype()
Base.eltype(::Type{Seed}) = UInt64
get_2000th(n::UInt64) = drop(Seed(n), 2000) |> peel |> first |> Int
last_digit(n::UInt64) = Int(n % 10)
sliding_window(vec::AbstractVector, n) =
@view vec[i:i+n-1]) for i in 1:length(vec)-n+1)
((
function count_bananas_fstyle(input::Vector{UInt64})
= zeros(Int, 19^4)
bananas = falses(19^4)
vs = Vector{Int}(undef, 2000)
ns = Vector{Int}(undef, 1999)
d for s in input
.= false
vs 1] = s % 10
ns[for i in 1:1999
= next_secret(s)
s +1] = s % 10
ns[i= ns[i+1] - ns[i] .+ 9
d[i] end
for i = 5:2000
= ((d[i-4]*19 + d[i-3])*19 + d[i-2]) * 19 + d[i-1] + 1
idx if !vs[idx]
= true
vs[idx] += ns[i]
bananas[idx] end
end
end
return bananas
end
function count_bananas(input::Vector{UInt64})
= zeros(Int, 19, 19, 19, 19)
bananas = falses(19, 19, 19, 19)
vs for seed in input
.= false
vs = take(Seed(seed), 2000) .|> last_digit
ns = ns[2:end] .- ns[1:end-1] .+ 10
ds for (seq, n) in zip(sliding_window(ds, 4), ns[5:end])
= CartesianIndex(seq[1], seq[2], seq[3], seq[4])
idx if !vs[idx]
= true
vs[idx] += n
bananas[idx] end
end
end
= findmax(bananas)
n, seq = Tuple(seq) .- 10
seq return seq, n
end
function read_input(io::IO)
readlines(io) .|> s -> parse(UInt64, s)
end
function main(io::IO)
return nothing
end
end