diff --git a/config.json b/config.json index 7ce2781..da9daaf 100644 --- a/config.json +++ b/config.json @@ -466,6 +466,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "flower-field", + "name": "Flower Field", + "uuid": "a7cce1d3-19bc-4bb4-95ea-fef01d542672", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "matching-brackets", "name": "Matching Brackets", diff --git a/exercises/practice/flower-field/.busted b/exercises/practice/flower-field/.busted new file mode 100644 index 0000000..86b84e7 --- /dev/null +++ b/exercises/practice/flower-field/.busted @@ -0,0 +1,5 @@ +return { + default = { + ROOT = { '.' } + } +} diff --git a/exercises/practice/flower-field/.docs/instructions.md b/exercises/practice/flower-field/.docs/instructions.md new file mode 100644 index 0000000..bbdae0c --- /dev/null +++ b/exercises/practice/flower-field/.docs/instructions.md @@ -0,0 +1,26 @@ +# Instructions + +Your task is to add flower counts to empty squares in a completed Flower Field garden. +The garden itself is a rectangle board composed of squares that are either empty (`' '`) or a flower (`'*'`). + +For each empty square, count the number of flowers adjacent to it (horizontally, vertically, diagonally). +If the empty square has no adjacent flowers, leave it empty. +Otherwise replace it with the count of adjacent flowers. + +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 +·*·*· +··*·· +··*·· +····· +``` + +Which your code should transform into this: + +```text +1*3*1 +13*31 +·2*2· +·111· +``` diff --git a/exercises/practice/flower-field/.docs/introduction.md b/exercises/practice/flower-field/.docs/introduction.md new file mode 100644 index 0000000..af9b615 --- /dev/null +++ b/exercises/practice/flower-field/.docs/introduction.md @@ -0,0 +1,7 @@ +# Introduction + +[Flower Field][history] is a compassionate reimagining of the popular game Minesweeper. +The object of the game is to find all the flowers in the garden using numeric hints that indicate how many flowers are directly adjacent (horizontally, vertically, diagonally) to a square. +"Flower Field" shipped in regional versions of Microsoft Windows in Italy, Germany, South Korea, Japan and Taiwan. + +[history]: https://web.archive.org/web/20020409051321fw_/http://rcm.usr.dsi.unimi.it/rcmweb/fnm/ diff --git a/exercises/practice/flower-field/.meta/config.json b/exercises/practice/flower-field/.meta/config.json new file mode 100644 index 0000000..4593945 --- /dev/null +++ b/exercises/practice/flower-field/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "flower_field.moon" + ], + "test": [ + "flower_field_spec.moon" + ], + "example": [ + ".meta/example.moon" + ] + }, + "blurb": "Mark all the flowers in a garden." +} diff --git a/exercises/practice/flower-field/.meta/example.moon b/exercises/practice/flower-field/.meta/example.moon new file mode 100644 index 0000000..14d5fea --- /dev/null +++ b/exercises/practice/flower-field/.meta/example.moon @@ -0,0 +1,36 @@ +{ + annotate: (garden) -> + if #garden < 1 return garden + if #garden[1] < 1 return garden + + annotated = {} + rows = #garden + cols = #garden[1] + + for i = 1, rows + rowStr = '' + for j = 1, cols + cell = garden[i]\sub(j, j) + + if cell == '*' + rowStr ..= '*' + else + count = 0 + for dx = -1, 1 + for dy = -1, 1 + r = i + dx + c = j + dy + + if r >= 1 and r <= rows and c >= 1 and c <= cols + if garden[r]\sub(c, c) == '*' + count += 1 + + if count == 0 + rowStr ..= ' ' + else + rowStr ..= tostring(count) + + table.insert annotated, rowStr + + annotated +} diff --git a/exercises/practice/flower-field/.meta/spec_generator.moon b/exercises/practice/flower-field/.meta/spec_generator.moon new file mode 100755 index 0000000..3ccd4cc --- /dev/null +++ b/exercises/practice/flower-field/.meta/spec_generator.moon @@ -0,0 +1,27 @@ +{ + module_name: 'FlowerField' + + generate_test: (case, level) -> + lines = {} + + if #case.input.garden == 0 + table.insert lines, "garden = {}" + else + table.insert(lines, "gard en = {") + for row in *case.input.garden + table.insert(lines, " #{quote row}") + table.insert(lines, "}") + + if #case.expected == 0 + table.insert lines, "expected = {}" + else + table.insert(lines, "expected = {") + for row in *case.expected + table.insert(lines, " #{quote row}") + table.insert(lines, "}") + + table.insert(lines, "result = FlowerField.#{case.property} garden") + table.insert(lines, "assert.are.same expected, result") + + table.concat [indent line, level for line in *lines], '\n' +} diff --git a/exercises/practice/flower-field/.meta/tests.toml b/exercises/practice/flower-field/.meta/tests.toml new file mode 100644 index 0000000..965ba8f --- /dev/null +++ b/exercises/practice/flower-field/.meta/tests.toml @@ -0,0 +1,49 @@ +# 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. + +[237ff487-467a-47e1-9b01-8a891844f86c] +description = "no rows" + +[4b4134ec-e20f-439c-a295-664c38950ba1] +description = "no columns" + +[d774d054-bbad-4867-88ae-069cbd1c4f92] +description = "no flowers" + +[225176a0-725e-43cd-aa13-9dced501f16e] +description = "garden full of flowers" + +[3f345495-f1a5-4132-8411-74bd7ca08c49] +description = "flower surrounded by spaces" + +[6cb04070-4199-4ef7-a6fa-92f68c660fca] +description = "space surrounded by flowers" + +[272d2306-9f62-44fe-8ab5-6b0f43a26338] +description = "horizontal line" + +[c6f0a4b2-58d0-4bf6-ad8d-ccf4144f1f8e] +description = "horizontal line, flowers at edges" + +[a54e84b7-3b25-44a8-b8cf-1753c8bb4cf5] +description = "vertical line" + +[b40f42f5-dec5-4abc-b167-3f08195189c1] +description = "vertical line, flowers at edges" + +[58674965-7b42-4818-b930-0215062d543c] +description = "cross" + +[dd9d4ca8-9e68-4f78-a677-a2a70fd7a7b8] +description = "large garden" + +[6e4ac13a-3e43-4728-a2e3-3551d4b1a996] +description = "multiple adjacent flowers" diff --git a/exercises/practice/flower-field/flower_field.moon b/exercises/practice/flower-field/flower_field.moon new file mode 100644 index 0000000..24bf58d --- /dev/null +++ b/exercises/practice/flower-field/flower_field.moon @@ -0,0 +1,4 @@ +{ + annotate: (garden) -> + error 'Implement me' +} diff --git a/exercises/practice/flower-field/flower_field_spec.moon b/exercises/practice/flower-field/flower_field_spec.moon new file mode 100644 index 0000000..bebacbb --- /dev/null +++ b/exercises/practice/flower-field/flower_field_spec.moon @@ -0,0 +1,178 @@ +FlowerField = require 'flower_field' + +describe 'flower-field', -> + it 'no rows', -> + garden = {} + expected = {} + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'no columns', -> + garden = { + '' + } + expected = { + '' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'no flowers', -> + garden = { + ' ' + ' ' + ' ' + } + expected = { + ' ' + ' ' + ' ' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'garden full of flowers', -> + garden = { + '***' + '***' + '***' + } + expected = { + '***' + '***' + '***' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'flower surrounded by spaces', -> + garden = { + ' ' + ' * ' + ' ' + } + expected = { + '111' + '1*1' + '111' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'space surrounded by flowers', -> + garden = { + '***' + '* *' + '***' + } + expected = { + '***' + '*8*' + '***' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'horizontal line', -> + garden = { + ' * * ' + } + expected = { + '1*2*1' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'horizontal line, flowers at edges', -> + garden = { + '* *' + } + expected = { + '*1 1*' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'vertical line', -> + garden = { + ' ' + '*' + ' ' + '*' + ' ' + } + expected = { + '1' + '*' + '2' + '*' + '1' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'vertical line, flowers at edges', -> + garden = { + '*' + ' ' + ' ' + ' ' + '*' + } + expected = { + '*' + '1' + ' ' + '1' + '*' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'cross', -> + garden = { + ' * ' + ' * ' + '*****' + ' * ' + ' * ' + } + expected = { + ' 2*2 ' + '25*52' + '*****' + '25*52' + ' 2*2 ' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'large garden', -> + garden = { + ' * * ' + ' * ' + ' * ' + ' * *' + ' * * ' + ' ' + } + expected = { + '1*22*1' + '12*322' + ' 123*2' + '112*4*' + '1*22*2' + '111111' + } + result = FlowerField.annotate garden + assert.are.same expected, result + + pending 'multiple adjacent flowers', -> + garden = { + ' ** ' + } + expected = { + '1**1' + } + result = FlowerField.annotate garden + assert.are.same expected, result