diff --git a/src/bin/day11.rs b/src/bin/day11.rs index b30a770..c96a72c 100644 --- a/src/bin/day11.rs +++ b/src/bin/day11.rs @@ -119,7 +119,7 @@ impl FromStr for Monkey { } } -fn round(monkeys: &mut Input, lcm: usize, div: bool) { +fn round(monkeys: &mut Input, lcm: usize, modular: bool) { let mut q: VecDeque<(usize, usize)> = VecDeque::new(); for i in 0..monkeys.len() { @@ -127,10 +127,11 @@ fn round(monkeys: &mut Input, lcm: usize, div: bool) { for j in 0..m.items.len() { let mut worry = m.operation.apply(m.items[j]); - if div { + if modular { + worry %= lcm; + } else { worry /= 3; } - worry %= lcm; q.push_back((m.test.get(worry), worry)); m.inspections += 1; @@ -156,6 +157,38 @@ fn euclid(a: usize, b: usize) -> usize { a } +fn simulate_rounds(input: &Input, rounds: usize, modular: bool) -> Output { + let mut monkeys = input.clone(); + + let lcm = monkeys + .iter() + .map(|m| m.test.0) + .fold(1, |x, y| (x * y) / euclid(x, y)); + + let inspect = vec![ + 1, 20, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 1000, + ]; + + for r in 0..rounds { + round(&mut monkeys, lcm, modular); + + if inspect.contains(&(r + 1)) { + debug!( + "Monkeys: {:?}", + monkeys.iter().map(|m| m.inspections).collect_vec() + ); + } + } + + monkeys + .iter() + .map(|m| m.inspections) + // .inspect(|x| debug!("inspections of monkey: {x}")) + .sorted_by_key(|&i| Reverse(i)) + .take(2) + .product() +} + struct Day11; impl Solution for Day11 { fn parse_input>(pathname: P) -> Input { @@ -166,55 +199,11 @@ impl Solution for Day11 { } fn part_1(input: &Input) -> Output { - let mut monkeys = input.clone(); - - let lcm = monkeys - .iter() - .map(|m| m.test.0) - .fold(1, |x, y| x * y / euclid(x, y)); - - for _ in 0..20 { - round(&mut monkeys, lcm, true); - } - - monkeys - .iter() - .map(|m| m.inspections) - .sorted_by_key(|&i| Reverse(i)) - .take(2) - .product() + simulate_rounds(input, 20, false) } fn part_2(input: &Input) -> Output { - let mut monkeys = input.clone(); - - let lcm = monkeys - .iter() - .map(|m| m.test.0) - .fold(1, |x, y| (x * y) / euclid(x, y)); - - let inspect = vec![ - 1, 20, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 1000, - ]; - - for r in 0..10000 { - round(&mut monkeys, lcm, false); - - if inspect.contains(&(r + 1)) { - debug!( - "Monkeys: {:?}", - monkeys.iter().map(|m| m.inspections).collect_vec() - ); - } - } - - monkeys - .iter() - .map(|m| m.inspections) - // .inspect(|x| debug!("inspections of monkey: {x}")) - .sorted_by_key(|&i| Reverse(i)) - .take(2) - .product() + simulate_rounds(input, 10000, true) } }