diff --git a/config.json b/config.json index 1d22c21285..1c04e6cccf 100644 --- a/config.json +++ b/config.json @@ -724,6 +724,18 @@ "text formatting" ] }, + { + "uuid": "666fda78-851e-4bb0-a416-953528f46bd7", + "slug": "spiral-matrix", + "core": false, + "unlocked_by": null, + "difficulty": 2, + "topics": [ + "algorithms", + "control-flow (loops)", + "lists" + ] + }, { "uuid": "ecc97fc6-2e72-4325-9b67-b56c83b13a91", "slug": "grep", diff --git a/exercises/spiral-matrix/README.md b/exercises/spiral-matrix/README.md new file mode 100644 index 0000000000..99727c0f45 --- /dev/null +++ b/exercises/spiral-matrix/README.md @@ -0,0 +1,32 @@ +# 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 +``` +## 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. diff --git a/exercises/spiral-matrix/example.py b/exercises/spiral-matrix/example.py new file mode 100644 index 0000000000..cb26acf9f6 --- /dev/null +++ b/exercises/spiral-matrix/example.py @@ -0,0 +1,11 @@ +def spiral(size): + m = [[0] * size for i in range(size)] + dx, dy = [0, 1, 0, -1], [1, 0, -1, 0] + x, y, c = 0, -1, 1 + for k in range(2*size - 1): + for j in range((2*size - k) // 2): + x += dx[k % 4] + y += dy[k % 4] + m[x][y] = c + c += 1 + return m diff --git a/exercises/spiral-matrix/spiral_matrix.py b/exercises/spiral-matrix/spiral_matrix.py new file mode 100644 index 0000000000..5eaa311cb8 --- /dev/null +++ b/exercises/spiral-matrix/spiral_matrix.py @@ -0,0 +1,2 @@ +def spiral(size): + pass diff --git a/exercises/spiral-matrix/spiral_matrix_test.py b/exercises/spiral-matrix/spiral_matrix_test.py new file mode 100644 index 0000000000..aea31342b1 --- /dev/null +++ b/exercises/spiral-matrix/spiral_matrix_test.py @@ -0,0 +1,40 @@ +import unittest + +from spiral_matrix import spiral + +# Tests are based on the version 1.0.0 of: +# https://github.com/exercism/problem-specifications/blob/master/exercises/spiral-matrix/canonical-data.json + + +class SpiralMatrixTest(unittest.TestCase): + def test_spiral_matrix_of_0(self): + self.assertEqual(spiral(0), []) + + def test_spiral_matrix_of_1(self): + self.assertEqual(spiral(1), [[1]]) + + def test_spiral_matrix_of_2(self): + self.assertEqual(spiral(2), [[1, 2], + [4, 3]]) + + def test_spiral_matrix_of_3(self): + self.assertEqual(spiral(3), [[1, 2, 3], + [8, 9, 4], + [7, 6, 5]]) + + def test_spiral_matrix_of_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_of_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()