view 11/11.jl @ 16:a255c0d4996b

Day 11 part 1
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 13 Dec 2022 22:05:35 +0100
parents
children fc0bae3dddac
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, floor(it_));
                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);