[CLEANUP] Day 11 code optimization & cleanup

(but it's still quite slow)
This commit is contained in:
2022-12-12 09:12:52 +01:00
parent 33027001d2
commit 6518483461

View File

@@ -55,6 +55,42 @@ impl Day11 {
monkeys monkeys
} }
} }
fn play_monkey_game_and_calculate_monkey_business<F>(&mut self, rounds: u32, mut worry_level_modifier: F) -> u64
where F: FnMut(&u64, &Monkey) -> u64 {
let mut monkey_items: Vec<Vec<u64>> = self.monkeys.iter()
.map(|m| m.items.to_owned()).collect();
let mut monkey_inspection_counts: Vec<usize> = 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 { impl DaySolver for Day11 {
@@ -62,74 +98,21 @@ impl DaySolver for Day11 {
fn solve_part1(&mut self) -> String { fn solve_part1(&mut self) -> String {
// println!("{:?}", self.monkeys); let monkey_business = self.play_monkey_game_and_calculate_monkey_business(20,
|item, monkey| (monkey.operation.execute(item)) / 3);
let mut monkey_items: Vec<Vec<u64>> = self.monkeys.iter() return monkey_business.to_string();
.map(|m| m.items.to_owned()).collect();
let mut monkey_inspection_counts: Vec<usize> = 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();
} }
fn solve_part2(&mut self) -> String { fn solve_part2(&mut self) -> String {
let mut monkey_items: Vec<Vec<u64>> = self.monkeys.iter()
.map(|m| m.items.to_owned()).collect();
let mut monkey_inspection_counts: Vec<usize> = vec![0; self.monkeys.len()];
let normalizer = self.monkeys.iter().map(|m| m.test.check_divisor) let normalizer = self.monkeys.iter().map(|m| m.test.check_divisor)
.reduce(|a, b| a * b).unwrap(); .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; return monkey_business.to_string();
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();
} }
} }