Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add spiral-matrix #1170

Merged
merged 13 commits into from
Jan 28, 2018
12 changes: 12 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,18 @@
"sets"
]
},
{
"uuid": "b0c7cf95-6470-4c1a-8eaa-6775310926a2",
"slug": "spiral-matrix",
"core": false,
"unlocked_by": null,
"difficulty": 2,
"topics": [
"algorithms",
"control-flow",
"lists"
]
},
{
"uuid": "e7351e8e-d3ff-4621-b818-cd55cf05bffd",
"slug": "accumulate",
Expand Down
42 changes: 42 additions & 0 deletions exercises/spiral-matrix/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Spiral Matrix


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

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

##### Spiral matrix of size 4

```plain
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
```

## Submitting Exercises

Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.

For example, if you're submitting `bob.py` for the Bob exercise, the submit command would be something like `exercism submit <path_to_exercism_dir>/python/bob/bob.py`.

For more detailed information about running tests, code style and linting,
please see the [help page](http://exercism.io/languages/python).

## Source

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

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

11 changes: 11 additions & 0 deletions exercises/spiral-matrix/example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
def spiral(size):
sm = [[0]*size for k in range(size)]
i, j, el = 0, -1, 1
di, dj = [0, 1, 0, -1], [1, 0, -1, 0]
for x in range(2*size - 1):
for y in range((2*size - x) // 2):
i += di[x % 4]
j += dj[x % 4]
sm[i][j] = el
el += 1
return sm
2 changes: 2 additions & 0 deletions exercises/spiral-matrix/spiral_matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def spiral(size):
pass
38 changes: 38 additions & 0 deletions exercises/spiral-matrix/spiral_matrix_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import unittest

from spiral_matrix import spiral

# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you move this line down by one to be more consistent with the other test files?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, @N-Parsons ,will do.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe for full consistency, you the spacing should be 2 blank lines above, one below (see below):

from spiral_matrix...


# Tests adapted from...

class...


Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a comment referencing the current version of the canonical data. For the format of this comment, please see #784.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Thanks for the hint.

class SpiralMatrixTest(unittest.TestCase):
def test_spiral_matrix_with_size_0(self):
self.assertEqual(spiral(0), [])

def test_spiral_matrix_with_size_1(self):
self.assertEqual(spiral(1), [[1]])

def test_spiral_matrix_with_size_2(self):
self.assertEqual(spiral(2), [[1, 2],
[4, 3]])

def test_spiral_matrix_with_size_3(self):
self.assertEqual(spiral(3), [[1, 2, 3],
[8, 9, 4],
[7, 6, 5]])

def test_spiral_matrix_with_size_4(self):
self.assertEqual(spiral(4), [[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]])

def test_spiral_matrix_with_size_5(self):
self.assertEqual(spiral(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]])


if __name__ == '__main__':
unittest.main()