From 9afc54c73f2d3a7c3a2034acaa7a6384ec4a762b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:43:50 -0700 Subject: [PATCH 1/3] Add `flower-field`, deprecating `minesweeper` --- config.json | 67 ++++-- .../flower-field/.docs/instructions.md | 26 +++ .../flower-field/.docs/introduction.md | 7 + .../practice/flower-field/.meta/config.json | 20 ++ .../practice/flower-field/.meta/tests.toml | 46 +++++ .../.meta/zcl_flower_field.clas.abap | 87 ++++++++ .../practice/flower-field/package.devc.xml | 10 + .../flower-field/zcl_flower_field.clas.abap | 19 ++ .../zcl_flower_field.clas.testclasses.abap | 192 ++++++++++++++++++ .../flower-field/zcl_flower_field.clas.xml | 17 ++ 10 files changed, 469 insertions(+), 22 deletions(-) create mode 100644 exercises/practice/flower-field/.docs/instructions.md create mode 100644 exercises/practice/flower-field/.docs/introduction.md create mode 100644 exercises/practice/flower-field/.meta/config.json create mode 100644 exercises/practice/flower-field/.meta/tests.toml create mode 100644 exercises/practice/flower-field/.meta/zcl_flower_field.clas.abap create mode 100644 exercises/practice/flower-field/package.devc.xml create mode 100644 exercises/practice/flower-field/zcl_flower_field.clas.abap create mode 100644 exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap create mode 100644 exercises/practice/flower-field/zcl_flower_field.clas.xml diff --git a/config.json b/config.json index 9d5eb722..c21a6db5 100644 --- a/config.json +++ b/config.json @@ -8,9 +8,6 @@ "representer": false, "analyzer": false }, - "test_runner": { - "average_run_time": 9 - }, "blurb": "ABAP is a high level programming language created by SAP", "version": 3, "online_editor": { @@ -18,13 +15,18 @@ "indent_size": 2, "highlightjs_language": "abap" }, + "test_runner": { + "average_run_time": 9 + }, "exercises": { "concept": [ { "slug": "lasagna", "name": "Lucian's Luscious Lasagna", "uuid": "0bb8f970-fe74-41f2-8ae6-2d771d87b607", - "concepts": ["basics"], + "concepts": [ + "basics" + ], "prerequisites": [], "status": "wip" } @@ -181,7 +183,10 @@ "practices": [], "prerequisites": [], "difficulty": 2, - "topics": ["parsing", "transforming"] + "topics": [ + "parsing", + "transforming" + ] }, { "slug": "raindrops", @@ -223,13 +228,22 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "flower-field", + "name": "Flower Field", + "uuid": "6e096ef1-5502-446f-b32c-65c3e4a8166b", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "minesweeper", "name": "Minesweeper", "uuid": "c8f6abc0-41a4-4104-8050-2df35f0d469a", "practices": [], "prerequisites": [], - "difficulty": 5 + "difficulty": 5, + "status": "deprecated" }, { "slug": "word-count", @@ -238,7 +252,12 @@ "practices": [], "prerequisites": [], "difficulty": 1, - "topics": ["loops", "lists", "regular_expressions", "strings"] + "topics": [ + "loops", + "lists", + "regular_expressions", + "strings" + ] }, { "slug": "beer-song", @@ -247,7 +266,11 @@ "practices": [], "prerequisites": [], "difficulty": 5, - "topics": ["conditionals", "loops", "strings"] + "topics": [ + "conditionals", + "loops", + "strings" + ] }, { "slug": "darts", @@ -380,43 +403,43 @@ ], "key_features": [ { - "icon": "evolving", "title": "Evolving", - "content": "ABAP is a modern and constantly evolving language supported by SAP." + "content": "ABAP is a modern and constantly evolving language supported by SAP.", + "icon": "evolving" }, { - "icon": "fun", "title": "Fun", - "content": "Always a new or old feature to discover." + "content": "Always a new or old feature to discover.", + "icon": "fun" }, { - "icon": "easy", "title": "Easy", - "content": "Statements are easily readable and understandable." + "content": "Statements are easily readable and understandable.", + "icon": "easy" }, { - "icon": "productive", "title": "Productive", - "content": "Easily create data structures and interact with database contents." + "content": "Easily create data structures and interact with database contents.", + "icon": "productive" }, { - "icon": "statically-typed", "title": "Typed", - "content": "Static types linked to database schemas." + "content": "Static types linked to database schemas.", + "icon": "statically-typed" }, { - "icon": "stable", "title": "Reliability", - "content": "Stable functionality to run the core of the worlds largest businesses." + "content": "Stable functionality to run the core of the worlds largest businesses.", + "icon": "stable" } ], "tags": [ + "execution_mode/compiled", "paradigm/object_oriented", "paradigm/procedural", + "runtime/language_specific", "typing/static", "typing/strong", - "execution_mode/compiled", - "runtime/language_specific", "used_for/backends", "used_for/financial_systems" ] diff --git a/exercises/practice/flower-field/.docs/instructions.md b/exercises/practice/flower-field/.docs/instructions.md new file mode 100644 index 00000000..bbdae0c2 --- /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 00000000..af9b6153 --- /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 00000000..8ade38fd --- /dev/null +++ b/exercises/practice/flower-field/.meta/config.json @@ -0,0 +1,20 @@ +{ + "authors": [ + "mbtools" + ], + "contributors": [ + "BNAndras" + ], + "files": { + "solution": [ + "zcl_flower_field.clas.abap" + ], + "test": [ + "zcl_flower_field.clas.testclasses.abap" + ], + "example": [ + ".meta/zcl_flower_field.clas.abap" + ] + }, + "blurb": "Mark all the flowers in a garden." +} diff --git a/exercises/practice/flower-field/.meta/tests.toml b/exercises/practice/flower-field/.meta/tests.toml new file mode 100644 index 00000000..c2b24fda --- /dev/null +++ b/exercises/practice/flower-field/.meta/tests.toml @@ -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. + +[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" diff --git a/exercises/practice/flower-field/.meta/zcl_flower_field.clas.abap b/exercises/practice/flower-field/.meta/zcl_flower_field.clas.abap new file mode 100644 index 00000000..977996a7 --- /dev/null +++ b/exercises/practice/flower-field/.meta/zcl_flower_field.clas.abap @@ -0,0 +1,87 @@ +CLASS zcl_flower_field DEFINITION PUBLIC FINAL CREATE PUBLIC. + + PUBLIC SECTION. + + METHODS annotate + IMPORTING + !input TYPE string_table + RETURNING + VALUE(result) TYPE string_table. + +ENDCLASS. + + + +CLASS zcl_flower_field IMPLEMENTATION. + METHOD annotate. + + DATA n TYPE n LENGTH 1. + DATA res TYPE string. + + CONCATENATE LINES OF input INTO DATA(field) RESPECTING BLANKS. + DATA(count) = strlen( field ). + DATA(rows) = lines( input ). + DATA(cols) = count DIV rows. + + DO rows TIMES. + DATA(row) = sy-index - 1. + DO cols TIMES. + DATA(col) = sy-index - 1. + n = 0. + DO 9 TIMES. + CASE sy-index. + WHEN 1. + DATA(r) = row. + DATA(c) = col. + WHEN 2. + r = row. + c = col + 1. + WHEN 3. + r = row. + c = col - 1. + WHEN 4. + r = row + 1. + c = col. + WHEN 5. + r = row + 1. + c = col + 1. + WHEN 6. + r = row + 1. + c = col - 1. + WHEN 7. + r = row - 1. + c = col. + WHEN 8. + r = row - 1. + c = col + 1. + WHEN 9. + r = row - 1. + c = col - 1. + ENDCASE. + IF r BETWEEN 0 AND rows - 1 AND c BETWEEN 0 AND cols - 1. + IF substring( val = field off = r * cols + c len = 1 ) = `*`. + IF r = row AND c = col. + n = 9. + EXIT. + ELSE. + n = n + 1. + ENDIF. + ENDIF. + ENDIF. + ENDDO. + IF n = 0. + res = res && ` `. + ELSEIF n = 9. + res = res && `*`. + ELSE. + res = res && n. + ENDIF. + ENDDO. + ENDDO. + + DO rows TIMES. + INSERT substring( val = res off = ( sy-index - 1 ) * cols len = cols ) INTO TABLE result. + ENDDO. + + ENDMETHOD. +ENDCLASS. diff --git a/exercises/practice/flower-field/package.devc.xml b/exercises/practice/flower-field/package.devc.xml new file mode 100644 index 00000000..50803ddc --- /dev/null +++ b/exercises/practice/flower-field/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Exercism: Minesweeper + + + + diff --git a/exercises/practice/flower-field/zcl_flower_field.clas.abap b/exercises/practice/flower-field/zcl_flower_field.clas.abap new file mode 100644 index 00000000..2d00cbb2 --- /dev/null +++ b/exercises/practice/flower-field/zcl_flower_field.clas.abap @@ -0,0 +1,19 @@ +CLASS zcl_flower_field DEFINITION PUBLIC FINAL CREATE PUBLIC. + + PUBLIC SECTION. + + METHODS annotate + IMPORTING + !input TYPE string_table + RETURNING + VALUE(result) TYPE string_table. + +ENDCLASS. + +CLASS zcl_flower_field IMPLEMENTATION. + + METHOD annotate. + " add solution here + ENDMETHOD. + +ENDCLASS. diff --git a/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap b/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap new file mode 100644 index 00000000..80ab2dec --- /dev/null +++ b/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap @@ -0,0 +1,192 @@ +CLASS ltc_test DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + + DATA cut TYPE REF TO zcl_flower_field. + + METHODS setup. + METHODS assert_that IMPORTING input TYPE string_table + output TYPE string_table. + + METHODS no_rows FOR TESTING RAISING cx_static_check. + METHODS no_columns FOR TESTING RAISING cx_static_check. + METHODS no_flowers FOR TESTING RAISING cx_static_check. + METHODS garden_full_of_flowers FOR TESTING RAISING cx_static_check. + METHODS flower_surrounded_by_spaces FOR TESTING RAISING cx_static_check. + METHODS space_surrounded_by_flowers FOR TESTING RAISING cx_static_check. + METHODS horizontal_line FOR TESTING RAISING cx_static_check. + METHODS horizontal_line_flowers_at_ends FOR TESTING RAISING cx_static_check. + METHODS vertical_line FOR TESTING RAISING cx_static_check. + METHODS vertical_line_flowers_at_ends FOR TESTING RAISING cx_static_check. + METHODS cross FOR TESTING RAISING cx_static_check. + METHODS large_garden FOR TESTING RAISING cx_static_check. + +ENDCLASS. + + +CLASS ltc_test IMPLEMENTATION. + + METHOD setup. + cut = NEW zcl_flower_field( ). + ENDMETHOD. + + + METHOD no_rows. + assert_that( + input = VALUE #( ) + output = VALUE #( ) ). + ENDMETHOD. + + + METHOD no_columns. + assert_that( + input = VALUE #( ( ) ) + output = VALUE #( ( ) ) ). + ENDMETHOD. + + + METHOD no_flowers. + assert_that( + input = VALUE #( + ( ` ` ) + ( ` ` ) + ( ` ` ) ) + output = VALUE #( + ( ` ` ) + ( ` ` ) + ( ` ` ) ) ). + ENDMETHOD. + + + METHOD garden_full_of_flowers. + assert_that( + input = VALUE #( + ( `***` ) + ( `***` ) + ( `***` ) ) + output = VALUE #( + ( `***` ) + ( `***` ) + ( `***` ) ) ). + ENDMETHOD. + + + METHOD flower_surrounded_by_spaces. + assert_that( + input = VALUE #( + ( ` ` ) + ( ` * ` ) + ( ` ` ) ) + output = VALUE #( + ( `111` ) + ( `1*1` ) + ( `111` ) ) ). + ENDMETHOD. + + + METHOD space_surrounded_by_flowers. + assert_that( + input = VALUE #( + ( `***` ) + ( `* *` ) + ( `***` ) ) + output = VALUE #( + ( `***` ) + ( `*8*` ) + ( `***` ) ) ). + ENDMETHOD. + + + METHOD horizontal_line. + assert_that( + input = VALUE #( ( ` * * ` ) ) + output = VALUE #( ( `1*2*1` ) ) ). + ENDMETHOD. + + + METHOD horizontal_line_flowers_at_ends. + assert_that( + input = VALUE #( ( `* *` ) ) + output = VALUE #( ( `*1 1*` ) ) ). + ENDMETHOD. + + + METHOD vertical_line. + assert_that( + input = VALUE #( + ( ` ` ) + ( `*` ) + ( ` ` ) + ( `*` ) + ( ` ` ) ) + output = VALUE #( + ( `1` ) + ( `*` ) + ( `2` ) + ( `*` ) + ( `1` ) ) ). + ENDMETHOD. + + + METHOD vertical_line_flowers_at_ends. + assert_that( + input = VALUE #( + ( `*` ) + ( ` ` ) + ( ` ` ) + ( ` ` ) + ( `*` ) ) + output = VALUE #( + ( `*` ) + ( `1` ) + ( ` ` ) + ( `1` ) + ( `*` ) ) ). + ENDMETHOD. + + + METHOD cross. + assert_that( + input = VALUE #( + ( ` * ` ) + ( ` * ` ) + ( `*****` ) + ( ` * ` ) + ( ` * ` ) ) + output = VALUE #( + ( ` 2*2 ` ) + ( `25*52` ) + ( `*****` ) + ( `25*52` ) + ( ` 2*2 ` ) ) ). + ENDMETHOD. + + + METHOD large_garden. + assert_that( + input = VALUE #( + ( ` * * ` ) + ( ` * ` ) + ( ` * ` ) + ( ` * *` ) + ( ` * * ` ) + ( ` ` ) ) + output = VALUE #( + ( `1*22*1` ) + ( `12*322` ) + ( ` 123*2` ) + ( `112*4*` ) + ( `1*22*2` ) + ( `111111` ) ) ). + ENDMETHOD. + + + METHOD assert_that. + DATA(act) = cut->annotate( input ). + cl_abap_unit_assert=>assert_equals( act = act + exp = output ). + ENDMETHOD. + +ENDCLASS. diff --git a/exercises/practice/flower-field/zcl_flower_field.clas.xml b/exercises/practice/flower-field/zcl_flower_field.clas.xml new file mode 100644 index 00000000..2a1de531 --- /dev/null +++ b/exercises/practice/flower-field/zcl_flower_field.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_FLOWER_FIELD + E + Exercism: Flower Field + 1 + X + X + X + X + + + + From 23d849e94dfa315ee698806a8f24dac5450c2f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:57:33 -0700 Subject: [PATCH 2/3] Update package.devc.xml --- exercises/practice/flower-field/package.devc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/flower-field/package.devc.xml b/exercises/practice/flower-field/package.devc.xml index 50803ddc..6a1ff554 100644 --- a/exercises/practice/flower-field/package.devc.xml +++ b/exercises/practice/flower-field/package.devc.xml @@ -3,7 +3,7 @@ - Exercism: Minesweeper + Exercism: Flower Field From d70cc307d3c6aebd37cf97242aa4f62a4044e666 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 7 Jul 2025 18:29:01 -0700 Subject: [PATCH 3/3] Shorten too long test case name --- .../zcl_flower_field.clas.testclasses.abap | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap b/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap index 80ab2dec..f5896de1 100644 --- a/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap +++ b/exercises/practice/flower-field/zcl_flower_field.clas.testclasses.abap @@ -10,18 +10,18 @@ CLASS ltc_test DEFINITION FINAL FOR TESTING METHODS assert_that IMPORTING input TYPE string_table output TYPE string_table. - METHODS no_rows FOR TESTING RAISING cx_static_check. - METHODS no_columns FOR TESTING RAISING cx_static_check. - METHODS no_flowers FOR TESTING RAISING cx_static_check. - METHODS garden_full_of_flowers FOR TESTING RAISING cx_static_check. - METHODS flower_surrounded_by_spaces FOR TESTING RAISING cx_static_check. - METHODS space_surrounded_by_flowers FOR TESTING RAISING cx_static_check. - METHODS horizontal_line FOR TESTING RAISING cx_static_check. - METHODS horizontal_line_flowers_at_ends FOR TESTING RAISING cx_static_check. - METHODS vertical_line FOR TESTING RAISING cx_static_check. - METHODS vertical_line_flowers_at_ends FOR TESTING RAISING cx_static_check. - METHODS cross FOR TESTING RAISING cx_static_check. - METHODS large_garden FOR TESTING RAISING cx_static_check. + METHODS no_rows FOR TESTING RAISING cx_static_check. + METHODS no_columns FOR TESTING RAISING cx_static_check. + METHODS no_flowers FOR TESTING RAISING cx_static_check. + METHODS garden_full_of_flowers FOR TESTING RAISING cx_static_check. + METHODS flower_surrounded_by_spaces FOR TESTING RAISING cx_static_check. + METHODS space_surrounded_by_flowers FOR TESTING RAISING cx_static_check. + METHODS horizontal_line FOR TESTING RAISING cx_static_check. + METHODS horizontal_line_flowers_at_end FOR TESTING RAISING cx_static_check. + METHODS vertical_line FOR TESTING RAISING cx_static_check. + METHODS vertical_line_flowers_at_end FOR TESTING RAISING cx_static_check. + METHODS cross FOR TESTING RAISING cx_static_check. + METHODS large_garden FOR TESTING RAISING cx_static_check. ENDCLASS. @@ -106,7 +106,7 @@ CLASS ltc_test IMPLEMENTATION. ENDMETHOD. - METHOD horizontal_line_flowers_at_ends. + METHOD horizontal_line_flowers_at_end. assert_that( input = VALUE #( ( `* *` ) ) output = VALUE #( ( `*1 1*` ) ) ). @@ -130,7 +130,7 @@ CLASS ltc_test IMPLEMENTATION. ENDMETHOD. - METHOD vertical_line_flowers_at_ends. + METHOD vertical_line_flowers_at_end. assert_that( input = VALUE #( ( `*` )