diff --git a/src/day11.rs b/src/day11.rs index 3739582..6a01cb2 100644 --- a/src/day11.rs +++ b/src/day11.rs @@ -55,6 +55,42 @@ impl Day11 { monkeys } } + + fn play_monkey_game_and_calculate_monkey_business(&mut self, rounds: u32, mut worry_level_modifier: F) -> u64 + where F: FnMut(&u64, &Monkey) -> u64 { + + let mut monkey_items: Vec> = self.monkeys.iter() + .map(|m| m.items.to_owned()).collect(); + let mut monkey_inspection_counts: Vec = vec![0; self.monkeys.len()]; + + for _round in 0..rounds { + + let mut monkey_id = 0; + for monkey in &self.monkeys { + for i in 0..monkey_items[monkey_id].len() { + let item = &monkey_items[monkey_id][i]; + let item_worry_level = worry_level_modifier(item, monkey); + if item_worry_level % monkey.test.check_divisor == 0 { + monkey_items[monkey.test.if_true_throw_to_monkey].push(item_worry_level); + } else { + monkey_items[monkey.test.if_false_throw_to_monkey].push(item_worry_level); + } + } + + monkey_inspection_counts[monkey_id] += monkey_items[monkey_id].len(); + monkey_items[monkey_id].clear(); + monkey_id += 1; + } + + // println!("After round {}, monkey items: ", _round); + // for (i, monkey_items) in monkey_items.iter().enumerate() { + // println!("Monkey {}: {:?}", i, monkey_items); + // } + + } + monkey_inspection_counts.sort_by_cached_key(|k| usize::MAX - k); + monkey_inspection_counts[0] as u64 * monkey_inspection_counts[1] as u64 + } } impl DaySolver for Day11 { @@ -62,74 +98,21 @@ impl DaySolver for Day11 { fn solve_part1(&mut self) -> String { - // println!("{:?}", self.monkeys); - - let mut monkey_items: Vec> = self.monkeys.iter() - .map(|m| m.items.to_owned()).collect(); - let mut monkey_inspection_counts: Vec = vec![0; self.monkeys.len()]; - - for _round in 0..20 { - - let mut monkey_id = 0; - for monkey in &self.monkeys { - let cur_monkey_items = monkey_items[monkey_id].to_owned(); - monkey_inspection_counts[monkey_id] += cur_monkey_items.len(); - monkey_items[monkey_id].clear(); - for item in &cur_monkey_items { - let item_worry_level = (monkey.operation.execute(item)) / 3; - if item_worry_level % monkey.test.check_divisor == 0 { - monkey_items[monkey.test.if_true_throw_to_monkey].push(item_worry_level); - } else { - monkey_items[monkey.test.if_false_throw_to_monkey].push(item_worry_level); - } - } - monkey_id += 1; - } - - // println!("After round {}, monkey items: ", _round); - // for (i, monkey_items) in monkey_items.iter().enumerate() { - // println!("Monkey {}: {:?}", i, monkey_items); - // } - - } - - // println!("{:?}", monkey_inspection_counts); - monkey_inspection_counts.sort_by_cached_key(|k| usize::MAX - k); - - return (monkey_inspection_counts[0] * monkey_inspection_counts[1]).to_string(); + let monkey_business = self.play_monkey_game_and_calculate_monkey_business(20, + |item, monkey| (monkey.operation.execute(item)) / 3); + return monkey_business.to_string(); } fn solve_part2(&mut self) -> String { - let mut monkey_items: Vec> = self.monkeys.iter() - .map(|m| m.items.to_owned()).collect(); - let mut monkey_inspection_counts: Vec = vec![0; self.monkeys.len()]; + let normalizer = self.monkeys.iter().map(|m| m.test.check_divisor) .reduce(|a, b| a * b).unwrap(); - for _round in 0..10000 { + let monkey_business = self.play_monkey_game_and_calculate_monkey_business(10000, + |item, monkey| monkey.operation.execute(item) % normalizer); - let mut monkey_id = 0; - for monkey in &self.monkeys { - let cur_monkey_items = monkey_items[monkey_id].to_owned(); - monkey_inspection_counts[monkey_id] += cur_monkey_items.len(); - monkey_items[monkey_id].clear(); - for item in &cur_monkey_items { - let item_worry_level = monkey.operation.execute(item) % normalizer; - if item_worry_level % monkey.test.check_divisor == 0 { - monkey_items[monkey.test.if_true_throw_to_monkey].push(item_worry_level); - } else { - monkey_items[monkey.test.if_false_throw_to_monkey].push(item_worry_level); - } - } - monkey_id += 1; - } - - } - - monkey_inspection_counts.sort_by_cached_key(|k| usize::MAX - k); - - return (monkey_inspection_counts[0] as u64 * monkey_inspection_counts[1] as u64).to_string(); + return monkey_business.to_string(); } }