diff --git a/src/day19.rs b/src/day19.rs new file mode 100644 index 0000000..855b637 --- /dev/null +++ b/src/day19.rs @@ -0,0 +1,53 @@ +use std::collections::HashSet; +use aoc_runner_derive::{aoc, aoc_generator}; + +type Transformation = (String, String); + +#[aoc_generator(day19)] +fn parse(input: &str) -> (Vec, String) { + let (a, b) = input.split_once("\n\n").unwrap(); + let t = a.lines().map(|line| { + let (lhs, rhs) = line.split_once(" => ").unwrap(); + (lhs.to_string(), rhs.to_string()) + }).collect(); + (t, b.to_string()) +} + +#[aoc(day19, part1)] +fn part1((transformations, start): &(Vec, String)) -> usize { + let all: HashSet = transformations.iter() + .flat_map(|(from, to)| { + let start_indexes = starts(start, from); + start_indexes.into_iter() + .map(|si| { + let mut s = start.clone(); + s.replace_range(si..si+from.len(), to); + s + }) + }).collect(); + + all.len() +} + +fn starts(a: &str, pattern: &str) -> Vec { + let mut start = 0; + let mut result = vec![]; + while let Some(index) = a[start..].find(pattern) { + result.push(start + index); + start += index + 1; + } + result +} + +#[cfg(test)] +mod test { + #[test] + fn part1() { + let input = "H => HO +H => OH +O => HH + +HOH"; + assert_eq!(super::part1(& super::parse(input)), 4); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 1380dfb..5598cfc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,5 +11,6 @@ mod day15; mod day16; mod day17; mod day18; +mod day19; aoc_lib! { year = 2015 }