|
|
|
@ -55,11 +55,16 @@ function read_monkeys(infile)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function simian_shenanigans(monkeys :: Vector{Monkey})
|
|
|
|
function simian_shenanigans(monkeys :: Vector{Monkey}; part=1)
|
|
|
|
|
|
|
|
modulus = prod(m.test_divisor for m in monkeys)
|
|
|
|
for m in monkeys
|
|
|
|
for m in monkeys
|
|
|
|
for item in m.items
|
|
|
|
for item in m.items
|
|
|
|
new_value = m.op(item, m.op_value)
|
|
|
|
new_value = m.op(item, m.op_value)
|
|
|
|
|
|
|
|
if part == 1
|
|
|
|
new_value = Int(floor(new_value / 3))
|
|
|
|
new_value = Int(floor(new_value / 3))
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
new_value = mod(new_value, modulus)
|
|
|
|
|
|
|
|
end
|
|
|
|
new_monkey = (mod(new_value, m.test_divisor) == 0
|
|
|
|
new_monkey = (mod(new_value, m.test_divisor) == 0
|
|
|
|
? m.test_result[1] : m.test_result[2])
|
|
|
|
? m.test_result[1] : m.test_result[2])
|
|
|
|
push!(monkeys[new_monkey].items, new_value)
|
|
|
|
push!(monkeys[new_monkey].items, new_value)
|
|
|
|
@ -69,18 +74,24 @@ function simian_shenanigans(monkeys :: Vector{Monkey})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function monkey_business(monkeys; rounds=20)
|
|
|
|
function monkey_business(monkeys; rounds=20, part=1)
|
|
|
|
for _ in 1:rounds
|
|
|
|
for _ in 1:rounds
|
|
|
|
simian_shenanigans(monkeys)
|
|
|
|
simian_shenanigans(monkeys, part=part)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return prod(sort([m.inspected for m in monkeys])[end-1:end])
|
|
|
|
return prod(sort([m.inspected for m in monkeys])[end-1:end])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function test()
|
|
|
|
function test()
|
|
|
|
@testset "monkey business" verbose=true begin
|
|
|
|
@testset "monkey business 1" verbose=true begin
|
|
|
|
@test monkey_business(read_monkeys("example.txt")) == 10605
|
|
|
|
@test monkey_business(read_monkeys("example.txt")) == 10605
|
|
|
|
@test monkey_business(read_monkeys("input.txt")) == 64032
|
|
|
|
@test monkey_business(read_monkeys("input.txt")) == 64032
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
@testset "monkey business 2" verbose=true begin
|
|
|
|
|
|
|
|
@test monkey_business(
|
|
|
|
|
|
|
|
read_monkeys("example.txt"), rounds=10000, part=2) == 2713310158
|
|
|
|
|
|
|
|
@test monkey_business(
|
|
|
|
|
|
|
|
read_monkeys("input.txt"), rounds=10000, part=2) == 12729522272
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function main()
|
|
|
|
function main()
|
|
|
|
@ -92,7 +103,12 @@ function main()
|
|
|
|
monkeys = read_monkeys(infile)
|
|
|
|
monkeys = read_monkeys(infile)
|
|
|
|
display(monkeys)
|
|
|
|
display(monkeys)
|
|
|
|
println()
|
|
|
|
println()
|
|
|
|
println("monkey business ", monkey_business(monkeys))
|
|
|
|
println("monkey business 1 ",
|
|
|
|
|
|
|
|
monkey_business(monkeys, rounds=20, part=1))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
monkeys = read_monkeys(infile)
|
|
|
|
|
|
|
|
println("monkey business 2 ",
|
|
|
|
|
|
|
|
monkey_business(monkeys, rounds=10000, part=2))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|