Mercurial > lbo > hg > aoc22
view 2022/11/11.jl @ 76:2d05d3e059ce
Day 17 Part 1: Visualize trace
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 31 Dec 2023 09:21:55 +0100 |
parents | 05ddc45b4210 |
children |
line wrap: on
line source
const test_input = "11/test_input.txt"; struct Monkey items::Vector{Int} operation::Function test::Function iftrue::Int iffalse::Int end function test_init_monkeys()::Vector{Monkey} # Manual parsing is easier for small numbers of monkeys. [Monkey([79, 98], o -> o*19, i -> i%23 == 0, 2, 3), Monkey([54, 65, 75, 74], o -> o+6, i -> i%19 == 0, 2, 0), Monkey([79, 60, 97], o -> o*o, i -> i%13 == 0, 1, 3), Monkey([74], o -> o+3, i -> i%17 == 0, 0, 1)] end function test_monkeys()::Vector{Monkey} [Monkey([72,97], o->o*13, i->i%19==0, 5, 6), Monkey([55, 70, 90, 74, 95], o->o*o, i->i%7==0, 5, 0), Monkey([74, 97, 66, 57], o->o+6, i->i%17==0, 1, 0), Monkey([86, 54, 53], o->o+2, i->i%13==0, 1, 2), Monkey([50, 65, 78, 50, 62, 99], o->o+3, i->i%11==0, 3, 7), Monkey([90], o->o+4, i->i%2==0, 4, 6), Monkey([88, 92, 63, 94, 96, 82, 53, 53], o->o+8, i->i%5==0, 4, 7), Monkey([70, 60, 71, 69, 77, 70, 98], o->o*7, i->i%3==0, 2, 3)] end function engine(init::Vector{Monkey}; rounds=20)::Vector{Monkey} activity = zeros(Int, length(init)); for r = 1:rounds #@show r for (i,m) in enumerate(init) #@show i while length(m.items) > 0 activity[i] += 1; it = pop!(m.items); it_ = m.operation(it); it__ = round(Int, it_%(19*7*17*13*11*2*5*3)); t = m.test(it__); #println("Inspect item of worry level $it\nNew worry level is $it_\nWorry level div. by 3 is $it__\nThrow item to $(t ? m.iftrue+1 : m.iffalse+1)"); if t @assert m.iftrue+1 != i push!(init[m.iftrue+1].items, it__); else @assert m.iffalse+1 != i push!(init[m.iffalse+1].items, it__); end end end if r % 1000 == 0 || r == 20 println(r, " ", activity); end end println(activity, " ", prod(sort(activity)[end-1:end])); init end engine(test_init_monkeys(); rounds=10000);