Add day5
This commit is contained in:
parent
122d56170d
commit
850c0f8a42
7
day5/Cargo.lock
generated
Normal file
7
day5/Cargo.lock
generated
Normal 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
6
day5/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "day5"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
67
day5/src/main.rs
Normal file
67
day5/src/main.rs
Normal 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));
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user