This commit is contained in:
Adrian Groh 2024-12-05 09:48:30 +01:00
parent 122d56170d
commit 850c0f8a42
Signed by: Gobidev
GPG Key ID: 3AA3153E98B0D771
3 changed files with 80 additions and 0 deletions

7
day5/Cargo.lock generated Normal file
View File

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "day5"
version = "0.1.0"

6
day5/Cargo.toml Normal file
View File

@ -0,0 +1,6 @@
[package]
name = "day5"
version = "0.1.0"
edition = "2021"
[dependencies]

67
day5/src/main.rs Normal file
View File

@ -0,0 +1,67 @@
struct ParsedInput {
rules: Vec<(u32, u32)>,
pages: Vec<Vec<u32>>,
}
fn parse(input: &str) -> ParsedInput {
let (rules, pages) = input.split_once("\n\n").unwrap();
ParsedInput {
rules: rules
.lines()
.map(|line| line.split_once('|').unwrap())
.map(|(n1, n2)| (n1.parse().unwrap(), n2.parse().unwrap()))
.collect(),
pages: pages
.lines()
.map(|line| line.split(',').map(|n| n.parse().unwrap()).collect())
.collect(),
}
}
fn all_rules_apply(rules: &[(u32, u32)], page: &[u32]) -> bool {
rules.iter().all(|rule| {
let Some(first) = page.iter().enumerate().find(|(_, e)| e == &&rule.0) else {
return true;
};
let Some(second) = page.iter().enumerate().find(|(_, e)| e == &&rule.1) else {
return true;
};
first.0 < second.0
})
}
fn part1(parsed_input: &ParsedInput) -> u32 {
parsed_input
.pages
.iter()
.filter(|page| all_rules_apply(&parsed_input.rules, page))
.map(|rule| rule[rule.len() / 2])
.sum()
}
fn part2(parsed_input: &ParsedInput) -> u32 {
parsed_input
.pages
.iter()
.filter(|page| !all_rules_apply(&parsed_input.rules, page))
.fold(vec![], |mut acc, curr| {
let mut corrected_page = curr.clone();
corrected_page.sort_unstable_by(|a, b| {
match all_rules_apply(&parsed_input.rules, &[*a, *b]) {
true => std::cmp::Ordering::Less,
false => std::cmp::Ordering::Greater,
}
});
acc.push(corrected_page);
acc
})
.iter()
.map(|rule| rule[rule.len() / 2])
.sum()
}
fn main() {
let input = parse(include_str!("../input.txt"));
println!("{}", part1(&input));
println!("{}", part2(&input));
}