diff --git a/config.json b/config.json index 49fec57..4ecaade 100644 --- a/config.json +++ b/config.json @@ -673,6 +673,14 @@ "practices": [], "prerequisites": [], "difficulty": 8 + }, + { + "slug": "line-up", + "name": "Line up", + "uuid": "bb005a57-11f8-4379-b181-cfb799b04a8f", + "practices": [], + "prerequisites": [], + "difficulty": 3 } ] }, diff --git a/exercises/practice/line-up/.docs/instructions.md b/exercises/practice/line-up/.docs/instructions.md new file mode 100644 index 0000000..fb41d4c --- /dev/null +++ b/exercises/practice/line-up/.docs/instructions.md @@ -0,0 +1,19 @@ +# Instructions + +Given a name and a number, your task is to produce a sentence using that name and that number as an [ordinal numeral][ordinal-numeral]. +Yaʻqūb expects to use numbers from 1 up to 999. + +Rules: + +- Numbers ending in 1 (except for 11) → `"st"` +- Numbers ending in 2 (except for 12) → `"nd"` +- Numbers ending in 3 (except for 13) → `"rd"` +- All other numbers → `"th"` + +Examples: + +- `"Mary", 1` → `"Mary, you are the 1st customer we serve today. Thank you!"` +- `"John", 12` → `"John, you are the 12th customer we serve today. Thank you!"` +- `"Dahir", 162` → `"Dahir, you are the 162nd customer we serve today. Thank you!"` + +[ordinal-numeral]: https://en.wikipedia.org/wiki/Ordinal_numeral diff --git a/exercises/practice/line-up/.docs/introduction.md b/exercises/practice/line-up/.docs/introduction.md new file mode 100644 index 0000000..ea07268 --- /dev/null +++ b/exercises/practice/line-up/.docs/introduction.md @@ -0,0 +1,7 @@ +# Introduction + +Your friend Yaʻqūb works the counter at a deli in town, slicing, weighing, and wrapping orders for a line of hungry customers that gets longer every day. +Waiting customers are starting to lose track of who is next, so he wants numbered tickets they can use to track the order in which they arrive. + +To make the customers feel special, he does not want the ticket to have only a number on it. +They shall get a proper English sentence with their name and number on it. diff --git a/exercises/practice/line-up/.meta/config.json b/exercises/practice/line-up/.meta/config.json new file mode 100644 index 0000000..c91280d --- /dev/null +++ b/exercises/practice/line-up/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "jimmytty" + ], + "files": { + "solution": [ + "line-up.sql" + ], + "test": [ + "line-up_test.sql" + ], + "example": [ + ".meta/example.sql" + ] + }, + "blurb": "Help lining up customers at Yaʻqūb's Deli.", + "source": "mk-mxp, based on previous work from Exercism contributors codedge and neenjaw", + "source_url": "https://forum.exercism.org/t/new-exercise-ordinal-numbers/19147" +} diff --git a/exercises/practice/line-up/.meta/example.sql b/exercises/practice/line-up/.meta/example.sql new file mode 100644 index 0000000..04f96d4 --- /dev/null +++ b/exercises/practice/line-up/.meta/example.sql @@ -0,0 +1,15 @@ +UPDATE "line-up" +SET + result = PRINTF( + '%s, you are the %s customer we serve today. Thank you!', + name, + CASE + WHEN number % 10 = 1 + AND number % 100 != 11 THEN number || 'st' + WHEN number % 10 = 2 + AND number % 100 != 12 THEN number || 'nd' + WHEN number % 10 = 3 + AND number % 100 != 13 THEN number || 'rd' + ELSE number || 'th' + END + ); diff --git a/exercises/practice/line-up/.meta/tests.toml b/exercises/practice/line-up/.meta/tests.toml new file mode 100644 index 0000000..36fdf1d --- /dev/null +++ b/exercises/practice/line-up/.meta/tests.toml @@ -0,0 +1,67 @@ +# 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. + +[7760d1b8-4864-4db4-953b-0fa7c047dbc0] +description = "format smallest non-exceptional ordinal numeral 4" + +[e8b7c715-6baa-4f7b-8fb3-2fa48044ab7a] +description = "format greatest single digit non-exceptional ordinal numeral 9" + +[f370aae9-7ae7-4247-90ce-e8ff8c6934df] +description = "format non-exceptional ordinal numeral 5" + +[37f10dea-42a2-49de-bb92-0b690b677908] +description = "format non-exceptional ordinal numeral 6" + +[d8dfb9a2-3a1f-4fee-9dae-01af3600054e] +description = "format non-exceptional ordinal numeral 7" + +[505ec372-1803-42b1-9377-6934890fd055] +description = "format non-exceptional ordinal numeral 8" + +[8267072d-be1f-4f70-b34a-76b7557a47b9] +description = "format exceptional ordinal numeral 1" + +[4d8753cb-0364-4b29-84b8-4374a4fa2e3f] +description = "format exceptional ordinal numeral 2" + +[8d44c223-3a7e-4f48-a0ca-78e67bf98aa7] +description = "format exceptional ordinal numeral 3" + +[6c4f6c88-b306-4f40-bc78-97cdd583c21a] +description = "format smallest two digit non-exceptional ordinal numeral 10" + +[e257a43f-d2b1-457a-97df-25f0923fc62a] +description = "format non-exceptional ordinal numeral 11" + +[bb1db695-4d64-457f-81b8-4f5a2107e3f4] +description = "format non-exceptional ordinal numeral 12" + +[60a3187c-9403-4835-97de-4f10ebfd63e2] +description = "format non-exceptional ordinal numeral 13" + +[2bdcebc5-c029-4874-b6cc-e9bec80d603a] +description = "format exceptional ordinal numeral 21" + +[74ee2317-0295-49d2-baf0-d56bcefa14e3] +description = "format exceptional ordinal numeral 62" + +[b37c332d-7f68-40e3-8503-e43cbd67a0c4] +description = "format exceptional ordinal numeral 100" + +[0375f250-ce92-4195-9555-00e28ccc4d99] +description = "format exceptional ordinal numeral 101" + +[0d8a4974-9a8a-45a4-aca7-a9fb473c9836] +description = "format non-exceptional ordinal numeral 112" + +[06b62efe-199e-4ce7-970d-4bf73945713f] +description = "format exceptional ordinal numeral 123" diff --git a/exercises/practice/line-up/create_fixture.sql b/exercises/practice/line-up/create_fixture.sql new file mode 100644 index 0000000..9efd5ac --- /dev/null +++ b/exercises/practice/line-up/create_fixture.sql @@ -0,0 +1,14 @@ +DROP TABLE IF EXISTS "line-up"; + +CREATE TABLE "line-up" ( + name TEXT NOT NULL, + number INTEGER NOT NULL, + result TEXT +); + +.mode csv +.import ./data.csv "line-up" + +UPDATE "line-up" +SET + result = NULL; diff --git a/exercises/practice/line-up/create_test_table.sql b/exercises/practice/line-up/create_test_table.sql new file mode 100644 index 0000000..1322eb0 --- /dev/null +++ b/exercises/practice/line-up/create_test_table.sql @@ -0,0 +1,154 @@ +DROP TABLE IF EXISTS tests; + +CREATE TABLE IF NOT EXISTS tests ( + -- uuid and description are taken from the test.toml file + uuid TEXT PRIMARY KEY, + description TEXT NOT NULL, + -- The following section is needed by the online test-runner + status TEXT DEFAULT 'fail', + message TEXT, + output TEXT, + test_code TEXT, + task_id INTEGER DEFAULT NULL, + -- Here are columns for the actual tests + name TEXT NOT NULL, + number INTEGER NOT NULL, + expected TEXT NOT NULL +); + +INSERT INTO + tests (uuid, description, name, number, expected) +VALUES + ( + '7760d1b8-4864-4db4-953b-0fa7c047dbc0', + 'format smallest non-exceptional ordinal numeral 4', + 'Gianna', + 4, + 'Gianna, you are the 4th customer we serve today. Thank you!' + ), + ( + 'e8b7c715-6baa-4f7b-8fb3-2fa48044ab7a', + 'format greatest single digit non-exceptional ordinal numeral 9', + 'Maarten', + 9, + 'Maarten, you are the 9th customer we serve today. Thank you!' + ), + ( + 'f370aae9-7ae7-4247-90ce-e8ff8c6934df', + 'format non-exceptional ordinal numeral 5', + 'Petronila', + 5, + 'Petronila, you are the 5th customer we serve today. Thank you!' + ), + ( + '37f10dea-42a2-49de-bb92-0b690b677908', + 'format non-exceptional ordinal numeral 6', + 'Attakullakulla', + 6, + 'Attakullakulla, you are the 6th customer we serve today. Thank you!' + ), + ( + 'd8dfb9a2-3a1f-4fee-9dae-01af3600054e', + 'format non-exceptional ordinal numeral 7', + 'Kate', + 7, + 'Kate, you are the 7th customer we serve today. Thank you!' + ), + ( + '505ec372-1803-42b1-9377-6934890fd055', + 'format non-exceptional ordinal numeral 8', + 'Maximiliano', + 8, + 'Maximiliano, you are the 8th customer we serve today. Thank you!' + ), + ( + '8267072d-be1f-4f70-b34a-76b7557a47b9', + 'format exceptional ordinal numeral 1', + 'Mary', + 1, + 'Mary, you are the 1st customer we serve today. Thank you!' + ), + ( + '4d8753cb-0364-4b29-84b8-4374a4fa2e3f', + 'format exceptional ordinal numeral 2', + 'Haruto', + 2, + 'Haruto, you are the 2nd customer we serve today. Thank you!' + ), + ( + '8d44c223-3a7e-4f48-a0ca-78e67bf98aa7', + 'format exceptional ordinal numeral 3', + 'Henriette', + 3, + 'Henriette, you are the 3rd customer we serve today. Thank you!' + ), + ( + '6c4f6c88-b306-4f40-bc78-97cdd583c21a', + 'format smallest two digit non-exceptional ordinal numeral 10', + 'Alvarez', + 10, + 'Alvarez, you are the 10th customer we serve today. Thank you!' + ), + ( + 'e257a43f-d2b1-457a-97df-25f0923fc62a', + 'format non-exceptional ordinal numeral 11', + 'Jacqueline', + 11, + 'Jacqueline, you are the 11th customer we serve today. Thank you!' + ), + ( + 'bb1db695-4d64-457f-81b8-4f5a2107e3f4', + 'format non-exceptional ordinal numeral 12', + 'Juan', + 12, + 'Juan, you are the 12th customer we serve today. Thank you!' + ), + ( + '60a3187c-9403-4835-97de-4f10ebfd63e2', + 'format non-exceptional ordinal numeral 13', + 'Patricia', + 13, + 'Patricia, you are the 13th customer we serve today. Thank you!' + ), + ( + '2bdcebc5-c029-4874-b6cc-e9bec80d603a', + 'format exceptional ordinal numeral 21', + 'Washi', + 21, + 'Washi, you are the 21st customer we serve today. Thank you!' + ), + ( + '74ee2317-0295-49d2-baf0-d56bcefa14e3', + 'format exceptional ordinal numeral 62', + 'Nayra', + 62, + 'Nayra, you are the 62nd customer we serve today. Thank you!' + ), + ( + 'b37c332d-7f68-40e3-8503-e43cbd67a0c4', + 'format exceptional ordinal numeral 100', + 'John', + 100, + 'John, you are the 100th customer we serve today. Thank you!' + ), + ( + '0375f250-ce92-4195-9555-00e28ccc4d99', + 'format exceptional ordinal numeral 101', + 'Zeinab', + 101, + 'Zeinab, you are the 101st customer we serve today. Thank you!' + ), + ( + '0d8a4974-9a8a-45a4-aca7-a9fb473c9836', + 'format non-exceptional ordinal numeral 112', + 'Knud', + 112, + 'Knud, you are the 112th customer we serve today. Thank you!' + ), + ( + '06b62efe-199e-4ce7-970d-4bf73945713f', + 'format exceptional ordinal numeral 123', + 'Yma', + 123, + 'Yma, you are the 123rd customer we serve today. Thank you!' + ); diff --git a/exercises/practice/line-up/data.csv b/exercises/practice/line-up/data.csv new file mode 100644 index 0000000..47929c6 --- /dev/null +++ b/exercises/practice/line-up/data.csv @@ -0,0 +1,19 @@ +Gianna,4, +Maarten,9, +Petronila,5, +Attakullakulla,6, +Kate,7, +Maximiliano,8, +Mary,1, +Haruto,2, +Henriette,3, +Alvarez,10, +Jacqueline,11, +Juan,12, +Patricia,13, +Washi,21, +Nayra,62, +John,100, +Zeinab,101, +Knud,112, +Yma,123, diff --git a/exercises/practice/line-up/line-up.sql b/exercises/practice/line-up/line-up.sql new file mode 100644 index 0000000..ada7ede --- /dev/null +++ b/exercises/practice/line-up/line-up.sql @@ -0,0 +1,8 @@ +-- Schema: +-- CREATE TABLE "line-up" ( +-- name TEXT NOT NULL, +-- number INTEGER NOT NULL, +-- result TEXT +-- ); +-- +-- Task: Update the line-up table and set the result column based on the name and the number. diff --git a/exercises/practice/line-up/line-up_test.sql b/exercises/practice/line-up/line-up_test.sql new file mode 100644 index 0000000..88489cb --- /dev/null +++ b/exercises/practice/line-up/line-up_test.sql @@ -0,0 +1,65 @@ +-- Create database: +.read ./create_fixture.sql +-- Read user student solution and save any output as markdown in user_output.md: +.mode markdown +.output user_output.md +.read ./line-up.sql +.output +-- Create a clean testing environment: +.read ./create_test_table.sql +-- Comparison of user input and the tests updates the status for each test: +UPDATE tests +SET + status = 'pass' +FROM + ( + SELECT + name, + number, + result + FROM + "line-up" + ) AS actual +WHERE + (actual.name, actual.number, actual.result) = (tests.name, tests.number, tests.expected); + +-- Update message for failed tests to give helpful information: +UPDATE tests +SET + message = ( + 'Result for "' || PRINTF('name=%s, number=%s', tests.name, tests.number) || '"' || ' is <' || COALESCE(actual.result, 'NULL') || '> but should be <' || tests.expected || '>' + ) +FROM + ( + SELECT + name, + number, + result + FROM + "line-up" + ) AS actual +WHERE + (actual.name, actual.NUMBER) = (tests.name, tests.number) + AND tests.status = 'fail'; + +-- Save results to ./output.json (needed by the online test-runner) +.mode json +.once './output.json' +SELECT + description, + status, + message, + output, + test_code, + task_id +FROM + tests; + +-- Display test results in readable form for the student: +.mode table +SELECT + description, + status, + message +FROM + tests;