generated from janezicmatej/aoc-template
solution: day 22
This commit is contained in:
parent
00000290eb
commit
0000030073
|
@ -0,0 +1,4 @@
|
|||
1
|
||||
2
|
||||
3
|
||||
2024
|
|
@ -0,0 +1,91 @@
|
|||
use aoc::parsers::to_vec_map;
|
||||
use hashbrown::{HashMap, HashSet};
|
||||
|
||||
fn pseudo_next(mut n: usize) -> usize {
|
||||
n = ((n << 6) ^ n) % 16777216;
|
||||
n = ((n >> 5) ^ n) % 16777216;
|
||||
n = ((n << 11) ^ n) % 16777216;
|
||||
n
|
||||
}
|
||||
|
||||
struct MonkeyTrader {
|
||||
numbers: [usize; 2001],
|
||||
sequences: HashMap<[isize; 4], usize>,
|
||||
}
|
||||
|
||||
impl MonkeyTrader {
|
||||
fn new(seed: usize) -> Self {
|
||||
let mut numbers = [0; 2001];
|
||||
numbers[0] = seed;
|
||||
|
||||
let mut n = seed;
|
||||
for num in numbers.iter_mut().skip(1) {
|
||||
n = pseudo_next(n);
|
||||
*num = n;
|
||||
}
|
||||
|
||||
let mut sequences = HashMap::new();
|
||||
for i in 4..2001 {
|
||||
let mut key = [0; 4];
|
||||
for j in 1..=4 {
|
||||
let d1 = numbers[i - 4 + j - 1] % 10;
|
||||
let d2 = numbers[i - 4 + j] % 10;
|
||||
let diff = d2 as isize - d1 as isize;
|
||||
key[j - 1] = diff;
|
||||
}
|
||||
if sequences.contains_key(&key) {
|
||||
continue;
|
||||
}
|
||||
*sequences.entry(key).or_default() = numbers[i] % 10;
|
||||
}
|
||||
|
||||
MonkeyTrader { numbers, sequences }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn part_one(input: &str) -> Option<usize> {
|
||||
to_vec_map(input, '\n', MonkeyTrader::new)
|
||||
.into_iter()
|
||||
.map(|x| x.numbers[2000])
|
||||
.sum::<usize>()
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn part_two(input: &str) -> Option<usize> {
|
||||
let traders = to_vec_map(input, '\n', MonkeyTrader::new);
|
||||
let key_union: HashSet<[isize; 4]> = traders
|
||||
.iter()
|
||||
.flat_map(|x| x.sequences.keys().cloned())
|
||||
.collect();
|
||||
|
||||
key_union
|
||||
.into_iter()
|
||||
.map(|k| {
|
||||
traders
|
||||
.iter()
|
||||
.filter_map(|t| t.sequences.get(&k))
|
||||
.sum::<usize>()
|
||||
})
|
||||
.max()
|
||||
}
|
||||
|
||||
aoc::solution!(22);
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
assert_eq!(
|
||||
part_one(&aoc::template::read_file("examples", 22)),
|
||||
Some(37990510)
|
||||
);
|
||||
}
|
||||
#[test]
|
||||
fn test_part_two() {
|
||||
assert_eq!(
|
||||
part_two(&aoc::template::read_file("examples", 22)),
|
||||
Some(23)
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue