From 05704d9ba10e0abfa106adf3e07d9a73b89cc7ef Mon Sep 17 00:00:00 2001 From: Malte Tammena Date: Fri, 9 Dec 2022 21:41:23 +0100 Subject: [PATCH] Try some optimization --- day03/src/bitmask.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/day03/src/bitmask.rs b/day03/src/bitmask.rs index 31028fd..fa91535 100644 --- a/day03/src/bitmask.rs +++ b/day03/src/bitmask.rs @@ -10,15 +10,16 @@ impl Bitmask { } pub const fn from_alpha(alpha: &u8) -> Self { // 'a' is the LSB, 'Z' is MSB - if *alpha <= b'Z' { - Self(1 << (alpha - b'A' + 26)) - } else { - Self(1 << (alpha - b'a')) - } + Self(1 << (alpha - b'A')) } /// Get the priority from a rucksack entry pub const fn to_priority(self) -> super::Prio { - self.0.trailing_zeros() as usize + 1 + let log = self.0.trailing_zeros() as u8; + if log < 32 { + log as usize + 27 + } else { + log as usize - 31 + } } } @@ -50,13 +51,21 @@ mod tests { #[test] fn bitmask_works() { + assert_eq!(Bitmask::from_alpha(&b'A'), Bitmask(1)); + assert_eq!(Bitmask::from_alpha(&b'Z'), Bitmask(1 << 25)); + assert_eq!(Bitmask::from_alpha(&b'a'), Bitmask(1 << 32)); + assert_eq!(Bitmask::from_alpha(&b'z'), Bitmask(1 << 57)); assert_eq!( crate::parse_chars::("abc".into()), - Bitmask::from_raw(7) + Bitmask((1 << 32) + (1 << 33) + (1 << 34)) ); assert_eq!( crate::parse_chars::("Z".into()), - Bitmask::from_raw(1 << 51) + Bitmask::from_raw(1 << 25) ); + assert_eq!(Bitmask::from_alpha(&b'a').to_priority(), 1); + assert_eq!(Bitmask::from_alpha(&b'z').to_priority(), 26); + assert_eq!(Bitmask::from_alpha(&b'A').to_priority(), 27); + assert_eq!(Bitmask::from_alpha(&b'Z').to_priority(), 52); } }