1
0

improve day 5 speed

This commit is contained in:
2024-12-05 18:50:18 +01:00
parent fdd43c7953
commit 1a4c40b8aa

View File

@@ -1,4 +1,5 @@
use itertools::Itertools; use itertools::Itertools;
use std::collections::HashSet;
use std::str::FromStr; use std::str::FromStr;
use std::{cmp::Ordering, fs::read_to_string}; use std::{cmp::Ordering, fs::read_to_string};
@@ -20,7 +21,7 @@ fn part1(input: &str) -> R {
.sum() .sum()
} }
fn valid_book(book: &[R], rules: &[(R, R)]) -> bool { fn valid_book(book: &[R], rules: &HashSet<(R, R)>) -> bool {
for (i, a) in book.iter().enumerate() { for (i, a) in book.iter().enumerate() {
for b in book.iter().skip(i + 1) { for b in book.iter().skip(i + 1) {
if rules.contains(&(*b, *a)) { if rules.contains(&(*b, *a)) {
@@ -31,13 +32,13 @@ fn valid_book(book: &[R], rules: &[(R, R)]) -> bool {
true true
} }
fn parse(input: &str) -> (Vec<(R, R)>, Vec<Vec<R>>) { fn parse(input: &str) -> (HashSet<(R, R)>, Vec<Vec<R>>) {
let (a, b) = input.split_once("\n\n").unwrap(); let (a, b) = input.split_once("\n\n").unwrap();
let rules = a let rules = a
.lines() .lines()
.map(|line| line.split_once("|").unwrap()) .map(|line| line.split_once("|").unwrap())
.map(|(a, b)| (R::from_str(a).unwrap(), R::from_str(b).unwrap())) .map(|(a, b)| (R::from_str(a).unwrap(), R::from_str(b).unwrap()))
.collect_vec(); .collect();
let books = b let books = b
.lines() .lines()
.map(|line| line.split(",").flat_map(R::from_str).collect_vec()) .map(|line| line.split(",").flat_map(R::from_str).collect_vec())
@@ -56,7 +57,7 @@ fn part2(input: &str) -> R {
.sum() .sum()
} }
fn fix(book: &[R], rules: &[(R, R)]) -> Vec<R> { fn fix(book: &[R], rules: &HashSet<(R, R)>) -> Vec<R> {
let mut b = book.iter().copied().collect_vec(); let mut b = book.iter().copied().collect_vec();
b.sort_unstable_by(|a, b| { b.sort_unstable_by(|a, b| {
if rules.contains(&(*a, *b)) { if rules.contains(&(*a, *b)) {
@@ -73,6 +74,7 @@ fn fix(book: &[R], rules: &[(R, R)]) -> Vec<R> {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::{part1, part2, valid_book}; use super::{part1, part2, valid_book};
use std::collections::HashSet;
const TEST_INPUT: &str = r"47|53 const TEST_INPUT: &str = r"47|53
97|13 97|13
@@ -106,8 +108,8 @@ mod test {
#[test] #[test]
fn test1() { fn test1() {
assert!(valid_book(&vec![97, 5, 13], &vec![(97, 13)])); assert!(valid_book(&vec![97, 5, 13], &HashSet::from([(97, 13)])));
assert!(!valid_book(&vec![13, 5, 97], &vec![(97, 13)])); assert!(!valid_book(&vec![13, 5, 97], &HashSet::from([(97, 13)])));
assert_eq!(part1(TEST_INPUT), 143); assert_eq!(part1(TEST_INPUT), 143);
} }