[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,34 +55,30 @@ impl Day11 {
monkeys monkeys
} }
} }
}
impl DaySolver for Day11 { 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 {
fn solve_part1(&mut self) -> String {
// println!("{:?}", self.monkeys);
let mut monkey_items: Vec<Vec<u64>> = self.monkeys.iter() let mut monkey_items: Vec<Vec<u64>> = self.monkeys.iter()
.map(|m| m.items.to_owned()).collect(); .map(|m| m.items.to_owned()).collect();
let mut monkey_inspection_counts: Vec<usize> = vec![0; self.monkeys.len()]; let mut monkey_inspection_counts: Vec<usize> = vec![0; self.monkeys.len()];
for _round in 0..20 { for _round in 0..rounds {
let mut monkey_id = 0; let mut monkey_id = 0;
for monkey in &self.monkeys { for monkey in &self.monkeys {
let cur_monkey_items = monkey_items[monkey_id].to_owned(); for i in 0..monkey_items[monkey_id].len() {
monkey_inspection_counts[monkey_id] += cur_monkey_items.len(); let item = &monkey_items[monkey_id][i];
monkey_items[monkey_id].clear(); let item_worry_level = worry_level_modifier(item, monkey);
for item in &cur_monkey_items {
let item_worry_level = (monkey.operation.execute(item)) / 3;
if item_worry_level % monkey.test.check_divisor == 0 { if item_worry_level % monkey.test.check_divisor == 0 {
monkey_items[monkey.test.if_true_throw_to_monkey].push(item_worry_level); monkey_items[monkey.test.if_true_throw_to_monkey].push(item_worry_level);
} else { } else {
monkey_items[monkey.test.if_false_throw_to_monkey].push(item_worry_level); 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; monkey_id += 1;
} }
@@ -92,44 +88,31 @@ impl DaySolver for Day11 {
// } // }
} }
// println!("{:?}", monkey_inspection_counts);
monkey_inspection_counts.sort_by_cached_key(|k| usize::MAX - k); monkey_inspection_counts.sort_by_cached_key(|k| usize::MAX - k);
monkey_inspection_counts[0] as u64 * monkey_inspection_counts[1] as u64
}
}
return (monkey_inspection_counts[0] * monkey_inspection_counts[1]).to_string(); impl DaySolver for Day11 {
fn solve_part1(&mut self) -> 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 { 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();
} }
} }