solution: day 9 (simulation approach)
This commit is contained in:
parent
c32121a4b2
commit
a13c28dc04
@ -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
108
src/days/d9.rs
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user