diff --git a/inputs/14.txt b/inputs/14.txt new file mode 100644 index 0000000..6dba718 --- /dev/null +++ b/inputs/14.txt @@ -0,0 +1,102 @@ +SCSCSKKVVBKVFKSCCSOV + +CP -> C +SF -> S +BH -> F +SS -> N +KB -> N +NO -> N +BP -> F +NK -> P +VP -> H +OF -> O +VH -> O +FV -> F +OP -> V +FP -> B +VB -> B +OK -> S +BS -> B +SK -> P +VV -> H +PC -> S +HV -> K +PS -> N +VS -> O +HF -> B +SV -> C +HP -> O +NF -> V +HB -> F +VO -> B +VN -> N +ON -> H +KV -> K +OV -> F +HO -> H +NB -> K +CB -> F +FF -> H +NH -> F +SN -> N +PO -> O +PH -> C +HH -> P +KF -> N +OH -> N +KS -> O +FH -> H +CC -> F +CK -> N +FC -> F +CF -> H +HN -> B +OC -> F +OB -> K +FO -> P +KP -> N +NC -> P +PN -> O +PV -> B +CO -> C +CS -> P +PP -> V +FN -> B +PK -> C +VK -> S +HS -> P +OS -> N +NP -> K +SB -> F +OO -> F +CV -> V +BB -> O +SH -> O +NV -> N +BN -> C +KN -> H +KC -> C +BK -> O +KO -> S +VC -> N +KK -> P +BO -> V +BC -> V +BV -> H +SC -> N +NN -> C +CH -> H +SO -> P +HC -> F +FS -> P +VF -> S +BF -> S +PF -> O +SP -> H +FK -> N +NS -> C +PB -> S +HK -> C +CN -> B +FB -> O +KH -> O \ No newline at end of file diff --git a/inputs/14_test.txt b/inputs/14_test.txt new file mode 100644 index 0000000..753f029 --- /dev/null +++ b/inputs/14_test.txt @@ -0,0 +1,19 @@ + +NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C \ No newline at end of file diff --git a/src/day14.rs b/src/day14.rs new file mode 100644 index 0000000..45cdce8 --- /dev/null +++ b/src/day14.rs @@ -0,0 +1,81 @@ +use std::collections::HashMap; + +type Transforms = HashMap<(char, char), char>; + +fn part_one(input: String, transforms: Transforms) -> i32 { + let mut input: Vec = input.chars().collect(); + for _ in 1..=10 { + let pairs = input.windows(2); + let mut next = vec![input[0]]; + for pair in pairs { + let key = (pair[0], pair[1]); + if let Some(val) = transforms.get(&key) { + next.push(*val); + } + next.push(pair[1]); + } + input = next; + } + let mut counts = HashMap::::new(); + for char in input { + if char != '\n' { + counts.insert( + char, + match counts.get(&char) { + Some(val) => *val + 1, + _ => 1, + }, + ); + } + } + 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 + } + }) +} + +fn part_two(input: String, transforms: Transforms) -> u128 { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + + 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") { + let (input, output) = line.split_once(" -> ").expect("transform"); + let mut chars = input.chars(); + transforms.insert( + (chars.next().unwrap(), chars.next().unwrap()), + output.chars().next().unwrap(), + ); + } + (input.to_owned(), transforms) + } + + #[test] + fn part_one_test_sample() { + let (input, transforms) = parse_input(include_str!("../inputs/14_test.txt")); + assert_eq!(part_one(input, transforms), 1588); + } + + #[test] + fn part_one_test() { + let (input, transforms) = parse_input(include_str!("../inputs/14.txt")); + assert_eq!(part_one(input, transforms), 2112); + } +} diff --git a/src/lib.rs b/src/lib.rs index 0f6f11f..eebbefd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,3 +9,5 @@ pub(crate) mod day1; pub(crate) mod day9; pub(crate) mod day10; //pub(crate) mod day11; //todo, finish day11 +pub(crate) mod day13; +pub(crate) mod day14;