From 265701138780dae9ca8759bd1c5c0b6c7ae94d57 Mon Sep 17 00:00:00 2001 From: Eric Willigers Date: Tue, 6 Jun 2023 11:46:45 +1000 Subject: [PATCH 1/2] feat: Add exercise Scrabble Score (closes #311) --- config.json | 12 ++++ .../scrabble-score/.docs/instructions.md | 40 ++++++++++++++ .../practice/scrabble-score/.meta/config.json | 19 +++++++ .../practice/scrabble-score/.meta/example.el | 36 ++++++++++++ .../practice/scrabble-score/.meta/tests.toml | 43 +++++++++++++++ .../scrabble-score/scrabble-score-test.el | 55 +++++++++++++++++++ .../practice/scrabble-score/scrabble-score.el | 11 ++++ 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/example.el create mode 100644 exercises/practice/scrabble-score/.meta/tests.toml create mode 100644 exercises/practice/scrabble-score/scrabble-score-test.el create mode 100644 exercises/practice/scrabble-score/scrabble-score.el diff --git a/config.json b/config.json index b4caf9a2..833fc0c6 100644 --- a/config.json +++ b/config.json @@ -517,6 +517,18 @@ "practices": [], "prerequisites": [], "difficulty": 6 + }, + { + "slug": "scrabble-score", + "name": "Scrabble Score", + "uuid": "fb45c509-d83d-4f71-a8ef-f218c5426837", + "practices": [], + "prerequisites": [], + "difficulty": 3, + "topics": [ + "lists", + "strings" + ] } ] }, diff --git a/exercises/practice/scrabble-score/.docs/instructions.md b/exercises/practice/scrabble-score/.docs/instructions.md new file mode 100644 index 00000000..3f986c94 --- /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 00000000..e78d541a --- /dev/null +++ b/exercises/practice/scrabble-score/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "keiravillekode" + ], + "files": { + "solution": [ + "scrabble-score.el" + ], + "test": [ + "scrabble-score-test.el" + ], + "example": [ + ".meta/example.el" + ] + }, + "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/example.el b/exercises/practice/scrabble-score/.meta/example.el new file mode 100644 index 00000000..6e3e0ef6 --- /dev/null +++ b/exercises/practice/scrabble-score/.meta/example.el @@ -0,0 +1,36 @@ +;;; scrabble-score.el --- Scrabble Score (exercism) -*- lexical-binding: t; -*- + +;;; Commentary: + +;;; Code: + +(require 'cl-lib) + +(defvar letters->score '( + ("AEIOULNRST" . 1) + ("DG" . 2) + ("BCMP" . 3) + ("FHVWY" . 4) + ("K" . 5) + ("JX" . 8) + ("QZ" . 10) +)) + +(defun letter-score (letter) + "The Scrabble score for letter" + (let ((table letters->score)) + (while + (not (cl-find letter (caar table))) + (setq table (cdr table))) + (cdar table))) + +(defun score (word) + "The Scrabble score for word" + (let ((total 0) + (letters (cl-coerce (upcase word) 'list))) + (dolist (letter letters) + (setq total (+ total (letter-score letter)))) + total)) + +(provide 'scrabble-score) +;;; scrabble-score.el ends here diff --git a/exercises/practice/scrabble-score/.meta/tests.toml b/exercises/practice/scrabble-score/.meta/tests.toml new file mode 100644 index 00000000..33a873c0 --- /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/scrabble-score-test.el b/exercises/practice/scrabble-score/scrabble-score-test.el new file mode 100644 index 00000000..94fddd9f --- /dev/null +++ b/exercises/practice/scrabble-score/scrabble-score-test.el @@ -0,0 +1,55 @@ +;;; scrabble-score-test.el --- Tests for Scrabble Score (exercism) -*- lexical-binding: t; -*- + +;;; Commentary: + +;;; Code: + +(load-file "scrabble-score.el") +(declare-function score "scrabble-score.el" (word)) + + +(ert-deftest lowercase-letter () + (should (equal 1 (score "a")))) + + +(ert-deftest uppercase-letter () + (should (equal 1 (score "A")))) + + +(ert-deftest valuable-letter () + (should (equal 4 (score "f")))) + + +(ert-deftest short-word () + (should (equal 2 (score "at")))) + + +(ert-deftest short-valuable-word () + (should (equal 12 (score "zoo")))) + + +(ert-deftest medium-word () + (should (equal 6 (score "street")))) + + +(ert-deftest medium-valuable-word () + (should (equal 22 (score "quirky")))) + + +(ert-deftest long-mixed-case-word () + (should (equal 41 (score "OxyphenButazone")))) + + +(ert-deftest english-like-word () + (should (equal 8 (score "pinata")))) + + +(ert-deftest empty-input () + (should (equal 0 (score "")))) + + +(ert-deftest entire-alphabet-available () + (should (equal 87 (score "abcdefghijklmnopqrstuvwxyz")))) + +(provide 'scrabble-score-test) +;;; scrabble-score-test.el ends here diff --git a/exercises/practice/scrabble-score/scrabble-score.el b/exercises/practice/scrabble-score/scrabble-score.el new file mode 100644 index 00000000..2f603452 --- /dev/null +++ b/exercises/practice/scrabble-score/scrabble-score.el @@ -0,0 +1,11 @@ +;;; scrabble-score.el --- Scrabble Score (exercism) -*- lexical-binding: t; -*- + +;;; Commentary: + +;;; Code: + +(defun score (word) + (error "Delete this S-Expression and write your own implementation")) + +(provide 'scrabble-score) +;;; scrabble-score.el ends here From 5433b333435923f2d37524a96bf280745709e22c Mon Sep 17 00:00:00 2001 From: Jeremy Walker Date: Tue, 23 Apr 2024 16:41:23 +0100 Subject: [PATCH 2/2] Update config.json --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index 833fc0c6..5f01ae91 100644 --- a/config.json +++ b/config.json @@ -521,7 +521,7 @@ { "slug": "scrabble-score", "name": "Scrabble Score", - "uuid": "fb45c509-d83d-4f71-a8ef-f218c5426837", + "uuid": "fb45c509-d83d-4f71-a8ef-f218c5426838", "practices": [], "prerequisites": [], "difficulty": 3,