From 69d28bf45fe6d1be55e29ce2c3a2d78f00f998ce Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Tue, 17 Dec 2024 11:35:26 +0100 Subject: [PATCH] Add `clock` exercise (#128) --- config.json | 8 + .../practice/clock/.docs/instructions.md | 7 + exercises/practice/clock/.meta/config.json | 18 ++ exercises/practice/clock/.meta/example.ua | 6 + exercises/practice/clock/.meta/tests.toml | 166 +++++++++++++ exercises/practice/clock/clock.ua | 17 ++ exercises/practice/clock/tests.ua | 225 ++++++++++++++++++ 7 files changed, 447 insertions(+) create mode 100644 exercises/practice/clock/.docs/instructions.md create mode 100644 exercises/practice/clock/.meta/config.json create mode 100644 exercises/practice/clock/.meta/example.ua create mode 100644 exercises/practice/clock/.meta/tests.toml create mode 100644 exercises/practice/clock/clock.ua create mode 100644 exercises/practice/clock/tests.ua diff --git a/config.json b/config.json index e86a11d..85dbb26 100644 --- a/config.json +++ b/config.json @@ -386,6 +386,14 @@ "prerequisites": [], "difficulty": 4 }, + { + "slug": "clock", + "name": "Clock", + "uuid": "77c9e982-bf98-4f23-9fed-3f65e4a176d7", + "practices": [], + "prerequisites": [], + "difficulty": 4 + }, { "slug": "allergies", "name": "Allergies", diff --git a/exercises/practice/clock/.docs/instructions.md b/exercises/practice/clock/.docs/instructions.md new file mode 100644 index 0000000..a1efc78 --- /dev/null +++ b/exercises/practice/clock/.docs/instructions.md @@ -0,0 +1,7 @@ +# Instructions + +Implement a clock that handles times without dates. + +You should be able to add and subtract minutes to it. + +Two clocks that represent the same time should be equal to each other. diff --git a/exercises/practice/clock/.meta/config.json b/exercises/practice/clock/.meta/config.json new file mode 100644 index 0000000..6277342 --- /dev/null +++ b/exercises/practice/clock/.meta/config.json @@ -0,0 +1,18 @@ +{ + "authors": [ + "erikschierboom" + ], + "files": { + "solution": [ + "clock.ua" + ], + "test": [ + "tests.ua" + ], + "example": [ + ".meta/example.ua" + ] + }, + "blurb": "Implement a clock that handles times without dates.", + "source": "Pairing session with Erin Drummond" +} diff --git a/exercises/practice/clock/.meta/example.ua b/exercises/practice/clock/.meta/example.ua new file mode 100644 index 0000000..88490e1 --- /dev/null +++ b/exercises/practice/clock/.meta/example.ua @@ -0,0 +1,6 @@ +┌─╴Clock + New ← ◿1440+×60 + Add ← New 0 + + Sub ← New 0 - + Display ← $"_:_" ∩(⨬(∘|$"0_")=1⧻.°⋕) ⊃(⌊÷60|◿60) +└─╴ diff --git a/exercises/practice/clock/.meta/tests.toml b/exercises/practice/clock/.meta/tests.toml new file mode 100644 index 0000000..712c87b --- /dev/null +++ b/exercises/practice/clock/.meta/tests.toml @@ -0,0 +1,166 @@ +# 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. + +[a577bacc-106b-496e-9792-b3083ea8705e] +description = "Create a new clock with an initial time -> on the hour" + +[b5d0c360-3b88-489b-8e84-68a1c7a4fa23] +description = "Create a new clock with an initial time -> past the hour" + +[473223f4-65f3-46ff-a9f7-7663c7e59440] +description = "Create a new clock with an initial time -> midnight is zero hours" + +[ca95d24a-5924-447d-9a96-b91c8334725c] +description = "Create a new clock with an initial time -> hour rolls over" + +[f3826de0-0925-4d69-8ac8-89aea7e52b78] +description = "Create a new clock with an initial time -> hour rolls over continuously" + +[a02f7edf-dfd4-4b11-b21a-86de3cc6a95c] +description = "Create a new clock with an initial time -> sixty minutes is next hour" + +[8f520df6-b816-444d-b90f-8a477789beb5] +description = "Create a new clock with an initial time -> minutes roll over" + +[c75c091b-47ac-4655-8d40-643767fc4eed] +description = "Create a new clock with an initial time -> minutes roll over continuously" + +[06343ecb-cf39-419d-a3f5-dcbae0cc4c57] +description = "Create a new clock with an initial time -> hour and minutes roll over" + +[be60810e-f5d9-4b58-9351-a9d1e90e660c] +description = "Create a new clock with an initial time -> hour and minutes roll over continuously" + +[1689107b-0b5c-4bea-aad3-65ec9859368a] +description = "Create a new clock with an initial time -> hour and minutes roll over to exactly midnight" + +[d3088ee8-91b7-4446-9e9d-5e2ad6219d91] +description = "Create a new clock with an initial time -> negative hour" + +[77ef6921-f120-4d29-bade-80d54aa43b54] +description = "Create a new clock with an initial time -> negative hour rolls over" + +[359294b5-972f-4546-bb9a-a85559065234] +description = "Create a new clock with an initial time -> negative hour rolls over continuously" + +[509db8b7-ac19-47cc-bd3a-a9d2f30b03c0] +description = "Create a new clock with an initial time -> negative minutes" + +[5d6bb225-130f-4084-84fd-9e0df8996f2a] +description = "Create a new clock with an initial time -> negative minutes roll over" + +[d483ceef-b520-4f0c-b94a-8d2d58cf0484] +description = "Create a new clock with an initial time -> negative minutes roll over continuously" + +[1cd19447-19c6-44bf-9d04-9f8305ccb9ea] +description = "Create a new clock with an initial time -> negative sixty minutes is previous hour" + +[9d3053aa-4f47-4afc-bd45-d67a72cef4dc] +description = "Create a new clock with an initial time -> negative hour and minutes both roll over" + +[51d41fcf-491e-4ca0-9cae-2aa4f0163ad4] +description = "Create a new clock with an initial time -> negative hour and minutes both roll over continuously" + +[d098e723-ad29-4ef9-997a-2693c4c9d89a] +description = "Add minutes -> add minutes" + +[b6ec8f38-e53e-4b22-92a7-60dab1f485f4] +description = "Add minutes -> add no minutes" + +[efd349dd-0785-453e-9ff8-d7452a8e7269] +description = "Add minutes -> add to next hour" + +[749890f7-aba9-4702-acce-87becf4ef9fe] +description = "Add minutes -> add more than one hour" + +[da63e4c1-1584-46e3-8d18-c9dc802c1713] +description = "Add minutes -> add more than two hours with carry" + +[be167a32-3d33-4cec-a8bc-accd47ddbb71] +description = "Add minutes -> add across midnight" + +[6672541e-cdae-46e4-8be7-a820cc3be2a8] +description = "Add minutes -> add more than one day (1500 min = 25 hrs)" + +[1918050d-c79b-4cb7-b707-b607e2745c7e] +description = "Add minutes -> add more than two days" + +[37336cac-5ede-43a5-9026-d426cbe40354] +description = "Subtract minutes -> subtract minutes" + +[0aafa4d0-3b5f-4b12-b3af-e3a9e09c047b] +description = "Subtract minutes -> subtract to previous hour" + +[9b4e809c-612f-4b15-aae0-1df0acb801b9] +description = "Subtract minutes -> subtract more than an hour" + +[8b04bb6a-3d33-4e6c-8de9-f5de6d2c70d6] +description = "Subtract minutes -> subtract across midnight" + +[07c3bbf7-ce4d-4658-86e8-4a77b7a5ccd9] +description = "Subtract minutes -> subtract more than two hours" + +[90ac8a1b-761c-4342-9c9c-cdc3ed5db097] +description = "Subtract minutes -> subtract more than two hours with borrow" + +[2149f985-7136-44ad-9b29-ec023a97a2b7] +description = "Subtract minutes -> subtract more than one day (1500 min = 25 hrs)" + +[ba11dbf0-ac27-4acb-ada9-3b853ec08c97] +description = "Subtract minutes -> subtract more than two days" + +[f2fdad51-499f-4c9b-a791-b28c9282e311] +description = "Compare two clocks for equality -> clocks with same time" + +[5d409d4b-f862-4960-901e-ec430160b768] +description = "Compare two clocks for equality -> clocks a minute apart" + +[a6045fcf-2b52-4a47-8bb2-ef10a064cba5] +description = "Compare two clocks for equality -> clocks an hour apart" + +[66b12758-0be5-448b-a13c-6a44bce83527] +description = "Compare two clocks for equality -> clocks with hour overflow" + +[2b19960c-212e-4a71-9aac-c581592f8111] +description = "Compare two clocks for equality -> clocks with hour overflow by several days" + +[6f8c6541-afac-4a92-b0c2-b10d4e50269f] +description = "Compare two clocks for equality -> clocks with negative hour" + +[bb9d5a68-e324-4bf5-a75e-0e9b1f97a90d] +description = "Compare two clocks for equality -> clocks with negative hour that wraps" + +[56c0326d-565b-4d19-a26f-63b3205778b7] +description = "Compare two clocks for equality -> clocks with negative hour that wraps multiple times" + +[c90b9de8-ddff-4ffe-9858-da44a40fdbc2] +description = "Compare two clocks for equality -> clocks with minute overflow" + +[533a3dc5-59a7-491b-b728-a7a34fe325de] +description = "Compare two clocks for equality -> clocks with minute overflow by several days" + +[fff49e15-f7b7-4692-a204-0f6052d62636] +description = "Compare two clocks for equality -> clocks with negative minute" + +[605c65bb-21bd-43eb-8f04-878edf508366] +description = "Compare two clocks for equality -> clocks with negative minute that wraps" + +[b87e64ed-212a-4335-91fd-56da8421d077] +description = "Compare two clocks for equality -> clocks with negative minute that wraps multiple times" + +[822fbf26-1f3b-4b13-b9bf-c914816b53dd] +description = "Compare two clocks for equality -> clocks with negative hours and minutes" + +[e787bccd-cf58-4a1d-841c-ff80eaaccfaa] +description = "Compare two clocks for equality -> clocks with negative hours and minutes that wrap" + +[96969ca8-875a-48a1-86ae-257a528c44f5] +description = "Compare two clocks for equality -> full clock and zeroed clock" diff --git a/exercises/practice/clock/clock.ua b/exercises/practice/clock/clock.ua new file mode 100644 index 0000000..7bd4101 --- /dev/null +++ b/exercises/practice/clock/clock.ua @@ -0,0 +1,17 @@ +┌─╴Clock + # Create a new clock + # Clock ? Hours Minutes + New ← |2 ⊙⋅(⍤ "Please implement New" 0) + + # Add minutes to a clock + # Clock ? Clock Minutes + Add ← |2 ⊙⋅(⍤ "Please implement Add" 0) + + # Subtract minutes to a clock + # Clock ? Clock Minutes + Sub ← |2 ⊙⋅(⍤ "Please implement Sub" 0) + + # Return a clock's time formatted as a string + # String ? Clock + Display ← |1 ⊙(⍤ "Please implement Display" 0) +└─╴ diff --git a/exercises/practice/clock/tests.ua b/exercises/practice/clock/tests.ua new file mode 100644 index 0000000..253df3e --- /dev/null +++ b/exercises/practice/clock/tests.ua @@ -0,0 +1,225 @@ +~ "clock.ua" ~ Clock + +# On the hour +Clock₁ ← Clock~New 8 0 +⍤⤙≍ "08:00" Clock~Display Clock₁ + +# Past the hour +Clock₁ ← Clock~New 11 9 +⍤⤙≍ "11:09" Clock~Display Clock₁ + +# Midnight is zero hours +Clock₁ ← Clock~New 24 0 +⍤⤙≍ "00:00" Clock~Display Clock₁ + +# Hour rolls over +Clock₁ ← Clock~New 25 0 +⍤⤙≍ "01:00" Clock~Display Clock₁ + +# Hour rolls over continuously +Clock₁ ← Clock~New 100 0 +⍤⤙≍ "04:00" Clock~Display Clock₁ + +# Sixty minutes is next hour +Clock₁ ← Clock~New 1 60 +⍤⤙≍ "02:00" Clock~Display Clock₁ + +# Minutes roll over +Clock₁ ← Clock~New 0 160 +⍤⤙≍ "02:40" Clock~Display Clock₁ + +# Minutes roll over continuously +Clock₁ ← Clock~New 0 1723 +⍤⤙≍ "04:43" Clock~Display Clock₁ + +# Hour and minutes roll over +Clock₁ ← Clock~New 25 160 +⍤⤙≍ "03:40" Clock~Display Clock₁ + +# Hour and minutes roll over continuously +Clock₁ ← Clock~New 201 3001 +⍤⤙≍ "11:01" Clock~Display Clock₁ + +# Hour and minutes roll over to exactly midnight +Clock₁ ← Clock~New 72 8640 +⍤⤙≍ "00:00" Clock~Display Clock₁ + +# Negative hour +Clock₁ ← Clock~New ¯1 15 +⍤⤙≍ "23:15" Clock~Display Clock₁ + +# Negative hour rolls over +Clock₁ ← Clock~New ¯25 0 +⍤⤙≍ "23:00" Clock~Display Clock₁ + +# Negative hour rolls over continuously +Clock₁ ← Clock~New ¯91 0 +⍤⤙≍ "05:00" Clock~Display Clock₁ + +# Negative minutes +Clock₁ ← Clock~New 1 ¯40 +⍤⤙≍ "00:20" Clock~Display Clock₁ + +# Negative minutes roll over +Clock₁ ← Clock~New 1 ¯160 +⍤⤙≍ "22:20" Clock~Display Clock₁ + +# Negative minutes roll over continuously +Clock₁ ← Clock~New 1 ¯4820 +⍤⤙≍ "16:40" Clock~Display Clock₁ + +# Negative sixty minutes is previous hour +Clock₁ ← Clock~New 2 ¯60 +⍤⤙≍ "01:00" Clock~Display Clock₁ + +# Negative hour and minutes both roll over +Clock₁ ← Clock~New ¯25 ¯160 +⍤⤙≍ "20:20" Clock~Display Clock₁ + +# Negative hour and minutes both roll over continuously +Clock₁ ← Clock~New ¯121 ¯5810 +⍤⤙≍ "22:10" Clock~Display Clock₁ + +# Add minutes +Clock₁ ← Clock~New 10 0 +⍤⤙≍ "10:03" Clock~Display Clock~Add 3 Clock₁ + +# Add no minutes +Clock₁ ← Clock~New 6 41 +⍤⤙≍ "06:41" Clock~Display Clock~Add 0 Clock₁ + +# Add to next hour +Clock₁ ← Clock~New 0 45 +⍤⤙≍ "01:25" Clock~Display Clock~Add 40 Clock₁ + +# Add more than one hour +Clock₁ ← Clock~New 10 0 +⍤⤙≍ "11:01" Clock~Display Clock~Add 61 Clock₁ + +# Add more than two hours with carry +Clock₁ ← Clock~New 0 45 +⍤⤙≍ "03:25" Clock~Display Clock~Add 160 Clock₁ + +# Add across midnight +Clock₁ ← Clock~New 23 59 +⍤⤙≍ "00:01" Clock~Display Clock~Add 2 Clock₁ + +# Add more than one day (1500 min = 25 hrs) +Clock₁ ← Clock~New 5 32 +⍤⤙≍ "06:32" Clock~Display Clock~Add 1500 Clock₁ + +# Add more than two days +Clock₁ ← Clock~New 1 1 +⍤⤙≍ "11:21" Clock~Display Clock~Add 3500 Clock₁ + +# Subtract minutes +Clock₁ ← Clock~New 10 3 +⍤⤙≍ "10:00" Clock~Display Clock~Sub 3 Clock₁ + +# Subtract to previous hour +Clock₁ ← Clock~New 10 3 +⍤⤙≍ "09:33" Clock~Display Clock~Sub 30 Clock₁ + +# Subtract more than an hour +Clock₁ ← Clock~New 10 3 +⍤⤙≍ "08:53" Clock~Display Clock~Sub 70 Clock₁ + +# Subtract across midnight +Clock₁ ← Clock~New 0 3 +⍤⤙≍ "23:59" Clock~Display Clock~Sub 4 Clock₁ + +# Subtract more than two hours +Clock₁ ← Clock~New 0 0 +⍤⤙≍ "21:20" Clock~Display Clock~Sub 160 Clock₁ + +# Subtract more than two hours with borrow +Clock₁ ← Clock~New 6 15 +⍤⤙≍ "03:35" Clock~Display Clock~Sub 160 Clock₁ + +# Subtract more than one day (1500 min = 25 hrs) +Clock₁ ← Clock~New 5 32 +⍤⤙≍ "04:32" Clock~Display Clock~Sub 1500 Clock₁ + +# Subtract more than two days +Clock₁ ← Clock~New 2 20 +⍤⤙≍ "00:20" Clock~Display Clock~Sub 3000 Clock₁ + +# Clocks with same time +Clock₁ ← Clock~New 15 37 +Clock₂ ← Clock~New 15 37 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks a minute apart +Clock₁ ← Clock~New 15 36 +Clock₂ ← Clock~New 15 37 +⍤⤙≍ 0 = Clock₁ Clock₂ + +# Clocks an hour apart +Clock₁ ← Clock~New 14 37 +Clock₂ ← Clock~New 15 37 +⍤⤙≍ 0 = Clock₁ Clock₂ + +# Clocks with hour overflow +Clock₁ ← Clock~New 10 37 +Clock₂ ← Clock~New 34 37 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with hour overflow by several days +Clock₁ ← Clock~New 3 11 +Clock₂ ← Clock~New 99 11 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative hour +Clock₁ ← Clock~New 22 40 +Clock₂ ← Clock~New ¯2 40 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative hour that wraps +Clock₁ ← Clock~New 17 3 +Clock₂ ← Clock~New ¯31 3 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative hour that wraps multiple times +Clock₁ ← Clock~New 13 49 +Clock₂ ← Clock~New ¯83 49 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with minute overflow +Clock₁ ← Clock~New 0 1 +Clock₂ ← Clock~New 0 1441 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with minute overflow by several days +Clock₁ ← Clock~New 2 2 +Clock₂ ← Clock~New 2 4322 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative minute +Clock₁ ← Clock~New 2 40 +Clock₂ ← Clock~New 3 ¯20 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative minute that wraps +Clock₁ ← Clock~New 4 10 +Clock₂ ← Clock~New 5 ¯1490 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative minute that wraps multiple times +Clock₁ ← Clock~New 6 15 +Clock₂ ← Clock~New 6 ¯4305 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative hours and minutes +Clock₁ ← Clock~New 7 32 +Clock₂ ← Clock~New ¯12 ¯268 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Clocks with negative hours and minutes that wrap +Clock₁ ← Clock~New 18 7 +Clock₂ ← Clock~New ¯54 ¯11513 +⍤⤙≍ 1 = Clock₁ Clock₂ + +# Full clock and zeroed Clock₁ +Clock₁ ← Clock~New 24 0 +Clock₂ ← Clock~New 0 0 +⍤⤙≍ 1 = Clock₁ Clock₂