Speed up day22

This commit is contained in:
Adrian Groh 2024-12-22 17:20:13 +01:00
parent 2d3c79bf43
commit b1aef02295
Signed by: Gobidev
GPG Key ID: 3AA3153E98B0D771

View File

@ -4,20 +4,20 @@ fn parse(input: &str) -> Vec<usize> {
input.lines().map(|l| l.parse().unwrap()).collect() input.lines().map(|l| l.parse().unwrap()).collect()
} }
fn evolve_number(curr: &mut usize) { fn evolve_number(num: &mut usize) {
*curr ^= *curr << 6; *num ^= *num << 6;
*curr &= 0xffffff; *num &= 0xffffff;
*curr ^= *curr >> 5; *num ^= *num >> 5;
*curr &= 0xffffff; *num &= 0xffffff;
*curr ^= *curr << 11; *num ^= *num << 11;
*curr &= 0xffffff; *num &= 0xffffff;
} }
fn part1(numbers: &[usize]) -> usize { fn part1(initial_numbers: &[usize]) -> usize {
numbers initial_numbers
.iter() .iter()
.map(|secret| { .map(|num| {
let mut res = *secret; let mut res = *num;
(0..2000).for_each(|_| evolve_number(&mut res)); (0..2000).for_each(|_| evolve_number(&mut res));
res res
}) })
@ -25,17 +25,13 @@ fn part1(numbers: &[usize]) -> usize {
} }
fn part2(numbers: &[usize]) -> isize { fn part2(numbers: &[usize]) -> isize {
// kinda slow let mut sequence_bananas: AHashMap<(i8, i8, i8, i8), Vec<i8>> = AHashMap::new();
let mut sequence_bananas: AHashMap<(isize, isize, isize, isize), Vec<isize>> = AHashMap::new();
for number in numbers { for number in numbers {
let mut costs_and_changes: Vec<(isize, isize)> = vec![]; let mut costs_and_changes: Vec<(i8, i8)> = vec![];
let mut curr_magic = *number; let mut curr_magic = *number;
for _ in 0..2000 { for _ in 0..2000 {
let cost = curr_magic % 10; let cost = (curr_magic % 10) as i8;
costs_and_changes.push(( costs_and_changes.push((cost, costs_and_changes.last().map_or(0, |l| cost - l.0)));
cost as isize,
costs_and_changes.last().map_or(0, |l| cost as isize - l.0),
));
evolve_number(&mut curr_magic); evolve_number(&mut curr_magic);
} }
let sequence_costs = costs_and_changes let sequence_costs = costs_and_changes
@ -58,12 +54,18 @@ fn part2(numbers: &[usize]) -> isize {
.get( .get(
sequence_bananas sequence_bananas
.iter() .iter()
.max_by(|a, b| a.1.iter().sum::<isize>().cmp(&b.1.iter().sum::<isize>())) .max_by(|a, b| {
a.1.iter()
.map(|i| *i as isize)
.sum::<isize>()
.cmp(&b.1.iter().map(|i| *i as isize).sum::<isize>())
})
.unwrap() .unwrap()
.0, .0,
) )
.unwrap() .unwrap()
.iter() .iter()
.map(|i| *i as isize)
.sum() .sum()
} }