diff --git a/config.json b/config.json index e6bc41b..96b0612 100644 --- a/config.json +++ b/config.json @@ -98,6 +98,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "etl", + "name": "ETL", + "uuid": "4b6d8618-7080-444d-b71f-36719ef2eb1c", + "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..c73f036 --- /dev/null +++ b/exercises/practice/etl/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "etl.ex" + ], + "test": [ + "t_etl.e" + ], + "example": [ + ".meta/example.ex" + ] + }, + "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.ex b/exercises/practice/etl/.meta/example.ex new file mode 100644 index 0000000..1c2965a --- /dev/null +++ b/exercises/practice/etl/.meta/example.ex @@ -0,0 +1,19 @@ +include std/map.e +include std/text.e + +public function transform(map legacy) + map results = map:new() + sequence pairs = map:pairs(legacy) + + for i = 1 to length(pairs) do + atom score = pairs[i][1] + sequence letters = pairs[i][2] + + for j = 1 to length(letters) do + atom letter = letters[j] + map:put(results, lower(letter), score) + end for + end for + + return results +end function 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.ex b/exercises/practice/etl/etl.ex new file mode 100644 index 0000000..0984225 --- /dev/null +++ b/exercises/practice/etl/etl.ex @@ -0,0 +1,3 @@ +public function transform(map legacy) + +end function diff --git a/exercises/practice/etl/t_etl.e b/exercises/practice/etl/t_etl.e new file mode 100644 index 0000000..29bd695 --- /dev/null +++ b/exercises/practice/etl/t_etl.e @@ -0,0 +1,64 @@ +include std/map.e +include std/sort.e +include std/unittest.e + +include etl.ex + +procedure test_maps_equal(sequence message, map a, map b) + test_equal(message, sort(map:pairs(a)), sort(map:pairs(b))) +end procedure + + +set_test_verbosity(TEST_SHOW_ALL) + +test_maps_equal("single letter", + transform( + map:new_from_kvpairs({ + { 1, { 'A' }} + })), + map:new_from_kvpairs({ + { 'a', 1 } + })) +test_maps_equal("single score with multiple letters", + transform( + map:new_from_kvpairs({ + { 1, { 'A', 'E', 'I', 'O', 'U' }} + })), + map:new_from_kvpairs({ + { 'a', 1 }, + { 'e', 1 }, + { 'i', 1 }, + { 'o', 1 }, + { 'u', 1 } + })) +test_maps_equal("multiple scores with multiple letters", + transform( + map:new_from_kvpairs({ + { 1, { 'A', 'E' } }, + { 2, { 'D', 'G' } } + })), + map:new_from_kvpairs({ + { 'a', 1 }, + { 'd', 2 }, + { 'e', 1 }, + { 'g', 2 } + })) +test_maps_equal("multiple scores with differing numbers of letters", + transform( + map:new_from_kvpairs({ + { 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' }} + })), + map:new_from_kvpairs({ + { '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 } + })) + +test_report()