ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# DzungTmd's solution

## to Spiral Matrix in the Julia Track

Published at Mar 22 2021 · 0 comments
Instructions
Test suite
Solution

Given the size, return a square matrix of numbers in spiral order.

The matrix should be filled with natural numbers, starting from 1 in the top-left corner, increasing in an inward, clockwise spiral order, like these examples:

###### Spiral matrix of size 3
``````1 2 3
8 9 4
7 6 5
``````
###### Spiral matrix of size 4
`````` 1  2  3 4
12 13 14 5
11 16 15 6
10  9  8 7
``````

## Source

Reddit r/dailyprogrammer challenge #320 [Easy] Spiral Ascension. https://www.reddit.com/r/dailyprogrammer/comments/6i60lr/20170619_challenge_320_easy_spiral_ascension/

## Version compatibility

This exercise has been tested on Julia versions >=1.0.

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### runtests.jl

``````using Test

include("spiral-matrix.jl")

@testset "Different valid values" begin
@testset "Empty spiral" begin
@test spiral_matrix(0) == Matrix{Int}(undef,0,0)
end
@testset "Trivial spiral" begin
@test spiral_matrix(1) == reshape([1],(1,1))
end
@testset "Spiral of size 2" begin
@test spiral_matrix(2) == [1 2; 4 3]
end
@testset "Spiral of size 3" begin
@test spiral_matrix(3) == [1 2 3; 8 9 4; 7 6 5]
end
@testset "Spiral of size 4" begin
@test spiral_matrix(4) == [1 2 3 4; 12 13 14 5; 11 16 15 6; 10 9 8 7]
end
@testset "Spiral of size 5" begin
@test spiral_matrix(5) == [1 2 3 4 5; 16 17 18 19 6; 15 24 25 20 7; 14 23 22 21 8; 13 12 11 10 9]
end
end``````
``````"""
Spiral matrix: The solution is motivated by the Robot-simulation exercise
and the turtle programming on Reddit.
Note: One can easily modify it to make a counter clockwise spiral matrix
"""

@enum Direction N=0 E=1 S=2 W=3
mutable struct Robot
Pos
end
end
function turn_right!(r::Robot)
return r
end
function turn_left!(r::Robot)
return r
end
(r.Head == N) && (r.Pos[1] = r.Pos[1]-1);
(r.Head == E) && (r.Pos[2] = r.Pos[2]+1);
(r.Head == S) && (r.Pos[1] = r.Pos[1]+1);
(r.Head == W) && (r.Pos[2] = r.Pos[2]-1);
return r
end
function retreat!(r::Robot)
(r.Head == N) && (r.Pos[1] = r.Pos[1]+1);
(r.Head == E) && (r.Pos[2] = r.Pos[2]-1);
(r.Head == S) && (r.Pos[1] = r.Pos[1]-1);
(r.Head == W) && (r.Pos[2] = r.Pos[2]+1);
return r
end

function spiral_matrix(n)
A = zeros(Int,n,n);
R = Robot([1,1],E)
current_val = 1;
while (current_val <= n^2)
A[R.Pos...] = current_val;
if (max(R.Pos...)>n) || (min(R.Pos...)<1) || (A[R.Pos...] â‰  0)
end
current_val += 1
end
return A
end``````