From a4ebd4e3e51da223f12479263515a44c4854d953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:35:43 -0800 Subject: [PATCH] Add scrabble-score --- config.json | 8 +++ .../scrabble-score/.docs/instructions.md | 40 +++++++++++++ .../practice/scrabble-score/.meta/config.json | 19 +++++++ .../practice/scrabble-score/.meta/tests.toml | 43 ++++++++++++++ exercises/practice/scrabble-score/dub.sdl | 2 + .../scrabble-score/example/scrabble_score.d | 57 +++++++++++++++++++ .../scrabble-score/source/scrabble_score.d | 47 +++++++++++++++ 7 files changed, 216 insertions(+) create mode 100644 exercises/practice/scrabble-score/.docs/instructions.md create mode 100644 exercises/practice/scrabble-score/.meta/config.json create mode 100644 exercises/practice/scrabble-score/.meta/tests.toml create mode 100644 exercises/practice/scrabble-score/dub.sdl create mode 100644 exercises/practice/scrabble-score/example/scrabble_score.d create mode 100644 exercises/practice/scrabble-score/source/scrabble_score.d diff --git a/config.json b/config.json index 34429f8..0a75c92 100644 --- a/config.json +++ b/config.json @@ -464,6 +464,14 @@ "nested_classes", "reactive_programming" ] + }, + { + "slug": "scrabble-score", + "name": "Scrabble Score", + "uuid": "753c4d89-02b0-4856-935b-6471a84b4892", + "practices": [], + "prerequisites": [], + "difficulty": 2 } ] }, diff --git a/exercises/practice/scrabble-score/.docs/instructions.md b/exercises/practice/scrabble-score/.docs/instructions.md new file mode 100644 index 0000000..3f986c9 --- /dev/null +++ b/exercises/practice/scrabble-score/.docs/instructions.md @@ -0,0 +1,40 @@ +# Instructions + +Given a word, compute the Scrabble score for that word. + +## Letter Values + +You'll need these: + +```text +Letter Value +A, E, I, O, U, L, N, R, S, T 1 +D, G 2 +B, C, M, P 3 +F, H, V, W, Y 4 +K 5 +J, X 8 +Q, Z 10 +``` + +## Examples + +"cabbage" should be scored as worth 14 points: + +- 3 points for C +- 1 point for A, twice +- 3 points for B, twice +- 2 points for G +- 1 point for E + +And to total: + +- `3 + 2*1 + 2*3 + 2 + 1` +- = `3 + 2 + 6 + 3` +- = `5 + 9` +- = 14 + +## Extensions + +- You can play a double or a triple letter. +- You can play a double or a triple word. diff --git a/exercises/practice/scrabble-score/.meta/config.json b/exercises/practice/scrabble-score/.meta/config.json new file mode 100644 index 0000000..339ad29 --- /dev/null +++ b/exercises/practice/scrabble-score/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "source/scrabble_score.d" + ], + "test": [ + "source/scrabble_score.d" + ], + "example": [ + "example/scrabble_score.d" + ] + }, + "blurb": "Given a word, compute the Scrabble score for that word.", + "source": "Inspired by the Extreme Startup game", + "source_url": "https://github.com/rchatley/extreme_startup" +} diff --git a/exercises/practice/scrabble-score/.meta/tests.toml b/exercises/practice/scrabble-score/.meta/tests.toml new file mode 100644 index 0000000..33a873c --- /dev/null +++ b/exercises/practice/scrabble-score/.meta/tests.toml @@ -0,0 +1,43 @@ +# 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. + +[f46cda29-1ca5-4ef2-bd45-388a767e3db2] +description = "lowercase letter" + +[f7794b49-f13e-45d1-a933-4e48459b2201] +description = "uppercase letter" + +[eaba9c76-f9fa-49c9-a1b0-d1ba3a5b31fa] +description = "valuable letter" + +[f3c8c94e-bb48-4da2-b09f-e832e103151e] +description = "short word" + +[71e3d8fa-900d-4548-930e-68e7067c4615] +description = "short, valuable word" + +[d3088ad9-570c-4b51-8764-c75d5a430e99] +description = "medium word" + +[fa20c572-ad86-400a-8511-64512daac352] +description = "medium, valuable word" + +[9336f0ba-9c2b-4fa0-bd1c-2e2d328cf967] +description = "long, mixed-case word" + +[1e34e2c3-e444-4ea7-b598-3c2b46fd2c10] +description = "english-like word" + +[4efe3169-b3b6-4334-8bae-ff4ef24a7e4f] +description = "empty input" + +[3b305c1c-f260-4e15-a5b5-cb7d3ea7c3d7] +description = "entire alphabet available" diff --git a/exercises/practice/scrabble-score/dub.sdl b/exercises/practice/scrabble-score/dub.sdl new file mode 100644 index 0000000..15e2481 --- /dev/null +++ b/exercises/practice/scrabble-score/dub.sdl @@ -0,0 +1,2 @@ +name "scrabble-score" +buildRequirements "disallowDeprecations" diff --git a/exercises/practice/scrabble-score/example/scrabble_score.d b/exercises/practice/scrabble-score/example/scrabble_score.d new file mode 100644 index 0000000..ee50d40 --- /dev/null +++ b/exercises/practice/scrabble-score/example/scrabble_score.d @@ -0,0 +1,57 @@ +module scrabble_scores; + +import std.string; + +pure int score(immutable string word) +{ + int points = 0; + string upper = toUpper(word); + foreach (char letter; upper) { + switch (letter) { + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + case 'L': + case 'N': + case 'R': + case 'S': + case 'T': + points += 1; + break; + case 'D': + case 'G': + points += 2; + break; + case 'B': + case 'C': + case 'M': + case 'P': + points += 3; + break; + case 'F': + case 'H': + case 'V': + case 'W': + case 'Y': + points += 4; + break; + case 'K': + points += 5; + break; + case 'J': + case 'X': + points += 8; + break; + case 'Q': + case 'Z': + points += 10; + break; + default: + break; + } + } + + return points; +} diff --git a/exercises/practice/scrabble-score/source/scrabble_score.d b/exercises/practice/scrabble-score/source/scrabble_score.d new file mode 100644 index 0000000..03a6709 --- /dev/null +++ b/exercises/practice/scrabble-score/source/scrabble_score.d @@ -0,0 +1,47 @@ +module scrabble_scores; + +pure int score(immutable string word) +{ + // Implement this function +} + +unittest +{ + immutable int allTestsEnabled = 0; + + // Lowercase letter + assert(score("a") == 1); + + static if (allTestsEnabled) + { + // Uppercase letter + assert(score("A") == 1); + + // Valuable letter + assert(score("f") == 4); + + // Short word + assert(score("at") == 2); + + // Short, valuable word + assert(score("zoo") == 12); + + // Medium word + assert(score("street") == 6); + + // Medium, valuable word + assert(score("quirky") == 22); + + // Long, mixed-case word + assert(score("OxyphenButazone") == 41); + + // English-like word + assert(score("pinata") == 8); + + // Empty input + assert(score("") == 0); + + // Entire alphabet available + assert(score("abcdefghijklmnopqrstuvwxyz") == 87); + } +}