[CLEANUP] Day 11 code optimization & cleanup
(but it's still quite slow)
This commit is contained in:
65
src/day11.rs
65
src/day11.rs
@@ -55,34 +55,30 @@ impl Day11 {
|
||||
monkeys
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl DaySolver for Day11 {
|
||||
|
||||
|
||||
fn solve_part1(&mut self) -> String {
|
||||
|
||||
// println!("{:?}", self.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..20 {
|
||||
for _round in 0..rounds {
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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[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 {
|
||||
|
||||
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)
|
||||
.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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user