Day 19 part 1.

This commit is contained in:
2024-06-30 19:29:16 +02:00
parent 2f097ef852
commit 4b3b030f6e
2 changed files with 54 additions and 0 deletions

53
src/day19.rs Normal file
View File

@@ -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<Transformation>, 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<Transformation>, String)) -> usize {
let all: HashSet<String> = 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<usize> {
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);
}
}