Skip to content

Commit

Permalink
Add spiral matrix exercise (#1636)
Browse files Browse the repository at this point in the history
* bin/configlet create --practice-exercise spiral-matrix

* Add spiral-matrix exercise difficulty

* Add sprial_matrix.rb stub file

* Add spiral-matrix test cases

* Example spiral-matrix implementation

Co-authored-by: KOTP <[email protected]>

* Update exercises/practice/spiral-matrix/.docs/instructions.md

Co-authored-by: Victor Goff <[email protected]>

---------

Co-authored-by: KOTP <[email protected]>
  • Loading branch information
ccadden and kotp authored Feb 14, 2024
1 parent 0aa2712 commit dfcb5b1
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,14 @@
],
"difficulty": 5
},
{
"slug": "spiral-matrix",
"name": "Spiral Matrix",
"uuid": "44f6c85e-a99c-4bf1-9269-67d9f25e93df",
"practices": [],
"prerequisites": [],
"difficulty": 5
},
{
"slug": "sum-of-multiples",
"name": "Sum of Multiples",
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.

## 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
```
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": [
"mr-sigma"
],
"files": {
"solution": [
"spiral_matrix.rb"
],
"test": [
"spiral_matrix_test.rb"
],
"example": [
".meta/example.rb"
]
},
"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://web.archive.org/web/20230607064729/https://old.reddit.com/r/dailyprogrammer/comments/6i60lr/20170619_challenge_320_easy_spiral_ascension/"
}
48 changes: 48 additions & 0 deletions exercises/practice/spiral-matrix/.meta/example.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
class SpiralMatrix
private
attr_reader :counter, :dx, :dy, :x, :y

def initialize_matrix
Array.new(size) { Array.new(size, 0) }
end

def generate_matrix
while matrix_includes_zeroes?
@matrix[y][x] = counter

@dy, @dx = @dx, -@dy if next_step_invalid?

@x += dx
@y += dy

@counter += 1
end
end

def next_step_invalid?
@y + @dy == @size ||
(@y + @dy).negative? ||
@x + @dx == @size ||
(@x + @dx).negative? ||
(@matrix[@y + @dy][@x + @dx]).positive?
end

def matrix_includes_zeroes?
@matrix.any? { |row| row.any?(0) }
end

public
attr_reader :size, :matrix

def initialize(size)
@size = size
@matrix = initialize_matrix
@dx = 1
@dy = 0
@y = 0
@x = 0
@counter = 1

generate_matrix
end
end
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"
7 changes: 7 additions & 0 deletions exercises/practice/spiral-matrix/spiral_matrix.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
=begin
Write your code for the 'Spiral Matrix' exercise in this file. Make the tests in
`spiraL_matrix_test.rb` pass.
To get started with TDD, see the `README.md` file in your
`ruby/spiral-matrix` directory.
=end
64 changes: 64 additions & 0 deletions exercises/practice/spiral-matrix/spiral_matrix_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
require 'minitest/autorun'
require_relative 'spiral_matrix'

class SpiralMatrixTest < Minitest::Test
def test_empty_spiral
# skip
spiral = SpiralMatrix.new(0).matrix
expected = []
assert_equal expected, spiral
end

def test_trivial_spiral
skip
spiral = SpiralMatrix.new(1).matrix
expected = [[1]]
assert_equal expected, spiral
end

def test_spiral_of_size_2
skip
spiral = SpiralMatrix.new(2).matrix
expected = [
[1, 2],
[4, 3]
]
assert_equal expected, spiral
end

def test_spiral_of_size_3
skip
spiral = SpiralMatrix.new(3).matrix
expected = [
[1, 2, 3],
[8, 9, 4],
[7, 6, 5]
]
assert_equal expected, spiral
end

def test_spiral_of_size_4
skip
spiral = SpiralMatrix.new(4).matrix
expected = [
[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]
]
assert_equal expected, spiral
end

def test_spiral_of_size_5
skip
spiral = SpiralMatrix.new(5).matrix
expected = [
[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]
]
assert_equal expected, spiral
end
end

0 comments on commit dfcb5b1

Please sign in to comment.