diff options
author | mhsn <mail@mhsn.net> | 2025-06-02 15:30:07 +0000 |
---|---|---|
committer | mhsn <mail@mhsn.net> | 2025-06-02 15:30:07 +0000 |
commit | 91a0ba214d07b7ee272dc179f997240a3ca1f1c2 (patch) | |
tree | df55f27da646bf1a3ad4c59830c31f23f831952c | |
parent | ae3acaeb584becea70d584313fc2a249c229c0d9 (diff) | |
download | aoc-91a0ba214d07b7ee272dc179f997240a3ca1f1c2.tar.gz aoc-91a0ba214d07b7ee272dc179f997240a3ca1f1c2.zip |
rust lib: add grid and ray
-rw-r--r-- | lib/rust/Cargo.lock | 7 | ||||
-rw-r--r-- | lib/rust/src/lib.rs | 56 |
2 files changed, 58 insertions, 5 deletions
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<T> { + grid: Vec<Vec<T>>, +} + +impl<T> Grid<T> { + pub fn new(grid: Vec<Vec<T>>) -> Grid<T> { + Grid { grid } + } + + 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).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::<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())) } } |