mirror of
https://github.com/Ajetski/advent-of-code.git
synced 2025-09-30 11:23:17 -09:00
finish day 14
This commit is contained in:
parent
2a6124b405
commit
9ad9239c08
74
src/day14.rs
74
src/day14.rs
@ -28,25 +28,53 @@ fn part_one(input: String, transforms: Transforms) -> i32 {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
counts.iter().fold(0, |max, (_, count)| {
|
counts.iter().max_by_key(|c| c.1).unwrap().1 - counts.iter().min_by_key(|c| c.1).unwrap().1
|
||||||
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 {
|
fn part_two(input: String, transforms: Transforms) -> u128 {
|
||||||
todo!()
|
type Bag = HashMap<(char, char), u128>;
|
||||||
|
let mut last_pair = ('a', 'b'); //hacky
|
||||||
|
let mut bag = {
|
||||||
|
let mut bag = Bag::new();
|
||||||
|
let mut iter1 = input.chars().filter(|c| *c != '\n');
|
||||||
|
let mut iter2 = iter1.clone();
|
||||||
|
iter2.next();
|
||||||
|
while let (Some(c1), Some(c2)) = (iter1.next(), iter2.next()) {
|
||||||
|
last_pair = (c1, c2);
|
||||||
|
bag.entry((c1, c2)).and_modify(|e| *e += 1).or_insert(1);
|
||||||
|
}
|
||||||
|
bag
|
||||||
|
};
|
||||||
|
for _ in 0..40 {
|
||||||
|
let mut new_bag = Bag::new();
|
||||||
|
for ((c1, c2), val) in bag {
|
||||||
|
let transformation = transforms[&(c1, c2)];
|
||||||
|
if last_pair == (c1, c2) {
|
||||||
|
last_pair = (transformation, c2);
|
||||||
|
}
|
||||||
|
new_bag
|
||||||
|
.entry((c1, transformation))
|
||||||
|
.and_modify(|e| *e += val)
|
||||||
|
.or_insert(val);
|
||||||
|
new_bag
|
||||||
|
.entry((transformation, c2))
|
||||||
|
.and_modify(|e| *e += val)
|
||||||
|
.or_insert(val);
|
||||||
|
}
|
||||||
|
bag = new_bag;
|
||||||
|
}
|
||||||
|
let counts = {
|
||||||
|
type Counts = HashMap<char, u128>;
|
||||||
|
let mut counts = Counts::new();
|
||||||
|
for ((c1, _), val) in bag {
|
||||||
|
counts.entry(c1).and_modify(|e| *e += val).or_insert(val);
|
||||||
|
}
|
||||||
|
counts.entry(last_pair.1).and_modify(|e| *e += 1);
|
||||||
|
counts
|
||||||
|
};
|
||||||
|
|
||||||
|
counts.iter().max_by_key(|(_, val)| **val).unwrap().1
|
||||||
|
- counts.iter().min_by_key(|(_, val)| **val).unwrap().1
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -56,7 +84,7 @@ mod tests {
|
|||||||
fn parse_input(input: &str) -> (String, Transforms) {
|
fn parse_input(input: &str) -> (String, Transforms) {
|
||||||
let (input, transform_list) = input.split_once("\n\n").expect("two sections");
|
let (input, transform_list) = input.split_once("\n\n").expect("two sections");
|
||||||
let mut transforms = Transforms::new();
|
let mut transforms = Transforms::new();
|
||||||
for line in transform_list.split("\n") {
|
for line in transform_list.split('\n') {
|
||||||
let (input, output) = line.split_once(" -> ").expect("transform");
|
let (input, output) = line.split_once(" -> ").expect("transform");
|
||||||
let mut chars = input.chars();
|
let mut chars = input.chars();
|
||||||
transforms.insert(
|
transforms.insert(
|
||||||
@ -78,4 +106,16 @@ mod tests {
|
|||||||
let (input, transforms) = parse_input(include_str!("../inputs/14.txt"));
|
let (input, transforms) = parse_input(include_str!("../inputs/14.txt"));
|
||||||
assert_eq!(part_one(input, transforms), 2112);
|
assert_eq!(part_one(input, transforms), 2112);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part_two_sample() {
|
||||||
|
let (input, transforms) = parse_input(include_str!("../inputs/14_test.txt"));
|
||||||
|
assert_eq!(part_two(input, transforms), 2188189693529);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part_two_test() {
|
||||||
|
let (input, transforms) = parse_input(include_str!("../inputs/14.txt"));
|
||||||
|
assert_eq!(part_two(input, transforms), 3243771149914);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
* File: lib.rs
|
* File: lib.rs
|
||||||
* Author: Adam Jeniski; @Ajetski
|
* Author: Adam Jeniski; @Ajetski
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub(crate) mod day1;
|
pub(crate) mod day1;
|
||||||
pub(crate) mod day9;
|
|
||||||
pub(crate) mod day10;
|
pub(crate) mod day10;
|
||||||
|
pub(crate) mod day9;
|
||||||
//pub(crate) mod day11; //todo, finish day11
|
//pub(crate) mod day11; //todo, finish day11
|
||||||
pub(crate) mod day13;
|
pub(crate) mod day13;
|
||||||
pub(crate) mod day14;
|
pub(crate) mod day14;
|
||||||
|
pub(crate) mod day15;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user