Skip to content

Commit

Permalink
[New Exercise]: Spiral Matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
glaxxie committed Sep 23, 2023
1 parent d7f815a commit 5cfaa7e
Show file tree
Hide file tree
Showing 7 changed files with 236 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,14 @@
"prerequisites": [],
"difficulty": 4
},
{
"slug": "spiral-matrix",
"name": "Spiral Matrix",
"uuid": "37534530-58c2-4993-ae27-9e743058dc8f",
"practices": [],
"prerequisites": [],
"difficulty": 4
},
{
"slug": "complex-numbers",
"name": "Complex Numbers",
Expand Down
24 changes: 24 additions & 0 deletions exercises/practice/spiral-matrix/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Instructions

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:

## Examples

### Spiral matrix of size 3

```text
1 2 3
8 9 4
7 6 5
```

### Spiral matrix of size 4

```text
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
```
64 changes: 64 additions & 0 deletions exercises/practice/spiral-matrix/.meta/SpiralMatrix.example.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
Function Get-SpiralMatrix() {
<#
.SYNOPSIS
Implement a function to generate a spiral matrix.
.DESCRIPTION
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
.PARAMETER Size
Size of the matrix.
.EXAMPLE
Get-SpiralMatrix -Size 2
Return: @(
@(1,2),
@(4,3)
)
#>
[CmdletBinding()]
Param(
[int]$Size
)

enum Dir {
RIGHT
DOWN
LEFT
UP
}

$matrix = @()
for ($i = 0; $i -lt $Size; $i++) {
$matrix += ,(@($null) * $Size)
}

$top = $left = 0
$bottom = $right = $Size - 1
$dir = [Dir]::RIGHT
$value = 1

while (($bottom -ge $top) -and ($right -ge $left)) {
switch ($dir) {
RIGHT {
$left..$right | ForEach-Object { $matrix[$top][$_] = $value; $value++ }
$top++
}
DOWN {
$top..$bottom | ForEach-Object { $matrix[$_][$right] = $value; $value++ }
$right--
}
LEFT {
$right..$left | ForEach-Object { $matrix[$bottom][$_] = $value; $value++ }
$bottom--
}
default {
$bottom..$top | ForEach-Object { $matrix[$_][$left] = $value; $value++ }
$left++
}
}
$dir = ($dir + 1) % 4
}
$matrix
}
19 changes: 19 additions & 0 deletions exercises/practice/spiral-matrix/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"glaxxie"
],
"files": {
"solution": [
"SpiralMatrix.ps1"
],
"test": [
"SpiralMatrix.tests.ps1"
],
"example": [
".meta/SpiralMatrix.example.ps1"
]
},
"blurb": "Given the size, return a square matrix of numbers in spiral order.",
"source": "Reddit r/dailyprogrammer challenge #320 [Easy] Spiral Ascension.",
"source_url": "https://www.reddit.com/r/dailyprogrammer/comments/6i60lr/20170619_challenge_320_easy_spiral_ascension/"
}
28 changes: 28 additions & 0 deletions exercises/practice/spiral-matrix/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[8f584201-b446-4bc9-b132-811c8edd9040]
description = "empty spiral"

[e40ae5f3-e2c9-4639-8116-8a119d632ab2]
description = "trivial spiral"

[cf05e42d-eb78-4098-a36e-cdaf0991bc48]
description = "spiral of size 2"

[1c475667-c896-4c23-82e2-e033929de939]
description = "spiral of size 3"

[05ccbc48-d891-44f5-9137-f4ce462a759d]
description = "spiral of size 4"

[f4d2165b-1738-4e0c-bed0-c459045ae50d]
description = "spiral of size 5"
25 changes: 25 additions & 0 deletions exercises/practice/spiral-matrix/SpiralMatrix.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
Function Get-SpiralMatrix() {
<#
.SYNOPSIS
Implement a function to generate a spiral matrix.
.DESCRIPTION
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
.PARAMETER Size
Size of the matrix.
.EXAMPLE
Get-SpiralMatrix -Size 2
Return: @(
@(1,2),
@(4,3)
)
#>
[CmdletBinding()]
Param(
[int]$Size
)
Throw "Please implement this function"
}
68 changes: 68 additions & 0 deletions exercises/practice/spiral-matrix/SpiralMatrix.tests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
BeforeAll {
. "./SpiralMatrix.ps1"
}

Describe "SpiralMatrix test cases" {
It "empty spiral" {
$got = Get-SpiralMatrix -Size 0
$want = @()

$got | Should -BeExactly $want
}

It "trivial spiral" {
$got = Get-SpiralMatrix -Size 1
$want = @(
,@(1)
)

$got | Should -BeExactly $want
}

It "spiral of size 2" {
$got = Get-SpiralMatrix -Size 2
$want = @(
@(1,2),
@(4,3)
)

$got | Should -BeExactly $want
}

It "spiral of size 3" {
$got = Get-SpiralMatrix -Size 3
$want = @(
@(1,2,3),
@(8,9,4),
@(7,6,5)
)

$got | Should -BeExactly $want
}

It "spiral of size 4" {
$got = Get-SpiralMatrix -Size 4
$want = @(
@( 1, 2, 3,4),
@(12,13,14,5),
@(11,16,15,6),
@(10, 9, 8,7)
)

$got | Should -BeExactly $want
}

It "spiral of size 5" {
$got = Get-SpiralMatrix -Size 5
$want = @(
@( 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)
)

$got | Should -BeExactly $want
}

}

0 comments on commit 5cfaa7e

Please sign in to comment.