Skip to content

Commit 168a58a

Browse files
author
mflinn-broad
committed
day 14 part 1
1 parent b90ad8d commit 168a58a

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

src/days/day14.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use crate::util;
2+
use std::collections::HashMap;
3+
4+
type Input = (
5+
HashMap<String, String>,
6+
HashMap<String, usize>,
7+
HashMap<String, usize>,
8+
);
9+
10+
pub fn run() {
11+
let raw_input = util::read_input("inputs/day14.txt").unwrap();
12+
let input = process(&raw_input);
13+
println!("Part 1: {}", part_1(input));
14+
}
15+
16+
fn part_1(input: Input) -> usize {
17+
let (mappings, mut singles, pairs) = input;
18+
(0..10).fold(pairs, |old_pairs, _| {
19+
let mut new_pairs: HashMap<String, usize> = HashMap::new();
20+
21+
old_pairs.iter().for_each(|(pair, pair_count)| {
22+
let single = mappings.get(pair).unwrap();
23+
let single_count = singles.get_mut(single).unwrap();
24+
*single_count += pair_count;
25+
26+
let new_pair_a = format!("{}{}", pair.chars().nth(0).unwrap(), single);
27+
let new_pair_b = format!("{}{}", single, pair.chars().nth(1).unwrap());
28+
29+
let new_pair_a_count = new_pairs.entry(new_pair_a).or_insert(0);
30+
*new_pair_a_count += pair_count;
31+
32+
let new_pair_b_count = new_pairs.entry(new_pair_b).or_insert(0);
33+
*new_pair_b_count += pair_count;
34+
});
35+
36+
new_pairs
37+
});
38+
39+
let min = singles.values().min().unwrap();
40+
let max = singles.values().max().unwrap();
41+
42+
max - min
43+
}
44+
45+
fn process(input: &str) -> Input {
46+
let mut singles: HashMap<String, usize> = HashMap::new();
47+
let mut pairs: HashMap<String, usize> = HashMap::new();
48+
let mut mappings: HashMap<String, String> = HashMap::new();
49+
50+
let (initial, instructions) = input.split_once("\n\n").unwrap();
51+
52+
initial.trim().chars().for_each(|poly| {
53+
let poly_count = singles.entry(poly.to_string()).or_insert(0);
54+
*poly_count += 1;
55+
});
56+
57+
let initial: Vec<char> = initial.trim().chars().collect();
58+
initial.windows(2).for_each(|pair| {
59+
let pair: String = pair.iter().collect();
60+
let pair_count = pairs.entry(pair).or_insert(0);
61+
*pair_count += 1;
62+
});
63+
64+
instructions.lines().for_each(|line| {
65+
let (pair, poly) = line.trim().split_once(" -> ").unwrap();
66+
mappings.insert(pair.to_string(), poly.to_string());
67+
});
68+
69+
(mappings, singles, pairs)
70+
}

src/days/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ pub mod day10;
33
pub mod day11;
44
pub mod day12;
55
pub mod day13;
6+
pub mod day14;
67
pub mod day2;
78
pub mod day3;
89
pub mod day4;

src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ fn main() {
7171
day13::run();
7272
day_durations.insert(13, day_13_start.elapsed());
7373

74+
let day_14_start = Instant::now();
75+
println!("Day 14 --------");
76+
day14::run();
77+
day_durations.insert(14, day_14_start.elapsed());
78+
7479
let total_duration = start.elapsed();
7580

7681
println!("Total time to run all solutions: {:?}", total_duration);

0 commit comments

Comments
 (0)