solution: day 9
This commit is contained in:
79
src/bin/09.rs
Normal file
79
src/bin/09.rs
Normal file
@@ -0,0 +1,79 @@
|
||||
use itertools::Itertools;
|
||||
|
||||
fn decompress(input: &str, recursive: bool) -> usize {
|
||||
let mut stack = input
|
||||
.chars()
|
||||
.filter(|x| !x.is_whitespace())
|
||||
.rev()
|
||||
.collect_vec();
|
||||
|
||||
let mut drained = vec![];
|
||||
let mut count = 0;
|
||||
|
||||
while let Some(c) = stack.pop() {
|
||||
if c == '(' {
|
||||
let mut n = 0;
|
||||
let sublen = loop {
|
||||
let l = stack.pop().unwrap();
|
||||
if l == 'x' {
|
||||
break n;
|
||||
}
|
||||
n = n * 10 + l.to_digit(10).unwrap() as usize;
|
||||
};
|
||||
|
||||
let mut n = 0;
|
||||
let repeat = loop {
|
||||
let l = stack.pop().unwrap();
|
||||
if l == ')' {
|
||||
break n;
|
||||
}
|
||||
n = n * 10 + l.to_digit(10).unwrap() as usize;
|
||||
};
|
||||
|
||||
drained.clear();
|
||||
|
||||
for _ in 0..sublen {
|
||||
drained.push(stack.pop().unwrap());
|
||||
}
|
||||
|
||||
if recursive {
|
||||
for _ in 0..repeat {
|
||||
for d in drained.iter().copied().rev() {
|
||||
stack.push(d);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
count += drained.len() * repeat
|
||||
}
|
||||
} else {
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
|
||||
count
|
||||
}
|
||||
|
||||
pub fn part_one(input: &str) -> Option<usize> {
|
||||
Some(decompress(input, false))
|
||||
}
|
||||
pub fn part_two(input: &str) -> Option<usize> {
|
||||
Some(decompress(input, true))
|
||||
}
|
||||
fn main() {
|
||||
let input = &aoc::read_file("inputs", 9);
|
||||
aoc::solve!(part_one, part_two, input);
|
||||
}
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
let input = aoc::read_file("examples", 9);
|
||||
assert_eq!(part_one(&input), Some(238));
|
||||
}
|
||||
#[test]
|
||||
fn test_part_two() {
|
||||
let input = aoc::read_file("examples", 9);
|
||||
assert_eq!(part_two(&input), Some(445));
|
||||
}
|
||||
}
|
||||
1
src/examples/09.txt
Normal file
1
src/examples/09.txt
Normal file
@@ -0,0 +1 @@
|
||||
(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN
|
||||
Reference in New Issue
Block a user