diff options
author | mhsn <mail@mhsn.net> | 2025-06-03 13:58:21 +0000 |
---|---|---|
committer | mhsn <mail@mhsn.net> | 2025-06-03 13:58:21 +0000 |
commit | d9088a9fbfda5bcaddaf41bf7be4cd2298eb7a07 (patch) | |
tree | ef278f23353c77142d980c816bd0903bb03e5f29 /lib/rust/src/lib.rs | |
parent | 276044e1b6080790e582c82d1b48591b715488b5 (diff) | |
download | aoc-master.tar.gz aoc-master.zip |
Diffstat (limited to 'lib/rust/src/lib.rs')
-rw-r--r-- | lib/rust/src/lib.rs | 99 |
1 files changed, 1 insertions, 98 deletions
diff --git a/lib/rust/src/lib.rs b/lib/rust/src/lib.rs index 060439f..f7a1b46 100644 --- a/lib/rust/src/lib.rs +++ b/lib/rust/src/lib.rs @@ -1,98 +1 @@ -#[derive(Debug)] -pub struct Grid<T> { - grid: Vec<Vec<T>>, -} - -impl<T> Grid<T> { - pub fn new(grid: Vec<Vec<T>>) -> Grid<T> { - Grid { grid } - } - - pub fn points(&self) -> impl Iterator<Item = (usize, usize)> { - (0..self.grid.len()) - .flat_map(|y| (0..self.grid.first().unwrap_or(&Vec::new()).len()).map(move |x| (x, y))) - } - - pub fn ray(&self, (x, y): (usize, usize), (dx, dy): (i64, i64)) -> impl Iterator<Item = &T> { - let (x, y) = (i64::try_from(x).unwrap(), i64::try_from(y).unwrap()); - (0..) - .map(move |n| { - self.grid - .get(usize::try_from(y + n * dy).ok()?) - .and_then(|row| row.get(usize::try_from(x + n * dx).ok()?)) - }) - .take_while(Option::is_some) - .flatten() - } -} - -#[cfg(test)] -mod tests { - use std::collections::HashSet; - - use super::*; - - #[test] - fn create_grid() { - let _grid = Grid::new(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]); - } - - #[test] - fn points_empty() { - let grid = Grid::<u64>::new(vec![vec![]]); - assert!(grid.points().eq(vec![])) - } - - #[test] - fn points_equal_size() { - let grid = Grid::new(vec![vec![1, 2], vec![3, 4]]); - let points = grid.points().collect::<HashSet<_>>(); - assert_eq!( - points, - [(0, 0), (0, 1), (1, 0), (1, 1)].iter().cloned().collect() - ) - } - - #[test] - fn points_unequal_size() { - let grid = Grid::new(vec![vec![1, 2], vec![3, 4], vec![5, 6]]); - let points = grid.points().collect::<HashSet<_>>(); - assert_eq!( - points, - [(0, 0), (1, 0), (0, 1), (1, 1), (0, 2), (1, 2)] - .iter() - .cloned() - .collect() - ) - } - - #[test] - fn ray_empty() { - let grid = Grid::<u64>::new(vec![vec![]]); - assert!(grid.ray((1, 1), (1, 2)).eq(vec![].iter())) - } - - #[test] - fn ray_single_element() { - let grid = Grid::<u64>::new(vec![vec![1]]); - assert!(grid.ray((0, 0), (1, 2)).eq(vec![1].iter())) - } - - #[test] - fn ray_horizontal() { - let grid = Grid::new(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]); - assert!(grid.ray((0, 0), (1, 0)).eq(vec![1, 2, 3].iter())) - } - - #[test] - fn ray_vertical() { - let grid = Grid::new(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]); - assert!(grid.ray((1, 0), (0, 1)).eq(vec![2, 5, 8].iter())) - } - - #[test] - fn ray_diagonal() { - let grid = Grid::new(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]); - assert!(grid.ray((0, 0), (1, 2)).eq(vec![1, 8].iter())) - } -} +pub mod grid; |