solution: day 18
This commit is contained in:
parent
350f6ef6eb
commit
06e554c53e
@ -15,7 +15,7 @@ pub mod d14;
|
||||
pub mod d15;
|
||||
pub mod d16;
|
||||
pub mod d17;
|
||||
// pub mod d18;
|
||||
pub mod d18;
|
||||
// pub mod d19;
|
||||
// pub mod d20;
|
||||
// pub mod d21;
|
||||
|
||||
64
src/days/d18.rs
Normal file
64
src/days/d18.rs
Normal file
@ -0,0 +1,64 @@
|
||||
use crate::prelude::*;
|
||||
|
||||
pub type I = &'static str;
|
||||
pub type O = usize;
|
||||
|
||||
// @TODO: try bit mast approach
|
||||
fn _solve (data: I, rows: usize) -> O {
|
||||
let w = data.len();
|
||||
let mut v = vec![data.to_owned()];
|
||||
|
||||
while v.len() < rows {
|
||||
let mut v2 = String::new();
|
||||
let prev = &v[v.len() - 1].chars().collect_vec();
|
||||
|
||||
for i in 0..w {
|
||||
let next = match (
|
||||
i.checked_sub(1).map(|i| prev.get(i)).flatten().unwrap_or(&'.'),
|
||||
prev.get(i).unwrap_or(&'.'),
|
||||
prev.get(i+1).unwrap_or(&'.')
|
||||
) {
|
||||
('^', '^', '.') | ('.', '^', '^') | ('^', '.', '.') | ('.', '.', '^') => '^',
|
||||
_ => '.'
|
||||
};
|
||||
|
||||
v2.push(next);
|
||||
}
|
||||
v.push(v2);
|
||||
}
|
||||
v.concat().chars().filter(|&c| c == '.').count()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
fn read () -> I {
|
||||
inc!(18).trim()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example () {
|
||||
let data = ".^^.^.^^^^";
|
||||
let ans = _solve(data, 10);
|
||||
assert_eq!(ans, 38);
|
||||
|
||||
let data = "..^^.";
|
||||
let ans = _solve(data, 3);
|
||||
assert_eq!(ans, 6);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn silver () {
|
||||
let data = read();
|
||||
let ans = _solve(data, 40);
|
||||
assert_eq!(ans, 1982)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gold () {
|
||||
let data = read();
|
||||
let ans = _solve(data, 400_000);
|
||||
assert_eq!(ans, 20005203)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user