Working, with help from takeuntil
This commit is contained in:
parent
81a992ff65
commit
e0b38be791
|
@ -12,6 +12,7 @@ dependencies = [
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"path-clean",
|
"path-clean",
|
||||||
|
"take-until",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -127,6 +128,12 @@ dependencies = [
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "take-until"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b4e17d8598067a8c134af59cd33c1c263470e089924a11ab61cf61690919fe3b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-xid"
|
name = "unicode-xid"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
@ -13,3 +13,4 @@ itertools = "0.10.5"
|
||||||
nom = "7.1.1"
|
nom = "7.1.1"
|
||||||
path-clean = "0.1.0"
|
path-clean = "0.1.0"
|
||||||
grid = "0.9.0"
|
grid = "0.9.0"
|
||||||
|
take-until = "0.1.0"
|
||||||
|
|
|
@ -4,6 +4,7 @@ use std::fs;
|
||||||
use std::io::{self, BufRead};
|
use std::io::{self, BufRead};
|
||||||
|
|
||||||
use grid::Grid;
|
use grid::Grid;
|
||||||
|
use take_until::TakeUntilExt;
|
||||||
|
|
||||||
struct Tree {
|
struct Tree {
|
||||||
height: u8,
|
height: u8,
|
||||||
|
@ -38,7 +39,7 @@ fn main() {
|
||||||
println!("PART 1 ---------------");
|
println!("PART 1 ---------------");
|
||||||
part1(&mut grid);
|
part1(&mut grid);
|
||||||
println!("\nPART 2 ---------------");
|
println!("\nPART 2 ---------------");
|
||||||
part2(&mut grid);
|
part2(&grid);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part1(grid: &mut Grid<Tree>) {
|
fn part1(grid: &mut Grid<Tree>) {
|
||||||
|
@ -68,49 +69,19 @@ fn part1(grid: &mut Grid<Tree>) {
|
||||||
dbg!(grid.iter().filter(|t| t.visible).count());
|
dbg!(grid.iter().filter(|t| t.visible).count());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scenic_score(grid: &Grid<Tree>, (row, col): (usize, usize)) -> u32 {
|
fn scenic_score(tree: &Tree, grid: &Grid<Tree>, (row, col): (usize, usize)) -> usize {
|
||||||
fn count_visible((i, max): (u32, u32), tree: &Tree) -> (u32, u32) {
|
fn count_visible<'a>(tree: &Tree, iter: impl Iterator<Item = Option<&'a Tree>>) -> usize {
|
||||||
if tree.height as u32 >= max {
|
iter.flatten()
|
||||||
(i, tree.height as u32)
|
.take_until(|t| t.height >= tree.height)
|
||||||
} else {
|
.count()
|
||||||
(i + 1, max)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let (rows, cols) = grid.size();
|
let (rows, cols) = grid.size();
|
||||||
|
|
||||||
let (a, _) = if row > 0 {
|
let a = count_visible(tree, (0..row).rev().map(|r| grid.get(r, col)));
|
||||||
(0..row - 1)
|
let b = count_visible(tree, (row + 1..rows).map(|r| grid.get(r, col)));
|
||||||
.rev()
|
let c = count_visible(tree, (0..col).rev().map(|c| grid.get(row, c)));
|
||||||
.map(|r| grid.get(r, col).unwrap())
|
let d = count_visible(tree, (col + 1..cols).map(|c| grid.get(row, c)));
|
||||||
.fold((1, 0), count_visible)
|
|
||||||
} else {
|
|
||||||
(0, 0)
|
|
||||||
};
|
|
||||||
let (b, _) = if row < rows - 1 {
|
|
||||||
(row + 1..rows)
|
|
||||||
.map(|r| grid.get(r, col).unwrap())
|
|
||||||
.fold((1, 0), count_visible)
|
|
||||||
} else {
|
|
||||||
(0, 0)
|
|
||||||
};
|
|
||||||
let (c, _) = if col > 0 {
|
|
||||||
(0..col - 1)
|
|
||||||
.rev()
|
|
||||||
.map(|c| grid.get(row, c).unwrap())
|
|
||||||
.fold((1, 0), count_visible)
|
|
||||||
} else {
|
|
||||||
(0, 0)
|
|
||||||
};
|
|
||||||
let (d, _) = if col < cols - 1 {
|
|
||||||
(col + 1..cols)
|
|
||||||
.map(|c| grid.get(row, c).unwrap())
|
|
||||||
.fold((1, 0), count_visible)
|
|
||||||
} else {
|
|
||||||
(0, 0)
|
|
||||||
};
|
|
||||||
|
|
||||||
println!("{},{}: {}, {}, {}, {}", row, col, a, b, c, d);
|
|
||||||
|
|
||||||
a * b * c * d
|
a * b * c * d
|
||||||
}
|
}
|
||||||
|
@ -120,8 +91,9 @@ fn part2(grid: &Grid<Tree>) {
|
||||||
dbg!(grid
|
dbg!(grid
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, _)| scenic_score(grid, (i / cols, i % cols)))
|
.map(|(i, t)| scenic_score(t, grid, (i / cols, i % cols)))
|
||||||
.max());
|
.max()
|
||||||
|
.unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -141,10 +113,10 @@ mod tests {
|
||||||
let vec: Vec<Tree> = grid.iter().map(|n| Tree::new(*n)).collect();
|
let vec: Vec<Tree> = grid.iter().map(|n| Tree::new(*n)).collect();
|
||||||
let grid = Grid::from_vec(vec, 5);
|
let grid = Grid::from_vec(vec, 5);
|
||||||
|
|
||||||
let scores: Vec<u32> = grid
|
let scores: Vec<usize> = grid
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, _)| scenic_score(&grid, (i / 5, i % 5)))
|
.map(|(i, t)| scenic_score(t, &grid, (i / 5, i % 5)))
|
||||||
.collect();
|
.collect();
|
||||||
dbg!(&scores);
|
dbg!(&scores);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue