solution: day 4
This commit is contained in:
parent
ea06d5c748
commit
1404c330c7
@ -1,7 +1,7 @@
|
||||
pub mod d1;
|
||||
pub mod d2;
|
||||
pub mod d3;
|
||||
// pub mod d4;
|
||||
pub mod d4;
|
||||
// pub mod d5;
|
||||
// pub mod d6;
|
||||
// pub mod d7;
|
||||
|
||||
86
src/days/d4.rs
Normal file
86
src/days/d4.rs
Normal file
@ -0,0 +1,86 @@
|
||||
use crate::prelude::*;
|
||||
|
||||
pub type T = (String, M<char, usize>, Vec<char>, u32);
|
||||
pub type I = Vec<T>;
|
||||
pub type O = u32;
|
||||
|
||||
fn _parse (data: &str) -> I {
|
||||
data.lines().map(|line| {
|
||||
let mut parts = line.split('-').collect_vec();
|
||||
let last = parts.pop().unwrap();
|
||||
let rest = parts.join(" ");
|
||||
let m = parts.into_iter().map(|p| p.chars()).flatten().counts();
|
||||
|
||||
let (number, checksum) = last.split_once('[').unwrap();
|
||||
|
||||
let number = number.parse().unwrap();
|
||||
let checksum = checksum.trim_matches(']').chars().collect();
|
||||
|
||||
(rest, m, checksum, number)
|
||||
}).collect()
|
||||
}
|
||||
|
||||
fn _solve <'a> (data: &'a I) -> impl Iterator<Item = (&'a String, &'a u32)> {
|
||||
data.into_iter().filter_map(|(st, m, checksum, num)| {
|
||||
let mut m = m.into_iter().collect_vec();
|
||||
|
||||
m.sort_by(|a, b| match b.1.cmp(&a.1) {
|
||||
Or::Equal => a.0.cmp(&b.0),
|
||||
e => e
|
||||
});
|
||||
|
||||
if checksum.into_iter().zip(m.into_iter()).all(|(&l, (&r, _))| l == r) {
|
||||
Some((st, num))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn _silver (data: &I) -> O {
|
||||
_solve(data).map(|(_, num)| num).sum()
|
||||
}
|
||||
|
||||
fn _gold (data: &I) -> O {
|
||||
*_solve(data).find(|(s, num)| {
|
||||
|
||||
let mut s = s.chars().collect_vec();
|
||||
|
||||
for c in s.iter_mut() {
|
||||
match *c {
|
||||
' ' => (),
|
||||
a => {
|
||||
*c = ((((a as u8 - b'a') as u32 + *num) % 26) + b'a' as u32) as u8 as char;
|
||||
}
|
||||
}
|
||||
}
|
||||
let s = s.into_iter().collect::<String>();
|
||||
s.contains("north")
|
||||
}).unwrap().1
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
fn read () -> I {
|
||||
let data = inc!(4);
|
||||
_parse(data)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn silver () {
|
||||
let data = read();
|
||||
let ans = _silver(&data);
|
||||
|
||||
assert_eq!(ans, 278221)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gold () {
|
||||
let data = read();
|
||||
let ans = _gold(&data);
|
||||
|
||||
assert_eq!(ans, 267)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user