From 6875c88c3d5a4b699d588bdf95befaec0c9a18e1 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Wed, 13 Jul 2022 13:18:30 +0100 Subject: [rust] Minesweeper --- rust/minesweeper/src/lib.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 rust/minesweeper/src/lib.rs (limited to 'rust/minesweeper/src/lib.rs') diff --git a/rust/minesweeper/src/lib.rs b/rust/minesweeper/src/lib.rs new file mode 100644 index 0000000..febfdb3 --- /dev/null +++ b/rust/minesweeper/src/lib.rs @@ -0,0 +1,25 @@ +static OFFSETS: &'static[(i32,i32)] = &[ + (-1,-1), (-1, 0), (-1, 1), + ( 0,-1), ( 0, 1), + ( 1,-1), ( 1, 0), ( 1, 1) +]; + +pub fn annotate(minefield: &[&str]) -> Vec { + let height = minefield.len() as i32; + (0..height).map(|i| { + let width = minefield[i as usize].len() as i32; + (0..width).map(|j| { + if minefield[i as usize].as_bytes()[j as usize] == b' ' { + let count = OFFSETS + .iter() + .map(|(oi,oj)| (i+oi,j+oj)) + .filter(|&(i,j)| i >= 0 && i < height && j >= 0 && j < width) + .filter(|&(i,j)| minefield[i as usize].as_bytes()[j as usize] == b'*') + .count(); + if count > 0 { char::from_digit(count as u32,10).unwrap() } else { ' ' } + } else { + '*' + } + }).collect() + }).collect() +} -- cgit v1.2.3