main
Bryce Allen 3 years ago
parent 298d0c3439
commit 4d8a104945

@ -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

Loading…
Cancel
Save