summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Igne <git@federicoigne.com>2021-12-17 15:45:14 +0000
committerFederico Igne <git@federicoigne.com>2021-12-17 15:45:14 +0000
commitcaadd3b46c95caf433881ea9a1cd2e98c87f5e56 (patch)
treec0cae1533ba2a7ed511b74b4cef5a89a56778898
parentcce9b6e60d5f70078d6fc608636201a7934418e1 (diff)
downloadaoc-caadd3b46c95caf433881ea9a1cd2e98c87f5e56.tar.gz
aoc-caadd3b46c95caf433881ea9a1cd2e98c87f5e56.zip
Day 14
-rw-r--r--day14/Cargo.toml9
-rw-r--r--day14/resources/input.txt102
-rw-r--r--day14/src/main.rs55
3 files changed, 166 insertions, 0 deletions
diff --git a/day14/Cargo.toml b/day14/Cargo.toml
new file mode 100644
index 0000000..d2891da
--- /dev/null
+++ b/day14/Cargo.toml
@@ -0,0 +1,9 @@
1[package]
2name = "day14"
3version = "0.1.0"
4authors = ["Federico Igne <git@federicoigne.com>"]
5edition = "2018"
6
7# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8
9[dependencies]
diff --git a/day14/resources/input.txt b/day14/resources/input.txt
new file mode 100644
index 0000000..5074877
--- /dev/null
+++ b/day14/resources/input.txt
@@ -0,0 +1,102 @@
1SCVHKHVSHPVCNBKBPVHV
2
3SB -> B
4HH -> P
5VF -> N
6BS -> S
7NC -> C
8BF -> H
9BN -> H
10SP -> H
11BK -> H
12FF -> N
13VN -> B
14FN -> C
15FS -> S
16PP -> F
17ON -> H
18FV -> F
19KO -> F
20PK -> H
21VB -> S
22HS -> B
23NV -> O
24PN -> S
25VH -> B
26OS -> P
27BP -> H
28OV -> B
29HK -> S
30NN -> K
31SV -> C
32PB -> F
33SK -> F
34FB -> S
35NB -> K
36HF -> P
37FK -> K
38KV -> P
39PV -> F
40BC -> S
41FO -> N
42HC -> F
43CP -> B
44KK -> F
45PC -> S
46HN -> O
47SH -> H
48CK -> P
49CO -> F
50HP -> K
51PS -> C
52KP -> F
53OF -> K
54KS -> F
55NO -> V
56CB -> K
57NF -> N
58SF -> F
59SC -> P
60FC -> V
61BV -> B
62SS -> O
63KC -> K
64FH -> C
65OP -> C
66CF -> K
67VO -> V
68VK -> H
69KH -> O
70NP -> V
71NH -> O
72NS -> V
73BH -> C
74CH -> S
75CC -> F
76CS -> P
77SN -> F
78BO -> S
79NK -> S
80OO -> P
81VV -> F
82FP -> V
83OK -> C
84SO -> H
85KN -> P
86HO -> O
87PO -> H
88VS -> N
89PF -> N
90CV -> F
91BB -> H
92VC -> H
93HV -> B
94CN -> S
95OH -> K
96KF -> K
97HB -> S
98OC -> H
99KB -> P
100OB -> C
101VP -> C
102PH -> K
diff --git a/day14/src/main.rs b/day14/src/main.rs
new file mode 100644
index 0000000..6cca304
--- /dev/null
+++ b/day14/src/main.rs
@@ -0,0 +1,55 @@
1use std::fs;
2use std::path::Path;
3use std::collections::HashMap;
4use std::iter::FromIterator;
5
6type Expand = (char,char);
7type Rules = HashMap<(char,char),char>;
8type Frequency = HashMap<char,u128>;
9type FrequencyMap = HashMap<Expand,Frequency>;
10
11/* AOC21 Day 14: https://adventofcode.com/2021/day/14 */
12fn main() {
13 let input = Path::new("resources").join("input.txt");
14 let content = fs::read_to_string(input).expect("Unable to read input file");
15 let (template,rules) = content.split_once("\n\n").expect("Malformed input");
16 let rules = Rules::from_iter(rules.lines().map(|l| {
17 let (from,to) = l.split_once(" -> ").expect("Malformed input");
18 let chars = from.chars().collect::<Vec<char>>();
19 ((chars[0],chars[1]),to.parse().unwrap())
20 }));
21 let mut frequency = FrequencyMap::new();
22 rules.iter().for_each(|(&(a,b),&c)| {
23 let mut map = HashMap::new(); map.insert(c,1);
24 frequency.insert((a,b),map);
25 });
26 (1..10).for_each(|_| frequency = expand(&frequency, &rules));
27 println!("Ex1: the result is {}", template_frequency(template, &frequency));
28 (0..30).for_each(|_| frequency = expand(&frequency, &rules));
29 println!("Ex2: the result is {}", template_frequency(template, &frequency));
30}
31
32fn expand(frequency: &FrequencyMap, rules: &Rules) -> FrequencyMap {
33 let mut freq2 = FrequencyMap::new();
34 rules.iter().for_each(|(&(a,b),&c)| {
35 let mut map = merge(frequency.get(&(a,c)).unwrap(), frequency.get(&(c,b)).unwrap());
36 *map.entry(c).or_default() += 1;
37 *freq2.entry((a,b)).or_default() = map;
38 });
39 freq2
40}
41
42fn template_frequency(template: &str, frequency: &FrequencyMap) -> u128 {
43 let mut freq = HashMap::new();
44 template.chars().for_each(|c| *freq.entry(c).or_default() += 1);
45 freq = template.chars().collect::<Vec<char>>()
46 .as_slice().windows(2)
47 .fold(freq, |acc, w| merge(&acc, frequency.get(&(w[0],w[1])).unwrap()) );
48 freq.values().max().unwrap() - freq.values().min().unwrap()
49}
50
51fn merge(a: &Frequency, b: &Frequency) -> Frequency {
52 let mut map = a.clone();
53 b.iter().for_each(|(&k,&v)| *map.entry(k).or_default() += v);
54 map
55}