Skip to content

Commit

Permalink
[New Exercise]: Minesweeper (#294)
Browse files Browse the repository at this point in the history
  • Loading branch information
glaxxie authored Oct 7, 2023
1 parent 2d8ffbf commit 34b8f66
Show file tree
Hide file tree
Showing 7 changed files with 403 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,14 @@
"prerequisites": [],
"difficulty": 4
},
{
"slug": "minesweeper",
"name": "Minesweeper",
"uuid": "23508af2-2bf3-4ef9-aac4-f41471afe76d",
"practices": [],
"prerequisites": [],
"difficulty": 4
},
{
"slug": "change",
"name": "Change",
Expand Down
32 changes: 32 additions & 0 deletions exercises/practice/minesweeper/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Instructions

Add the mine counts to a completed Minesweeper board.

Minesweeper is a popular game where the user has to find the mines using numeric hints that indicate how many mines are directly adjacent (horizontally, vertically, diagonally) to a square.

In this exercise you have to create some code that counts the number of mines adjacent to a given empty square and replaces that square with the count.

The board is a rectangle composed of blank space (' ') characters.
A mine is represented by an asterisk (`*`) character.

If a given space has no adjacent mines at all, leave that square blank.

## Examples

For example you may receive a 5 x 4 board like this (empty spaces are represented here with the '·' character for display on screen):

```text
·*·*·
··*··
··*··
·····
```

And your code will transform it into this:

```text
1*3*1
13*31
·2*2·
·111·
```
75 changes: 75 additions & 0 deletions exercises/practice/minesweeper/.meta/Minesweeper.example.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
Function Get-Annotate() {
<#
.SYNOPSIS
Add the mine counts to a completed Minesweeper board.
.DESCRIPTION
Minesweeper is a popular game where the user has to find the mines using numeric hints that indicate how many mines are directly adjacent (horizontally, vertically, diagonally) to a square.
In this exercise you have to create some code that counts the number of mines adjacent to a given empty square and replaces that square with the count.
The board is a rectangle composed of blank space (' ') characters.
A mine is represented by an asterisk (`*`) character.
If a given space has no adjacent mines at all, leave that square blank.
.PARAMETER Minefield
An array of string, each represent a row of the minefield.
This parameter should be validated to check that only blank space and asterisk are in it.
.EXAMPLE
Get-Annotate -Minefield @(" *** ")
Returns: @("1***1")
#>
[CmdletBinding()]
Param(
[ValidatePattern("^[\s*]*$")]
[string[]]$Minefield
)

$rows = $Minefield.Count
$cols = $Minefield[0].Length

if (-not $rows -or -not $cols) {
return $Minefield
}

$neighbors = @(
@(-1, -1), @(-1, 0), @(-1, 1), @(0, -1), @(0, 1), @(1, -1), @(1, 0), @(1, 1)
)

$fieldArray = @($Minefield | ForEach-Object { ,$_.ToCharArray() })

for ($row = 0; $row -lt $rows; $row++) {
for ($col = 0; $col -lt $cols; $col++) {
$cell = $fieldArray[$row][$col]
if ($cell -eq " ") {
$minesCount = Get-MineCount $fieldArray @($row, $col) $neighbors
if ($minesCount) {
$fieldArray[$row][$col] = $minesCount.ToString()
}
}
}
}
$fieldArray | ForEach-Object {$_ -join ""}
}

Function Get-MineCount {
param (
[object[]]$Field,
[int[]]$Cell,
[object[]]$Neighbors
)
$counter = 0
foreach ($neighbor in $Neighbors) {
$x = $Cell[0] + $neighbor[0]
$y = $Cell[1] + $neighbor[1]

if ($x -lt 0 -or $x -eq $Field.Count -or $y -lt 0) {continue} #out of bound

if ($Field[$x][$y] -eq "*") {
$counter++
}
}
$counter
}
17 changes: 17 additions & 0 deletions exercises/practice/minesweeper/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"authors": [
"glaxxie"
],
"files": {
"solution": [
"Minesweeper.ps1"
],
"test": [
"Minesweeper.tests.ps1"
],
"example": [
".meta/Minesweeper.example.ps1"
]
},
"blurb": "Add the numbers to a minesweeper board."
}
46 changes: 46 additions & 0 deletions exercises/practice/minesweeper/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# 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.

[0c5ec4bd-dea7-4138-8651-1203e1cb9f44]
description = "no rows"

[650ac4c0-ad6b-4b41-acde-e4ea5852c3b8]
description = "no columns"

[6fbf8f6d-a03b-42c9-9a58-b489e9235478]
description = "no mines"

[61aff1c4-fb31-4078-acad-cd5f1e635655]
description = "minefield with only mines"

[84167147-c504-4896-85d7-246b01dea7c5]
description = "mine surrounded by spaces"

[cb878f35-43e3-4c9d-93d9-139012cccc4a]
description = "space surrounded by mines"

[7037f483-ddb4-4b35-b005-0d0f4ef4606f]
description = "horizontal line"

[e359820f-bb8b-4eda-8762-47b64dba30a6]
description = "horizontal line, mines at edges"

[c5198b50-804f-47e9-ae02-c3b42f7ce3ab]
description = "vertical line"

[0c79a64d-703d-4660-9e90-5adfa5408939]
description = "vertical line, mines at edges"

[4b098563-b7f3-401c-97c6-79dd1b708f34]
description = "cross"

[04a260f1-b40a-4e89-839e-8dd8525abe0e]
description = "large minefield"
29 changes: 29 additions & 0 deletions exercises/practice/minesweeper/Minesweeper.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Function Get-Annotate() {
<#
.SYNOPSIS
Add the mine counts to a completed Minesweeper board.
.DESCRIPTION
Minesweeper is a popular game where the user has to find the mines using numeric hints that indicate how many mines are directly adjacent (horizontally, vertically, diagonally) to a square.
In this exercise you have to create some code that counts the number of mines adjacent to a given empty square and replaces that square with the count.
The board is a rectangle composed of blank space (' ') characters.
A mine is represented by an asterisk (`*`) character.
If a given space has no adjacent mines at all, leave that square blank.
.PARAMETER Minefield
An array of string, each represent a row of the minefield.
This parameter should be validated to check that only blank space and asterisk are in it.
.EXAMPLE
Get-Annotate -Minefield @(" *** ")
Returns: @("1***1")
#>
[CmdletBinding()]
Param(
[string[]]$Minefield
)
Throw "Please implement this function"
}
Loading

0 comments on commit 34b8f66

Please sign in to comment.