solution: day 9 (expansion approach)

This commit is contained in:
YK 2024-11-20 11:48:16 +03:00
parent c32121a4b2
commit 4614df8845
2 changed files with 109 additions and 1 deletions

View File

@ -6,7 +6,7 @@ pub mod d5;
pub mod d6; pub mod d6;
pub mod d7; pub mod d7;
pub mod d8; pub mod d8;
// pub mod d9; pub mod d9;
// pub mod d10; // pub mod d10;
// pub mod d11; // pub mod d11;
// pub mod d12; // pub mod d12;

108
src/days/d9.rs Normal file
View File

@ -0,0 +1,108 @@
use crate::prelude::*;
pub type I = SS;
pub type O = usize;
fn _expand (mut data: impl Iterator<Item = char>) -> String {
let mut stack = String::new();
data.by_ref().take_while(|e| *e != '(').for_each(|c| stack.push(c));
let a = data.by_ref().take_while(|c| *c != ')').collect::<String>();
let Some((len, times)) = a.split_once('x') else { return stack };
let len = len.parse::<usize>().unwrap();
let mut taken = data.by_ref().take(len).filter(|e| !e.is_control() && !e.is_whitespace()).collect::<String>();
while let Some(p) = taken.find("(") {
let new = format!("{}{}", &taken[..p], _expand(taken[p..].chars()));
// println!("{:?} -> {:?}", taken, new);
taken = new;
}
let times = times.parse::<usize>().unwrap();
stack.push_str(&taken.repeat(times));
stack.push_str(&_expand(data));
stack
}
fn _silver (data: I) -> O {
let mut stack = String::new();
let mut cs = data.trim().chars();
loop {
let Some(cur) = cs.next() else { break; };
match cur {
'(' => {
let a = cs.by_ref().take_while(|c| *c != ')').collect::<String>();
let (len, times) = a.split_once('x').unwrap();
let len = len.parse::<usize>().unwrap();
let times = times.parse::<usize>().unwrap();
let taken = cs.by_ref().take(len).filter(|e| !e.is_control() && !e.is_whitespace()).collect::<String>();
stack.push_str(&taken.repeat(times));
},
e => stack.push(e),
}
}
stack.len()
}
fn _gold (data: I) -> O {
let stack = _expand(data.trim().chars());
stack.len()
}
#[cfg(test)]
mod test {
use super::*;
fn read () -> I {
inc!(9)
}
#[test]
fn sample () {
let cases = [
("ADVENT", 6),
("X(8x2)(3x3)ABCY", 18),
("A(1x5)BC", 7),
("(3x3)XYZ", 9),
("A(2x2)BCD(2x2)EFG", 11),
("(6x1)(1x3)A", 6),
];
for (i, o) in cases {
assert_eq!(_silver(i), o)
}
let cases_gold = [
("X(8x2)(3x3)ABCY", 20),
("(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN", 445),
];
for (i, o) in cases_gold {
assert_eq!(_gold(i), o)
}
}
#[test]
fn silver () {
let data = read();
let ans = _silver(&data);
assert_eq!(ans, 74532)
}
#[test]
fn gold () {
let data = read();
let ans = _gold(&data);
assert_eq!(ans, 11558231665)
}
}