Spiral matrix: Difference between revisions
Content added Content deleted
(Added Wren) |
m (Added Rust code) |
||
Line 4,501: | Line 4,501: | ||
spiral_matrix(5)</lang> |
spiral_matrix(5)</lang> |
||
=={{header|Rust}}== |
|||
<lang rust>const VECTORS: [(isize, isize); 4] = [(1, 0), (0, 1), (-1, 0), (0, -1)]; |
|||
pub fn spiral_matrix(size: usize) -> Vec<Vec<u32>> { |
|||
let mut matrix = vec![vec![0; size]; size]; |
|||
let mut movement = VECTORS.iter().cycle(); |
|||
let (mut x, mut y, mut n) = (-1, 0, 1..); |
|||
for (move_x, move_y) in std::iter::once(size) |
|||
.chain((1..size).rev().flat_map(|n| std::iter::repeat(n).take(2))) |
|||
.flat_map(|steps| std::iter::repeat(movement.next().unwrap()).take(steps)) |
|||
{ |
|||
x += move_x; |
|||
y += move_y; |
|||
matrix[y as usize][x as usize] = n.next().unwrap(); |
|||
} |
|||
matrix |
|||
} |
|||
fn main() { |
|||
for i in spiral_matrix(4).iter() { |
|||
for j in i.iter() { |
|||
print!("{:>2} ", j); |
|||
} |
|||
println!(); |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
0 1 2 3 4 |
|||
15 16 17 18 5 |
|||
14 23 24 19 6 |
|||
13 22 21 20 7 |
|||
12 11 10 9 8 |
|||
</pre> |
|||
=={{header|Scala}}== |
=={{header|Scala}}== |