From c8f5182b7577205c120b2b4696c80d77616e6db8 Mon Sep 17 00:00:00 2001 From: EbbDrop Date: Sun, 22 Dec 2024 23:15:45 +0100 Subject: [PATCH] Use jump table --- build.rs | 44 +++++++++++++++++++++----------------------- src/day22.rs | 11 +++++------ 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/build.rs b/build.rs index 71c5907..f318337 100644 --- a/build.rs +++ b/build.rs @@ -225,38 +225,36 @@ fn write_day21() { file.write_all(&lut).unwrap(); } -// #[allow(unused)] -// fn write_day22() { -// const MAX: u32 = 16777216; +#[allow(unused)] +fn write_day22() { + const MAX: u32 = 16777216; -// let mut lut = Vec::with_capacity(MAX as usize); + let mut lut = Vec::with_capacity(MAX as usize); -// for i in 0..MAX { -// let mut sn = i; -// for _ in 0..2000 { -// sn = ((sn as u64 * 64) % MAX as u64) as u32 ^ sn; -// sn = (sn / 32) ^ sn; -// sn = ((sn as u64 * 2048) % MAX as u64) as u32 ^ sn; -// } + for i in 0..MAX { + let mut sn = i; + sn = ((sn as u64 * 64) % MAX as u64) as u32 ^ sn; + sn = (sn / 32) ^ sn; + sn = ((sn as u64 * 2048) % MAX as u64) as u32 ^ sn; -// lut.push(sn); -// } + lut.push(sn); + } -// let lut: Box<[u32; MAX as usize]> = lut.into_boxed_slice().try_into().unwrap(); -// let mut lut = std::mem::ManuallyDrop::new(lut); -// let lut: Box<[u8; 4 * MAX as usize]> = unsafe { Box::from_raw(lut.as_mut_ptr().cast()) }; + let lut: Box<[u32; MAX as usize]> = lut.into_boxed_slice().try_into().unwrap(); + let mut lut = std::mem::ManuallyDrop::new(lut); + let lut: Box<[u8; 4 * MAX as usize]> = unsafe { Box::from_raw(lut.as_mut_ptr().cast()) }; -// let mut path = PathBuf::from(std::env::var("OUT_DIR").unwrap()); -// path.push("day22.bin"); -// let mut file = File::create(&path).unwrap(); + let mut path = PathBuf::from(std::env::var("OUT_DIR").unwrap()); + path.push("day22_jmp.bin"); + let mut file = File::create(&path).unwrap(); -// file.write_all(lut.as_slice()).unwrap(); -// println!("{}", path.display()); -// } + file.write_all(lut.as_slice()).unwrap(); + println!("{}", path.display()); +} fn main() { println!("cargo::rerun-if-changed=build.rs"); write_day21(); - // write_day22(); + write_day22(); } diff --git a/src/day22.rs b/src/day22.rs index 0739c00..9a421bf 100644 --- a/src/day22.rs +++ b/src/day22.rs @@ -44,6 +44,9 @@ pub fn part1(s: &str) -> u64 { sum } +static JMP_TBL: [u32; MAX as usize] = + unsafe { transmute(*include_bytes!(concat!(env!("OUT_DIR"), "/day22_jmp.bin"))) }; + const SEQUENCES: usize = 18 * 18 * 18 * 18; #[aoc(day22, part2)] @@ -83,9 +86,7 @@ pub fn part2(s: &str) -> i16 { let mut prev = sn % 10; for _ in 0..3 { - sn = ((sn as u64 * 64) % MAX as u64) as u32 ^ sn; - sn = (sn / 32) ^ sn; - sn = ((sn as u64 * 2048) % MAX as u64) as u32 ^ sn; + sn = JMP_TBL[sn as usize]; let price = sn % 10; let diff = price + 9 - prev; diffs = diffs * 18 + diff; @@ -94,9 +95,7 @@ pub fn part2(s: &str) -> i16 { } for _ in 4..2000 { - sn = ((sn as u64 * 64) % MAX as u64) as u32 ^ sn; - sn = (sn / 32) ^ sn; - sn = ((sn as u64 * 2048) % MAX as u64) as u32 ^ sn; + sn = JMP_TBL[sn as usize]; let price = sn % 10; let diff = price + 9 - prev; diffs = (diffs * 18 + diff) % SEQUENCES as u32;