diff --git a/.gitignore b/.gitignore index 901b6e6..50a623b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ */target/ +*/Cargo.lock diff --git a/spiral_matrix/Cargo.lock b/spiral_matrix/Cargo.lock new file mode 100644 index 0000000..8875b80 --- /dev/null +++ b/spiral_matrix/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "spiral_matrix" +version = "0.1.0" diff --git a/where_will_the_ball_fall/Cargo.toml b/where_will_the_ball_fall/Cargo.toml new file mode 100644 index 0000000..6a5eb55 --- /dev/null +++ b/where_will_the_ball_fall/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "where_will_the_ball_fall" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/where_will_the_ball_fall/src/main.rs b/where_will_the_ball_fall/src/main.rs new file mode 100644 index 0000000..85d994e --- /dev/null +++ b/where_will_the_ball_fall/src/main.rs @@ -0,0 +1,59 @@ +fn find_ball(grid: Vec>) -> Vec { + let balls = grid[0].len(); + let mut res = vec![-1; balls]; + + for ball in 0..balls { + let mut pos = ball; + let mut stuck = false; + for row in grid.iter() { + if let Some(npos) = can_fall(pos, row) { + pos = npos as usize; + } else { + stuck = true; + break; + } + } + if !stuck { + res[ball] = pos as i32; + } + } + + res +} + +fn can_fall(pos: usize, row: &[i32]) -> Option { + // + let mut res = None; + let len = row.len(); + match row[pos] { + 1 => { + if pos < len.saturating_sub(1) { + let right = row[pos + 1]; + if right > 0 { + res = Some(pos as i32 + 1); + } + } + } + _ => { + if pos > 0 { + let left = row[pos - 1]; + if left < 0 { + res = Some(pos as i32 - 1); + } + } + } + } + res +} + +fn main() { + let res = find_ball(vec![ + vec![1, 1, 1, -1, -1], + vec![1, 1, 1, -1, -1], + vec![-1, -1, -1, 1, 1], + vec![1, 1, 1, 1, -1], + vec![-1, -1, -1, -1, -1], + ]); + + dbg!(res); +}