1
0

Compare commits

2 Commits

Author SHA1 Message Date
Johannes Schaefer
6eb95cb956 day 5 part 2 2024-12-05 09:44:45 +01:00
Johannes Schaefer
5186bbf4f4 day 5 part 1 2024-12-05 09:34:20 +01:00
3 changed files with 114 additions and 0 deletions

112
src/day05.rs Normal file
View File

@@ -0,0 +1,112 @@
use itertools::Itertools;
use std::{cmp::Ordering, fs::read_to_string};
pub fn day_main() {
let input = read_to_string("input/day05.txt").unwrap();
let input = input.trim();
println!(" part1: {}", part1(input));
println!(" part2: {}", part2(input));
}
type RiddleResult = usize;
fn part1(input: &str) -> RiddleResult {
let (rules, books) = parse(input);
books.iter().filter(|book| {
valid_book(book, &rules)
})
.map(|book| book[book.len() / 2].parse::<RiddleResult>().unwrap())
.sum()
}
fn valid_book(book: &[&str], rules: &[(&str, &str)]) -> bool {
for (i, a) in book.iter().enumerate() {
for b in book.iter().skip(i + 1) {
if rules.contains(&(b, a)) {
return false;
}
}
}
true
}
fn parse(input: &str) -> (Vec<(&str, &str)>, Vec<Vec<&str>>) {
let (a, b) = input.split_once("\n\n").unwrap();
let rules = a.lines().map(|line| line.split_once("|").unwrap()).collect_vec();
let books = b.lines().map(|line| line.split(",").collect_vec()).collect_vec();
(rules, books)
}
fn part2(input: &str) -> RiddleResult {
let (rules, books) = parse(input);
books.iter().filter(|book| {
!valid_book(book, &rules)
})
.map(|book| fix(book, &rules))
.map(|book| book[book.len() / 2].parse::<RiddleResult>().unwrap())
.sum()
}
fn fix<'a>(book: &'a[&str], rules: &[(&str, &str)]) -> Vec<&'a str> {
let mut b = book.iter().copied().collect_vec();
b.sort_unstable_by(|a, b| {
if rules.contains(&(a, b)) {
Ordering::Less
} else if rules.contains(&(b, a)) {
Ordering::Greater
} else {
Ordering::Equal
}
});
b
}
#[cfg(test)]
mod test {
use crate::day05::valid_book;
use super::{part1, part2};
const TEST_INPUT: &str = r"47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47
";
#[test]
fn test1() {
assert!(valid_book(&vec!["97", "5", "13"], &vec![("97", "13")]));
assert!(!valid_book(&vec!["13", "5", "97"], &vec![("97", "13")]));
assert_eq!(part1(TEST_INPUT), 143);
}
#[test]
fn test2() {
assert_eq!(part2(TEST_INPUT), 123);
}
}

View File

@@ -2,3 +2,4 @@ pub mod day01;
pub mod day02;
pub mod day03;
pub mod day04;
pub mod day05;

View File

@@ -9,6 +9,7 @@ fn main() {
(2, day02::day_main),
(3, day03::day_main),
(4, day04::day_main),
(5, day05::day_main),
]);
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
let Some(day) = day else {