solution: day19
This commit is contained in:
parent
000003407c
commit
0000035064
|
@ -0,0 +1,72 @@
|
|||
use hashbrown::{HashMap, HashSet};
|
||||
use itertools::Itertools;
|
||||
use regex::Regex;
|
||||
|
||||
pub fn part_one(input: &str) -> Option<u32> {
|
||||
let (replacements, molecule) = input.split_once("\n\n")?;
|
||||
let mappings = replacements
|
||||
.split('\n')
|
||||
.map(|x| x.split_once(" => ").unwrap())
|
||||
.collect_vec();
|
||||
|
||||
let mut molecules = HashSet::new();
|
||||
|
||||
for (a, b) in mappings.iter() {
|
||||
let split = molecule.split(a).collect_vec();
|
||||
for i in 1..split.len() {
|
||||
let x = split[..i].join(a);
|
||||
let y = split[i..].join(a);
|
||||
molecules.insert(format!("{x}{b}{y}"));
|
||||
}
|
||||
}
|
||||
|
||||
Some(molecules.len() as u32)
|
||||
}
|
||||
|
||||
// https://www.reddit.com/r/adventofcode/comments/3xflz8/comment/cy4etju/
|
||||
pub fn part_two(input: &str) -> Option<u32> {
|
||||
let (r, m) = input.split_once("\n\n")?;
|
||||
let mut molecule: String = m.chars().rev().collect();
|
||||
|
||||
let mappings = r
|
||||
.split('\n')
|
||||
.map(|x| x.split_once(" => ").unwrap())
|
||||
.map(|(a, b)| {
|
||||
(
|
||||
b.chars().rev().collect::<String>(),
|
||||
a.chars().rev().collect::<String>(),
|
||||
)
|
||||
})
|
||||
.collect::<HashMap<String, String>>();
|
||||
|
||||
let re = Regex::new(&mappings.iter().map(|(k, _)| k.as_str()).join("|")).unwrap();
|
||||
|
||||
let mut count = 0;
|
||||
while molecule != "e" {
|
||||
let re_range = re.find(&molecule)?.range();
|
||||
let repl = &molecule[re_range];
|
||||
molecule = molecule.replacen(repl, mappings.get(repl)?, 1);
|
||||
count += 1;
|
||||
}
|
||||
|
||||
Some(count)
|
||||
}
|
||||
fn main() {
|
||||
let input = &aoc::read_file("inputs", 19);
|
||||
aoc::solve!(1, part_one, input);
|
||||
aoc::solve!(2, part_two, input);
|
||||
}
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
let input = aoc::read_file("test_inputs", 19);
|
||||
assert_eq!(part_one(&input.trim()), Some(4));
|
||||
}
|
||||
#[test]
|
||||
fn test_part_two() {
|
||||
let input = aoc::read_file("test_inputs", 19);
|
||||
assert_eq!(part_two(&input.trim()), Some(3));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
e => H
|
||||
e => O
|
||||
H => HO
|
||||
H => OH
|
||||
O => HH
|
||||
|
||||
HOH
|
Loading…
Reference in New Issue