Skip to content

Commit

Permalink
Add spiral-matrix exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
keiravillekode committed Jun 2, 2024
1 parent 967f1d1 commit d19d27c
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 2 deletions.
12 changes: 10 additions & 2 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -458,10 +458,10 @@
"practices": [],
"prerequisites": [],
"difficulty": 2,
"status": "deprecated",
"topics": [
"math"
],
"status": "deprecated"
]
},
{
"slug": "two-fer",
Expand Down Expand Up @@ -715,6 +715,14 @@
"prerequisites": [],
"difficulty": 5
},
{
"slug": "spiral-matrix",
"name": "Spiral Matrix",
"uuid": "4ce2b869-140a-4d5d-90dd-6fc717ef7696",
"practices": [],
"prerequisites": [],
"difficulty": 5
},
{
"slug": "word-count",
"name": "Word Count",
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
```
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": [
"keiravillekode"
],
"files": {
"solution": [
"spiral-matrix.el"
],
"test": [
"spiral-matrix-test.el"
],
"example": [
".meta/example.el"
]
},
"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/"
}
41 changes: 41 additions & 0 deletions exercises/practice/spiral-matrix/.meta/example.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
;;; spiral-matrix.el --- Spiral Matrix (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:

(require 'cl-lib)

(defun spiral-matrix (size)
(let* ((result (make-vector size nil))
(value 1)
(row 0)
(column 0)
(side (1- size)))
(cl-loop for r below size
do (aset result r (make-vector size (* size size))))
(while (>= side 1)
(cl-loop repeat side
do (aset (aref result row) column value)
do (setq value (1+ value))
do (setq column (1+ column)))
(cl-loop repeat side
do (aset (aref result row) column value)
do (setq value (1+ value))
do (setq row (1+ row)))
(cl-loop repeat side
do (aset (aref result row) column value)
do (setq value (1+ value))
do (setq column (1- column)))
(cl-loop repeat side
do (aset (aref result row) column value)
do (setq value (1+ value))
do (setq row (1- row)))
(setq row (1+ row))
(setq column (1+ column))
(setq side (- side 2)))
result))

(provide 'spiral-matrix)
;;; spiral-matrix.el ends here

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"
47 changes: 47 additions & 0 deletions exercises/practice/spiral-matrix/spiral-matrix-test.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
;;; spiral-matrix-test.el --- Tests for Spiral Matrix (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:


(load-file "spiral-matrix.el")
(declare-function spiral-matrix "spiral-matrix.el" (size))


(ert-deftest empty-spiral ()
(should (equal [] (spiral-matrix 0))))


(ert-deftest trivial-spiral ()
(should (equal [[1]] (spiral-matrix 1))))


(ert-deftest spiral-of-size-2 ()
(should (equal [[1 2]
[4 3]] (spiral-matrix 2))))


(ert-deftest spiral-of-size-3 ()
(should (equal [[1 2 3]
[8 9 4]
[7 6 5]] (spiral-matrix 3))))


(ert-deftest spiral-of-size-4 ()
(should (equal [[1 2 3 4]
[12 13 14 5]
[11 16 15 6]
[10 9 8 7]] (spiral-matrix 4))))


(ert-deftest spiral-of-size-5 ()
(should (equal [[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]] (spiral-matrix 5))))


(provide 'spiral-matrix-test)
;;; spiral-matrix-test.el ends here
14 changes: 14 additions & 0 deletions exercises/practice/spiral-matrix/spiral-matrix.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
;;; spiral-matrix.el --- Spiral Matrix (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:


(defun spiral-matrix (size)
(error "Delete this S-Expression and write your own implementation"))


(provide 'spiral-matrix)
;;; spiral-matrix.el ends here

0 comments on commit d19d27c

Please sign in to comment.