Day 19 part 1.
This commit is contained in:
53
src/day19.rs
Normal file
53
src/day19.rs
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user