diff --git a/src/day14.rs b/src/day14.rs index 45cdce8..cacd79e 100644 --- a/src/day14.rs +++ b/src/day14.rs @@ -28,25 +28,53 @@ fn part_one(input: String, transforms: Transforms) -> i32 { ); } } - counts.iter().fold(0, |max, (_, count)| { - let count = *count; - if count > max { - count - } else { - max - } - }) - counts.iter().fold(i32::max_value(), |min, (_, count)| { - let count = *count; - if count < min { - count - } else { - min - } - }) + counts.iter().max_by_key(|c| c.1).unwrap().1 - counts.iter().min_by_key(|c| c.1).unwrap().1 } fn part_two(input: String, transforms: Transforms) -> u128 { - todo!() + type Bag = HashMap<(char, char), u128>; + let mut last_pair = ('a', 'b'); //hacky + let mut bag = { + let mut bag = Bag::new(); + let mut iter1 = input.chars().filter(|c| *c != '\n'); + let mut iter2 = iter1.clone(); + iter2.next(); + while let (Some(c1), Some(c2)) = (iter1.next(), iter2.next()) { + last_pair = (c1, c2); + bag.entry((c1, c2)).and_modify(|e| *e += 1).or_insert(1); + } + bag + }; + for _ in 0..40 { + let mut new_bag = Bag::new(); + for ((c1, c2), val) in bag { + let transformation = transforms[&(c1, c2)]; + if last_pair == (c1, c2) { + last_pair = (transformation, c2); + } + new_bag + .entry((c1, transformation)) + .and_modify(|e| *e += val) + .or_insert(val); + new_bag + .entry((transformation, c2)) + .and_modify(|e| *e += val) + .or_insert(val); + } + bag = new_bag; + } + let counts = { + type Counts = HashMap; + let mut counts = Counts::new(); + for ((c1, _), val) in bag { + counts.entry(c1).and_modify(|e| *e += val).or_insert(val); + } + counts.entry(last_pair.1).and_modify(|e| *e += 1); + counts + }; + + counts.iter().max_by_key(|(_, val)| **val).unwrap().1 + - counts.iter().min_by_key(|(_, val)| **val).unwrap().1 } #[cfg(test)] @@ -56,7 +84,7 @@ mod tests { fn parse_input(input: &str) -> (String, Transforms) { let (input, transform_list) = input.split_once("\n\n").expect("two sections"); let mut transforms = Transforms::new(); - for line in transform_list.split("\n") { + for line in transform_list.split('\n') { let (input, output) = line.split_once(" -> ").expect("transform"); let mut chars = input.chars(); transforms.insert( @@ -78,4 +106,16 @@ mod tests { let (input, transforms) = parse_input(include_str!("../inputs/14.txt")); assert_eq!(part_one(input, transforms), 2112); } + + #[test] + fn part_two_sample() { + let (input, transforms) = parse_input(include_str!("../inputs/14_test.txt")); + assert_eq!(part_two(input, transforms), 2188189693529); + } + + #[test] + fn part_two_test() { + let (input, transforms) = parse_input(include_str!("../inputs/14.txt")); + assert_eq!(part_two(input, transforms), 3243771149914); + } } diff --git a/src/lib.rs b/src/lib.rs index eebbefd..bfa4f35 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,10 +4,10 @@ * File: lib.rs * Author: Adam Jeniski; @Ajetski */ - pub(crate) mod day1; -pub(crate) mod day9; pub(crate) mod day10; +pub(crate) mod day9; //pub(crate) mod day11; //todo, finish day11 pub(crate) mod day13; pub(crate) mod day14; +pub(crate) mod day15;