diff --git a/config.json b/config.json index 5763308..b3efcbf 100644 --- a/config.json +++ b/config.json @@ -106,6 +106,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "pangram", + "name": "Pangram", + "uuid": "f11e9d34-d454-42a8-bd2f-d1a8b6000975", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "raindrops", "name": "Raindrops", diff --git a/exercises/practice/pangram/.docs/instructions.md b/exercises/practice/pangram/.docs/instructions.md new file mode 100644 index 0000000..817c872 --- /dev/null +++ b/exercises/practice/pangram/.docs/instructions.md @@ -0,0 +1,8 @@ +# Instructions + +Your task is to figure out if a sentence is a pangram. + +A pangram is a sentence using every letter of the alphabet at least once. +It is case insensitive, so it doesn't matter if a letter is lower-case (e.g. `k`) or upper-case (e.g. `K`). + +For this exercise, a sentence is a pangram if it contains each of the 26 letters in the English alphabet. diff --git a/exercises/practice/pangram/.docs/introduction.md b/exercises/practice/pangram/.docs/introduction.md new file mode 100644 index 0000000..32b6f1f --- /dev/null +++ b/exercises/practice/pangram/.docs/introduction.md @@ -0,0 +1,16 @@ +# Introduction + +You work for a company that sells fonts through their website. +They'd like to show a different sentence each time someone views a font on their website. +To give a comprehensive sense of the font, the random sentences should use **all** the letters in the English alphabet. + +They're running a competition to get suggestions for sentences that they can use. +You're in charge of checking the submissions to see if they are valid. + +~~~~exercism/note +Pangram comes from Greek, παν γράμμα, pan gramma, which means "every letter". + +The best known English pangram is: + +> The quick brown fox jumps over the lazy dog. +~~~~ diff --git a/exercises/practice/pangram/.meta/config.json b/exercises/practice/pangram/.meta/config.json new file mode 100644 index 0000000..bf300bf --- /dev/null +++ b/exercises/practice/pangram/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "jimmytty" + ], + "files": { + "solution": [ + "pangram.sql" + ], + "test": [ + "pangram_test.sql" + ], + "example": [ + ".meta/example.sql" + ] + }, + "blurb": "Determine if a sentence is a pangram.", + "source": "Wikipedia", + "source_url": "https://en.wikipedia.org/wiki/Pangram" +} diff --git a/exercises/practice/pangram/.meta/example.sql b/exercises/practice/pangram/.meta/example.sql new file mode 100644 index 0000000..9f284d0 --- /dev/null +++ b/exercises/practice/pangram/.meta/example.sql @@ -0,0 +1,29 @@ +UPDATE pangram + SET result = ( + INSTR(LOWER(sentence), 'a') + AND INSTR(LOWER(sentence), 'b') + AND INSTR(LOWER(sentence), 'c') + AND INSTR(LOWER(sentence), 'd') + AND INSTR(LOWER(sentence), 'e') + AND INSTR(LOWER(sentence), 'f') + AND INSTR(LOWER(sentence), 'g') + AND INSTR(LOWER(sentence), 'h') + AND INSTR(LOWER(sentence), 'i') + AND INSTR(LOWER(sentence), 'j') + AND INSTR(LOWER(sentence), 'k') + AND INSTR(LOWER(sentence), 'l') + AND INSTR(LOWER(sentence), 'm') + AND INSTR(LOWER(sentence), 'n') + AND INSTR(LOWER(sentence), 'o') + AND INSTR(LOWER(sentence), 'p') + AND INSTR(LOWER(sentence), 'q') + AND INSTR(LOWER(sentence), 'r') + AND INSTR(LOWER(sentence), 's') + AND INSTR(LOWER(sentence), 't') + AND INSTR(LOWER(sentence), 'u') + AND INSTR(LOWER(sentence), 'v') + AND INSTR(LOWER(sentence), 'w') + AND INSTR(LOWER(sentence), 'x') + AND INSTR(LOWER(sentence), 'y') + AND INSTR(LOWER(sentence), 'z') + ); diff --git a/exercises/practice/pangram/.meta/tests.toml b/exercises/practice/pangram/.meta/tests.toml new file mode 100644 index 0000000..10b5a33 --- /dev/null +++ b/exercises/practice/pangram/.meta/tests.toml @@ -0,0 +1,45 @@ +# 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. + +[64f61791-508e-4f5c-83ab-05de042b0149] +description = "empty sentence" + +[74858f80-4a4d-478b-8a5e-c6477e4e4e84] +description = "perfect lower case" + +[61288860-35ca-4abe-ba08-f5df76ecbdcd] +description = "only lower case" + +[6564267d-8ac5-4d29-baf2-e7d2e304a743] +description = "missing the letter 'x'" + +[c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0] +description = "missing the letter 'h'" + +[d835ec38-bc8f-48e4-9e36-eb232427b1df] +description = "with underscores" + +[8cc1e080-a178-4494-b4b3-06982c9be2a8] +description = "with numbers" + +[bed96b1c-ff95-45b8-9731-fdbdcb6ede9a] +description = "missing letters replaced by numbers" + +[938bd5d8-ade5-40e2-a2d9-55a338a01030] +description = "mixed case and punctuation" + +[2577bf54-83c8-402d-a64b-a2c0f7bb213a] +description = "case insensitive" +include = false + +[7138e389-83e4-4c6e-8413-1e40a0076951] +description = "a-m and A-M are 26 different characters but not a pangram" +reimplements = "2577bf54-83c8-402d-a64b-a2c0f7bb213a" diff --git a/exercises/practice/pangram/create_fixture.sql b/exercises/practice/pangram/create_fixture.sql new file mode 100644 index 0000000..752079e --- /dev/null +++ b/exercises/practice/pangram/create_fixture.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS pangram; +CREATE TABLE pangram ( + sentence TEXT NOT NULL, + result BOOLEAN +); + +.mode csv +.import ./data.csv pangram + +UPDATE pangram SET result = NULL; diff --git a/exercises/practice/pangram/create_test_table.sql b/exercises/practice/pangram/create_test_table.sql new file mode 100644 index 0000000..c1d4116 --- /dev/null +++ b/exercises/practice/pangram/create_test_table.sql @@ -0,0 +1,28 @@ +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 + sentence TEXT NOT NULL, + expected BOOLEAN NOT NULL +); + +INSERT INTO tests (uuid, description, sentence, expected) + VALUES + ('64f61791-508e-4f5c-83ab-05de042b0149', 'empty sentence', '', false), + ('74858f80-4a4d-478b-8a5e-c6477e4e4e84', 'perfect lower case', 'abcdefghijklmnopqrstuvwxyz', true), + ('61288860-35ca-4abe-ba08-f5df76ecbdcd', 'only lower case', 'the quick brown fox jumps over the lazy dog', true), + ('6564267d-8ac5-4d29-baf2-e7d2e304a743', 'missing the letter ''x''', 'a quick movement of the enemy will jeopardize five gunboats', false), + ('c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0', 'missing the letter ''h''', 'five boxing wizards jump quickly at it', false), + ('d835ec38-bc8f-48e4-9e36-eb232427b1df', 'with underscores', 'the_quick_brown_fox_jumps_over_the_lazy_dog', true), + ('8cc1e080-a178-4494-b4b3-06982c9be2a8', 'with numbers', 'the 1 quick brown fox jumps over the 2 lazy dogs', true), + ('bed96b1c-ff95-45b8-9731-fdbdcb6ede9a', 'missing letters replaced by numbers', '7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog', false), + ('938bd5d8-ade5-40e2-a2d9-55a338a01030', 'mixed case and punctuation', '"Five quacking Zephyrs jolt my wax bed."', true), + ('7138e389-83e4-4c6e-8413-1e40a0076951', 'a-m and A-M are 26 different characters but not a pangram', 'abcdefghijklm ABCDEFGHIJKLM', false); diff --git a/exercises/practice/pangram/data.csv b/exercises/practice/pangram/data.csv new file mode 100644 index 0000000..0008d34 --- /dev/null +++ b/exercises/practice/pangram/data.csv @@ -0,0 +1,10 @@ +"","" +"abcdefghijklmnopqrstuvwxyz","" +"the quick brown fox jumps over the lazy dog","" +"a quick movement of the enemy will jeopardize five gunboats","" +"five boxing wizards jump quickly at it","" +"the_quick_brown_fox_jumps_over_the_lazy_dog","" +"the 1 quick brown fox jumps over the 2 lazy dogs","" +"7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog","" +"""Five quacking Zephyrs jolt my wax bed.""","" +"abcdefghijklm ABCDEFGHIJKLM","" diff --git a/exercises/practice/pangram/pangram.sql b/exercises/practice/pangram/pangram.sql new file mode 100644 index 0000000..4a4e120 --- /dev/null +++ b/exercises/practice/pangram/pangram.sql @@ -0,0 +1,2 @@ +-- Schema: CREATE TABLE pangram (sentence TEXT NOT NULL, result BOOLEAN); +-- Task: update pangram table and set result based on sentence. diff --git a/exercises/practice/pangram/pangram_test.sql b/exercises/practice/pangram/pangram_test.sql new file mode 100644 index 0000000..81f402a --- /dev/null +++ b/exercises/practice/pangram/pangram_test.sql @@ -0,0 +1,40 @@ +-- 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 ./pangram.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 sentence, result FROM pangram) AS actual +WHERE (actual.sentence, actual.result) = (tests.sentence, tests.expected); + +-- Update message for failed tests to give helpful information: +UPDATE tests +SET message = ( + 'Result for "' + || actual.sentence + || '"' + || ' is <' || COALESCE(actual.result, 'NULL') + || '> but should be <' || tests.expected || '>' +) +FROM (SELECT sentence, result FROM pangram) AS actual +WHERE actual.sentence = tests.sentence 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;