diff --git a/config.json b/config.json index 914f483..c2934dc 100644 --- a/config.json +++ b/config.json @@ -519,6 +519,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "saddle-points", + "name": "Saddle Points", + "uuid": "3abe4014-3f1d-4178-9b3a-bc0fff0f1322", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "scrabble-score", "name": "Scrabble Score", diff --git a/exercises/practice/saddle-points/.docs/instructions.md b/exercises/practice/saddle-points/.docs/instructions.md new file mode 100644 index 0000000..f69cdab --- /dev/null +++ b/exercises/practice/saddle-points/.docs/instructions.md @@ -0,0 +1,27 @@ +# Instructions + +Your task is to find the potential trees where you could build your tree house. + +The data company provides the data as grids that show the heights of the trees. +The rows of the grid represent the east-west direction, and the columns represent the north-south direction. + +An acceptable tree will be the largest in its row, while being the smallest in its column. + +A grid might not have any good trees at all. +Or it might have one, or even several. + +Here is a grid that has exactly one candidate tree. + +```text + ↓ + 1 2 3 4 + |----------- + 1 | 9 8 7 8 +→ 2 |[5] 3 2 4 + 3 | 6 6 7 1 +``` + +- Row 2 has values 5, 3, 2, and 4. The largest value is 5. +- Column 1 has values 9, 5, and 6. The smallest value is 5. + +So the point at `[2, 1]` (row: 2, column: 1) is a great spot for a tree house. diff --git a/exercises/practice/saddle-points/.docs/introduction.md b/exercises/practice/saddle-points/.docs/introduction.md new file mode 100644 index 0000000..34b2c77 --- /dev/null +++ b/exercises/practice/saddle-points/.docs/introduction.md @@ -0,0 +1,11 @@ +# Introduction + +You plan to build a tree house in the woods near your house so that you can watch the sun rise and set. + +You've obtained data from a local survey company that show the height of every tree in each rectangular section of the map. +You need to analyze each grid on the map to find good trees for your tree house. + +A good tree is both: + +- taller than every tree to the east and west, so that you have the best possible view of the sunrises and sunsets. +- shorter than every tree to the north and south, to minimize the amount of tree climbing. diff --git a/exercises/practice/saddle-points/.meta/config.json b/exercises/practice/saddle-points/.meta/config.json new file mode 100644 index 0000000..f775e6a --- /dev/null +++ b/exercises/practice/saddle-points/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "saddle-points.coffee" + ], + "test": [ + "saddle-points.spec.coffee" + ], + "example": [ + ".meta/example.coffee" + ] + }, + "blurb": "Detect saddle points in a matrix.", + "source": "J Dalbey's Programming Practice problems", + "source_url": "https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html" +} diff --git a/exercises/practice/saddle-points/.meta/example.coffee b/exercises/practice/saddle-points/.meta/example.coffee new file mode 100644 index 0000000..35c1b6b --- /dev/null +++ b/exercises/practice/saddle-points/.meta/example.coffee @@ -0,0 +1,19 @@ +SaddlePoints = (matrix) -> + return [] if matrix.length == 0 + + rows = matrix.length + columns = matrix[0].length + + tallestInEachRow = matrix.map (row) => Math.max row... + shortestInEachColumn = [0...columns].map (c) -> + Math.min (matrix[r][c] for r in [0...rows])... + + saddlePoints = [] + for i in [0...rows] + for j in [0...columns] + current = matrix[i][j] + if current == tallestInEachRow[i] and current == shortestInEachColumn[j] + saddlePoints.push {row: i + 1, column: j + 1} + saddlePoints + +module.exports = SaddlePoints diff --git a/exercises/practice/saddle-points/.meta/tests.toml b/exercises/practice/saddle-points/.meta/tests.toml new file mode 100644 index 0000000..ca00852 --- /dev/null +++ b/exercises/practice/saddle-points/.meta/tests.toml @@ -0,0 +1,37 @@ +# 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. + +[3e374e63-a2e0-4530-a39a-d53c560382bd] +description = "Can identify single saddle point" + +[6b501e2b-6c1f-491f-b1bb-7f278f760534] +description = "Can identify that empty matrix has no saddle points" + +[8c27cc64-e573-4fcb-a099-f0ae863fb02f] +description = "Can identify lack of saddle points when there are none" + +[6d1399bd-e105-40fd-a2c9-c6609507d7a3] +description = "Can identify multiple saddle points in a column" + +[3e81dce9-53b3-44e6-bf26-e328885fd5d1] +description = "Can identify multiple saddle points in a row" + +[88868621-b6f4-4837-bb8b-3fad8b25d46b] +description = "Can identify saddle point in bottom right corner" + +[5b9499ca-fcea-4195-830a-9c4584a0ee79] +description = "Can identify saddle points in a non square matrix" + +[ee99ccd2-a1f1-4283-ad39-f8c70f0cf594] +description = "Can identify that saddle points in a single column matrix are those with the minimum value" + +[63abf709-a84b-407f-a1b3-456638689713] +description = "Can identify that saddle points in a single row matrix are those with the maximum value" diff --git a/exercises/practice/saddle-points/saddle-points.coffee b/exercises/practice/saddle-points/saddle-points.coffee new file mode 100644 index 0000000..c22bd49 --- /dev/null +++ b/exercises/practice/saddle-points/saddle-points.coffee @@ -0,0 +1,3 @@ +SaddlePoints = (matrix) -> + +module.exports = SaddlePoints diff --git a/exercises/practice/saddle-points/saddle-points.spec.coffee b/exercises/practice/saddle-points/saddle-points.spec.coffee new file mode 100644 index 0000000..0f40a71 --- /dev/null +++ b/exercises/practice/saddle-points/saddle-points.spec.coffee @@ -0,0 +1,76 @@ +SaddlePoints = require './saddle-points' + +describe 'SaddlePoints', -> + it 'can identify single saddle point', -> + matrix = [ + [9, 8, 7] + [5, 3, 2] + [6, 6, 7]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 2, column: 1}] + + xit 'can identify that empty matrix has no saddle points', -> + matrix = [[]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [] + + xit 'can identify lack of saddle points when there are none', -> + matrix = [ + [1, 2, 3] + [3, 1, 2] + [2, 3, 1]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [] + + xit 'can identify multiple saddle points in a column', -> + matrix = [ + [4, 5, 4] + [3, 5, 5] + [1, 5, 4]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 1, column: 2} + {row: 2, column: 2} + {row: 3, column: 2}] + + xit 'can identify multiple saddle points in a row', -> + matrix = [ + [6, 7, 8] + [5, 5, 5] + [7, 5, 6]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 2, column: 1} + {row: 2, column: 2} + {row: 2, column: 3}] + + xit 'can identify saddle point in bottom right corner', -> + matrix = [ + [8, 7, 9] + [6, 7, 6] + [3, 2, 5]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 3, column: 3}] + + xit 'can identify saddle points in a non square matrix', -> + matrix = [ + [3, 1, 3] + [3, 2, 4]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 1, column: 1} + {row: 1, column: 3}] + + xit 'can identify that saddle points in a single column matrix are those with the minimum value', -> + matrix = [ + [2] + [1] + [4] + [1]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 2, column: 1} + {row: 4, column: 1}] + + xit 'can identify that saddle points in a single row matrix are those with the maximum value', -> + matrix = [[2, 5, 3, 5]] + results = SaddlePoints matrix + expect(results.sort()).toEqual [{row: 1, column: 2} + {row: 1, column: 4}] + \ No newline at end of file