Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/advent-of-code-2021
Path: blob/main/src/day14.rs
97 views
1
use std::collections::HashMap;
2
3
pub fn run() {
4
let (template_str, rules_str) = include_str!("inputs/day14").split_once("\n\n").unwrap();
5
let polymer_template: Vec<_> = template_str.bytes().collect();
6
let insertion_rules: HashMap<(u8, u8), u8> = rules_str
7
.lines()
8
.map(|l| {
9
let bytes = l.as_bytes();
10
((bytes[0], bytes[1]), bytes[bytes.len() - 1])
11
})
12
.collect();
13
let last_element = *polymer_template.last().unwrap();
14
15
let mut pair_counts: HashMap<(u8, u8), usize> = HashMap::new();
16
for pair in polymer_template.windows(2) {
17
*pair_counts.entry((pair[0], pair[1])).or_insert(0) += 1;
18
}
19
20
for n in 1..=40 {
21
let mut new_counts = HashMap::new();
22
for (&(l, r), &count) in pair_counts.iter() {
23
let middle = insertion_rules[&(l, r)];
24
*new_counts.entry((l, middle)).or_insert(0) += count;
25
*new_counts.entry((middle, r)).or_insert(0) += count;
26
}
27
pair_counts = new_counts;
28
29
if n == 10 || n == 40 {
30
let mut element_counts: HashMap<u8, usize> = HashMap::new();
31
for (&(l, _), &count) in pair_counts.iter() {
32
*element_counts.entry(l).or_insert(0) += count
33
}
34
*element_counts.entry(last_element).or_insert(0) += 1;
35
36
let max_elem_count = element_counts.values().max().unwrap();
37
let min_elem_count = element_counts.values().min().unwrap();
38
println!("{}", max_elem_count - min_elem_count);
39
}
40
}
41
}
42
43