Added day 14 code for part 1 and 2
Signed-off-by: Louis Vallat <louis@louis-vallat.xyz>
This commit is contained in:
parent
5293bf274e
commit
70389d9e5f
@ -68,3 +68,8 @@ day-13:
|
|||||||
stage: build
|
stage: build
|
||||||
script:
|
script:
|
||||||
- cd day13; cargo run --release ./input
|
- cd day13; cargo run --release ./input
|
||||||
|
|
||||||
|
day-14:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- cd day14; cargo run --release ./input
|
||||||
|
8
day14/Cargo.toml
Normal file
8
day14/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "day14"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
102
day14/input
Normal file
102
day14/input
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
SCVHKHVSHPVCNBKBPVHV
|
||||||
|
|
||||||
|
SB -> B
|
||||||
|
HH -> P
|
||||||
|
VF -> N
|
||||||
|
BS -> S
|
||||||
|
NC -> C
|
||||||
|
BF -> H
|
||||||
|
BN -> H
|
||||||
|
SP -> H
|
||||||
|
BK -> H
|
||||||
|
FF -> N
|
||||||
|
VN -> B
|
||||||
|
FN -> C
|
||||||
|
FS -> S
|
||||||
|
PP -> F
|
||||||
|
ON -> H
|
||||||
|
FV -> F
|
||||||
|
KO -> F
|
||||||
|
PK -> H
|
||||||
|
VB -> S
|
||||||
|
HS -> B
|
||||||
|
NV -> O
|
||||||
|
PN -> S
|
||||||
|
VH -> B
|
||||||
|
OS -> P
|
||||||
|
BP -> H
|
||||||
|
OV -> B
|
||||||
|
HK -> S
|
||||||
|
NN -> K
|
||||||
|
SV -> C
|
||||||
|
PB -> F
|
||||||
|
SK -> F
|
||||||
|
FB -> S
|
||||||
|
NB -> K
|
||||||
|
HF -> P
|
||||||
|
FK -> K
|
||||||
|
KV -> P
|
||||||
|
PV -> F
|
||||||
|
BC -> S
|
||||||
|
FO -> N
|
||||||
|
HC -> F
|
||||||
|
CP -> B
|
||||||
|
KK -> F
|
||||||
|
PC -> S
|
||||||
|
HN -> O
|
||||||
|
SH -> H
|
||||||
|
CK -> P
|
||||||
|
CO -> F
|
||||||
|
HP -> K
|
||||||
|
PS -> C
|
||||||
|
KP -> F
|
||||||
|
OF -> K
|
||||||
|
KS -> F
|
||||||
|
NO -> V
|
||||||
|
CB -> K
|
||||||
|
NF -> N
|
||||||
|
SF -> F
|
||||||
|
SC -> P
|
||||||
|
FC -> V
|
||||||
|
BV -> B
|
||||||
|
SS -> O
|
||||||
|
KC -> K
|
||||||
|
FH -> C
|
||||||
|
OP -> C
|
||||||
|
CF -> K
|
||||||
|
VO -> V
|
||||||
|
VK -> H
|
||||||
|
KH -> O
|
||||||
|
NP -> V
|
||||||
|
NH -> O
|
||||||
|
NS -> V
|
||||||
|
BH -> C
|
||||||
|
CH -> S
|
||||||
|
CC -> F
|
||||||
|
CS -> P
|
||||||
|
SN -> F
|
||||||
|
BO -> S
|
||||||
|
NK -> S
|
||||||
|
OO -> P
|
||||||
|
VV -> F
|
||||||
|
FP -> V
|
||||||
|
OK -> C
|
||||||
|
SO -> H
|
||||||
|
KN -> P
|
||||||
|
HO -> O
|
||||||
|
PO -> H
|
||||||
|
VS -> N
|
||||||
|
PF -> N
|
||||||
|
CV -> F
|
||||||
|
BB -> H
|
||||||
|
VC -> H
|
||||||
|
HV -> B
|
||||||
|
CN -> S
|
||||||
|
OH -> K
|
||||||
|
KF -> K
|
||||||
|
HB -> S
|
||||||
|
OC -> H
|
||||||
|
KB -> P
|
||||||
|
OB -> C
|
||||||
|
VP -> C
|
||||||
|
PH -> K
|
67
day14/src/main.rs
Normal file
67
day14/src/main.rs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
use std::{fs, env, collections::HashMap};
|
||||||
|
|
||||||
|
fn read_input(path: &str) -> String {
|
||||||
|
return fs::read_to_string(path).expect("Cannot read file.");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(s: &str) -> (HashMap<(char, char), u64>,
|
||||||
|
HashMap<(char, char), char>,
|
||||||
|
HashMap<char, u64>) {
|
||||||
|
let mut l = s.lines();
|
||||||
|
let mut i = HashMap::new();
|
||||||
|
let mut p = HashMap::new();
|
||||||
|
let mut c = HashMap::new();
|
||||||
|
let z: Vec<char> = l.next().unwrap().chars().collect();
|
||||||
|
for x in 0..z.len() - 1 {
|
||||||
|
c.insert(z[x], *c.get(&z[x]).unwrap_or(&0) + 1);
|
||||||
|
p.insert((z[x], z[x + 1]), *p.get(&(z[x], z[x + 1])).unwrap_or(&0) + 1);
|
||||||
|
}
|
||||||
|
c.insert(*z.last().unwrap(), *c.get(z.last().unwrap()).unwrap_or(&0) + 1);
|
||||||
|
l.next();
|
||||||
|
for x in l {
|
||||||
|
let s = x.split_once(" -> ").unwrap();
|
||||||
|
let mut a = s.0.chars();
|
||||||
|
i.insert((a.next().unwrap(), a.next().unwrap()), s.1.chars().next().unwrap());
|
||||||
|
}
|
||||||
|
return (p, i, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn apply_n_passes(p: &HashMap<(char, char), u64>,
|
||||||
|
i: &HashMap<(char, char), char>,
|
||||||
|
mut l: HashMap<char, u64>, n: u32)
|
||||||
|
-> (HashMap<(char, char), u64>, HashMap<char, u64>) {
|
||||||
|
let mut c = p.clone();
|
||||||
|
for _o in 0..n {
|
||||||
|
let mut v = HashMap::new();
|
||||||
|
for x in c.clone() {
|
||||||
|
let p = *i.get(&(x.0.0, x.0.1)).unwrap();
|
||||||
|
l.insert(p, l.get(&p).unwrap_or(&0) + x.1);
|
||||||
|
v.insert((x.0.0, p), *v.get(&(x.0.0, p)).unwrap_or(&0) + x.1);
|
||||||
|
v.insert((p, x.0.1), *v.get(&(p, x.0.1)).unwrap_or(&0) + x.1);
|
||||||
|
}
|
||||||
|
c = v;
|
||||||
|
}
|
||||||
|
return (c, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_min_max_occurences(p: &HashMap<char, u64>) -> (u64, u64) {
|
||||||
|
return p.iter().fold((u64::MAX, u64::MIN), |acc, e|
|
||||||
|
(if *e.1 < acc.0 { *e.1 } else { acc.0 },
|
||||||
|
if *e.1 > acc.1 { *e.1 } else { acc.1 }));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
for arg in args.iter().skip(1) {
|
||||||
|
let input = read_input(&arg);
|
||||||
|
let vec_in = parse_input(&input);
|
||||||
|
let mut c = apply_n_passes(&vec_in.0, &vec_in.1, vec_in.2.clone(), 10);
|
||||||
|
let mut m = get_min_max_occurences(&c.1);
|
||||||
|
println!("[{}]", &arg);
|
||||||
|
println!("\t[Part 1] => Answer is '{}'.", m.1 - m.0);
|
||||||
|
c = apply_n_passes(&c.0, &vec_in.1, vec_in.2, 30);
|
||||||
|
m = get_min_max_occurences(&c.1);
|
||||||
|
println!("\t[Part 2] => Answer is '{}'.", m.1 - m.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user