Speed up day22
This commit is contained in:
parent
2d3c79bf43
commit
b1aef02295
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user