From c8a2ebffc4b971c28ad3e48a31077fce7af1926e Mon Sep 17 00:00:00 2001 From: YK Date: Wed, 27 Nov 2024 00:05:07 +0300 Subject: [PATCH] solution: day 16 --- src/days.rs | 2 +- src/days/d16.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/days/d16.rs diff --git a/src/days.rs b/src/days.rs index ec4feb9..9d545ea 100644 --- a/src/days.rs +++ b/src/days.rs @@ -13,7 +13,7 @@ pub mod d12; pub mod d13; pub mod d14; pub mod d15; -// pub mod d16; +pub mod d16; // pub mod d17; // pub mod d18; // pub mod d19; diff --git a/src/days/d16.rs b/src/days/d16.rs new file mode 100644 index 0000000..f7d7507 --- /dev/null +++ b/src/days/d16.rs @@ -0,0 +1,44 @@ +#![allow(non_upper_case_globals)] +#![allow(unused_imports)] +#![allow(dead_code)] +use crate::prelude::*; + +pub type I = &'static str; +pub type O = String; + +fn checksum (data: &str) -> String { + data.chars().array_chunks().map(|[a, b]| if a == b { '1' } else { '0' }).collect() +} + +fn _solve (data: I, disk: usize) -> O { + let mut s = data.to_owned(); + while s.len() < disk { + s = format!("{}0{}", &s, s.chars().rev().map(|e| if e == '1' { '0' } else { '1' }).collect::()); + } + s = (&s[..disk]).to_owned(); + let mut chk = checksum(&s); + while chk.len() % 2 == 0 { + chk = checksum(&chk); + } + chk +} + +#[cfg(test)] +mod test { + use super::*; + + const input: &'static str = "01110110101001000"; + + #[test] + fn silver () { + let ans = _solve(input, 272); + assert_eq!(ans, s!("11100111011101111")) + } + + #[test] + fn gold () { + let ans = _solve(input, 35651584); + + assert_eq!(ans, s!("10001110010000110")) + } +}