From 91a0ba214d07b7ee272dc179f997240a3ca1f1c2 Mon Sep 17 00:00:00 2001 From: mhsn Date: Mon, 2 Jun 2025 15:30:07 +0000 Subject: rust lib: add grid and ray --- lib/rust/Cargo.lock | 7 +++++++ lib/rust/src/lib.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 lib/rust/Cargo.lock diff --git a/lib/rust/Cargo.lock b/lib/rust/Cargo.lock new file mode 100644 index 0000000..eee204e --- /dev/null +++ b/lib/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aoc" +version = "0.1.0" diff --git a/lib/rust/src/lib.rs b/lib/rust/src/lib.rs index b93cf3f..25c82db 100644 --- a/lib/rust/src/lib.rs +++ b/lib/rust/src/lib.rs @@ -1,5 +1,24 @@ -pub fn add(left: u64, right: u64) -> u64 { - left + right +#[derive(Debug)] +pub struct Grid { + grid: Vec>, +} + +impl Grid { + pub fn new(grid: Vec>) -> Grid { + Grid { grid } + } + + pub fn ray(&self, (x, y): (usize, usize), (dx, dy): (i64, i64)) -> impl Iterator { + 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).unwrap()) + .and_then(|row| row.get(usize::try_from(x + n * dx).unwrap())) + }) + .take_while(Option::is_some) + .flatten() + } } #[cfg(test)] @@ -7,8 +26,35 @@ mod tests { use super::*; #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + fn create_grid() { + let _grid = Grid::new(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]); + } + + #[test] + fn ray_empty() { + let grid = Grid::::new(vec![vec![]]); + assert!(grid.ray((1, 1), (1, 2)).eq(vec![].iter())) + } + + #[test] + fn ray_single_element() { + let grid = Grid::::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())) } } -- cgit v1.2.3