solution: day 20
This commit is contained in:
parent
9fab2616c5
commit
ce521e996a
@ -17,7 +17,7 @@ pub mod d16;
|
||||
pub mod d17;
|
||||
pub mod d18;
|
||||
pub mod d19;
|
||||
// pub mod d20;
|
||||
pub mod d20;
|
||||
// pub mod d21;
|
||||
// pub mod d22;
|
||||
// pub mod d23;
|
||||
|
||||
74
src/days/d20.rs
Normal file
74
src/days/d20.rs
Normal file
@ -0,0 +1,74 @@
|
||||
#![allow(unused_imports)]
|
||||
use std::ops::RangeInclusive;
|
||||
use crate::prelude::*;
|
||||
|
||||
pub type I = Vec<RangeInclusive<u64>>;
|
||||
pub type O = u64;
|
||||
|
||||
fn _parse (data: &str) -> I {
|
||||
data.trim().lines().map(|e| e.trim().split_once('-').map(|(a, b)| a.parse().unwrap()..=b.parse().unwrap()).unwrap()).collect()
|
||||
}
|
||||
|
||||
fn _silver (mut data: I) -> O {
|
||||
data.sort_by_key(|d| *d.start());
|
||||
let mut start = data[0].end() + 1;
|
||||
|
||||
for d in &data[1..] {
|
||||
if *d.start() <= start {
|
||||
start = start.max(d.end() + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
Default::default()
|
||||
}
|
||||
|
||||
fn _gold (mut data: I) -> O {
|
||||
data.sort_by_key(|d| *d.start());
|
||||
let mut start = data[0].end() + 1;
|
||||
let mut gaps = 0;
|
||||
|
||||
for d in &data[1..] {
|
||||
if *d.start() <= start {
|
||||
start = start.max(d.end() + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
let l = d.start() - start;
|
||||
gaps += l;
|
||||
start = d.end() + 1;
|
||||
}
|
||||
|
||||
// doesn't matter in my input, but for a general case where there's a gap between last
|
||||
// blocked ip and last possible ip will matter. check is here to ensure it won't overflow
|
||||
if start <= u32::MAX as u64 {
|
||||
gaps += u32::MAX as u64 - start;
|
||||
}
|
||||
gaps
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
fn read () -> I {
|
||||
let data = inc!(20);
|
||||
_parse(data)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn silver () {
|
||||
let data = read();
|
||||
let ans = _silver(data);
|
||||
assert_eq!(ans, 17348574)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gold () {
|
||||
let data = read();
|
||||
let ans = _gold(data);
|
||||
assert_eq!(ans, 104)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user