From 0368ec3c71cf54b0962e1d66c96054e382649fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 5 Aug 2024 21:55:24 -0700 Subject: [PATCH] Add ETL --- config.json | 8 +++++ exercises/practice/etl/.docs/instructions.md | 27 +++++++++++++++++ exercises/practice/etl/.docs/introduction.md | 16 ++++++++++ exercises/practice/etl/.meta/config.json | 19 ++++++++++++ exercises/practice/etl/.meta/example.coffee | 9 ++++++ exercises/practice/etl/.meta/tests.toml | 22 ++++++++++++++ exercises/practice/etl/etl.coffee | 4 +++ exercises/practice/etl/etl.spec.coffee | 31 ++++++++++++++++++++ 8 files changed, 136 insertions(+) create mode 100644 exercises/practice/etl/.docs/instructions.md create mode 100644 exercises/practice/etl/.docs/introduction.md create mode 100644 exercises/practice/etl/.meta/config.json create mode 100644 exercises/practice/etl/.meta/example.coffee create mode 100644 exercises/practice/etl/.meta/tests.toml create mode 100644 exercises/practice/etl/etl.coffee create mode 100644 exercises/practice/etl/etl.spec.coffee diff --git a/config.json b/config.json index 232a313..0bc59c5 100644 --- a/config.json +++ b/config.json @@ -168,6 +168,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "etl", + "name": "ETL", + "uuid": "2a1c165e-3ee8-47a4-b19d-7e44c79458f0", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "gigasecond", "name": "Gigasecond", diff --git a/exercises/practice/etl/.docs/instructions.md b/exercises/practice/etl/.docs/instructions.md new file mode 100644 index 0000000..802863b --- /dev/null +++ b/exercises/practice/etl/.docs/instructions.md @@ -0,0 +1,27 @@ +# Instructions + +Your task is to change the data format of letters and their point values in the game. + +Currently, letters are stored in groups based on their score, in a one-to-many mapping. + +- 1 point: "A", "E", "I", "O", "U", "L", "N", "R", "S", "T", +- 2 points: "D", "G", +- 3 points: "B", "C", "M", "P", +- 4 points: "F", "H", "V", "W", "Y", +- 5 points: "K", +- 8 points: "J", "X", +- 10 points: "Q", "Z", + +This needs to be changed to store each individual letter with its score in a one-to-one mapping. + +- "a" is worth 1 point. +- "b" is worth 3 points. +- "c" is worth 3 points. +- "d" is worth 2 points. +- etc. + +As part of this change, the team has also decided to change the letters to be lower-case rather than upper-case. + +~~~~exercism/note +If you want to look at how the data was previously structured and how it needs to change, take a look at the examples in the test suite. +~~~~ diff --git a/exercises/practice/etl/.docs/introduction.md b/exercises/practice/etl/.docs/introduction.md new file mode 100644 index 0000000..5be6514 --- /dev/null +++ b/exercises/practice/etl/.docs/introduction.md @@ -0,0 +1,16 @@ +# Introduction + +You work for a company that makes an online multiplayer game called Lexiconia. + +To play the game, each player is given 13 letters, which they must rearrange to create words. +Different letters have different point values, since it's easier to create words with some letters than others. + +The game was originally launched in English, but it is very popular, and now the company wants to expand to other languages as well. + +Different languages need to support different point values for letters. +The point values are determined by how often letters are used, compared to other letters in that language. + +For example, the letter 'C' is quite common in English, and is only worth 3 points. +But in Norwegian it's a very rare letter, and is worth 10 points. + +To make it easier to add new languages, your team needs to change the way letters and their point values are stored in the game. diff --git a/exercises/practice/etl/.meta/config.json b/exercises/practice/etl/.meta/config.json new file mode 100644 index 0000000..4322764 --- /dev/null +++ b/exercises/practice/etl/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "etl.coffee" + ], + "test": [ + "etl.spec.coffee" + ], + "example": [ + ".meta/example.coffee" + ] + }, + "blurb": "Change the data format for scoring a game to more easily add other languages.", + "source": "Based on an exercise by the JumpstartLab team for students at The Turing School of Software and Design.", + "source_url": "https://turing.edu" +} diff --git a/exercises/practice/etl/.meta/example.coffee b/exercises/practice/etl/.meta/example.coffee new file mode 100644 index 0000000..d7bd9c4 --- /dev/null +++ b/exercises/practice/etl/.meta/example.coffee @@ -0,0 +1,9 @@ +class Etl + @transform: (legacy) -> + results = {} + for score, letters of legacy + for letter in letters + results[letter.toLowerCase()] = +score + results + +module.exports = Etl diff --git a/exercises/practice/etl/.meta/tests.toml b/exercises/practice/etl/.meta/tests.toml new file mode 100644 index 0000000..e937107 --- /dev/null +++ b/exercises/practice/etl/.meta/tests.toml @@ -0,0 +1,22 @@ +# 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. + +[78a7a9f9-4490-4a47-8ee9-5a38bb47d28f] +description = "single letter" + +[60dbd000-451d-44c7-bdbb-97c73ac1f497] +description = "single score with multiple letters" + +[f5c5de0c-301f-4fdd-a0e5-df97d4214f54] +description = "multiple scores with multiple letters" + +[5db8ea89-ecb4-4dcd-902f-2b418cc87b9d] +description = "multiple scores with differing numbers of letters" diff --git a/exercises/practice/etl/etl.coffee b/exercises/practice/etl/etl.coffee new file mode 100644 index 0000000..89ed4a3 --- /dev/null +++ b/exercises/practice/etl/etl.coffee @@ -0,0 +1,4 @@ +class Etl + @transform: (legacy) -> + +module.exports = Etl diff --git a/exercises/practice/etl/etl.spec.coffee b/exercises/practice/etl/etl.spec.coffee new file mode 100644 index 0000000..e4cdef3 --- /dev/null +++ b/exercises/practice/etl/etl.spec.coffee @@ -0,0 +1,31 @@ +Etl = require './etl' + +describe "ETL", -> + it 'single letter', -> + result = Etl.transform { 1: ['A'] } + expect(result).toEqual { 'a': 1 } + + xit 'single score with multiple letters', -> + result = Etl.transform { 1: ['A', 'E', 'I', 'O', 'U'] } + expect(result).toEqual { 'a': 1, 'e': 1, 'i': 1, 'o': 1, 'u': 1 } + + xit 'multiple scores with multiple letters', -> + result = Etl.transform { 1: ['A', 'E'], 2: ['D', 'G'] } + expect(result).toEqual { 'a': 1, 'd': 2, 'e': 1, 'g': 2 } + + xit 'multiple scores with differing numbers of letters', -> + result = Etl.transform { + 1: ['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'] + 2: ['D', 'G'] + 3: ['B', 'C', 'M', 'P'] + 4: ['F', 'H', 'V', 'W', 'Y'] + 5: ['K'] + 8: ['J', 'X'] + 10: ['Q', 'Z'] + } + expect(result).toEqual { + 'a': 1, 'b': 3, 'c': 3, 'd': 2, 'e': 1, 'f': 4, 'g': 2, 'h': 4, + 'i': 1, 'j': 8, 'k': 5, 'l': 1, 'm': 3, 'n': 1, 'o': 1, 'p': 3, + 'q': 10, 'r': 1, 's': 1, 't': 1, 'u': 1, 'v': 4, 'w': 4, 'x': 8, + 'y': 4, 'z': 10 + }