solution: day 5

This commit is contained in:
YK 2024-12-06 10:50:50 +03:00
parent 3a9a75558b
commit 50dc9543da
2 changed files with 109 additions and 1 deletions

View File

@ -2,7 +2,7 @@ pub mod d1;
pub mod d2;
pub mod d3;
pub mod d4;
// pub mod d5;
pub mod d5;
// pub mod d6;
// pub mod d7;
// pub mod d8;

108
src/days/d5.rs Normal file
View File

@ -0,0 +1,108 @@
use crate::prelude::*;
pub type I = (M<u32, S<u32>>, Vec<Vec<u32>>);
pub type O = u32;
fn _parse (data: &str) -> I {
data.trim().split_once("\n\n").map(|(left, right)| {
let mut m: M<u32, S<u32>> = M::new();
left.trim().lines().for_each(|line| {
let (x, y) = line.trim().split_once('|').unwrap();
let x = p!(x);
let y = p!(y);
m.entry(x).or_default().insert(y);
});
let v = right.trim().lines().map(|e| e.split(',').map(|e| p!(e)).collect()).collect();
(m, v)
}).unwrap()
}
fn _silver ((rules, list): I) -> O {
list.into_iter().filter(|page| {
let mut seen = S::new();
for &n in page {
let rules_for_n = rules.get(&n);
if let Some(rules) = rules_for_n {
if seen.intersection(rules).count() != 0 {
return false;
}
}
seen.insert(n);
}
true
}).map(|page| page[page.len() / 2]).sum()
}
fn _gold ((rules, list): I) -> O {
list.into_iter().filter(|page| {
let mut seen = S::new();
for &n in page {
let rules_for_n = rules.get(&n);
if let Some(rules) = rules_for_n {
if seen.intersection(rules).count() != 0 {
return true;
}
}
seen.insert(n);
}
false
})
.map(|mut page| {
let mut seen = M::new();
let mut ptr = 0;
'outer : while ptr < page.len() {
let n = page[ptr];
let rules_for_n = rules.get(&n);
if let Some(rules) = rules_for_n {
for r in rules {
if let Some(seen_idx) = seen.get(r) {
let removed = page.remove(ptr);
page.insert(*seen_idx, removed);
ptr = 0;
seen.clear();
continue 'outer;
}
}
}
seen.insert(n, ptr);
ptr += 1;
}
page
})
.map(|page| page[page.len() / 2]).sum()
}
#[cfg(test)]
mod test {
use super::*;
fn read () -> I {
let data = inc!(5);
_parse(data)
}
#[test]
fn silver () {
let data = read();
let ans = _silver(data);
assert_eq!(ans, 6260)
}
#[test]
fn gold () {
let data = read();
let ans = _gold(data);
assert_eq!(ans, 5346)
}
}