Skip to content

Commit

Permalink
Add change exercise (#136)
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikSchierboom authored Dec 31, 2024
1 parent a4236e3 commit b5d5b5a
Show file tree
Hide file tree
Showing 8 changed files with 197 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,14 @@
"prerequisites": [],
"difficulty": 8
},
{
"slug": "change",
"name": "Change",
"uuid": "58e7ebd6-e458-4715-bd05-ba6a35ba0573",
"practices": [],
"prerequisites": [],
"difficulty": 8
},
{
"slug": "run-length-encoding",
"name": "Run-Length Encoding",
Expand Down
8 changes: 8 additions & 0 deletions exercises/practice/change/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Instructions

Determine the fewest number of coins to give a customer so that the sum of their values equals the correct amount of change.

## Examples

- An amount of 15 with available coin values [1, 5, 10, 25, 100] should return one coin of value 5 and one coin of value 10, or [5, 10].
- An amount of 40 with available coin values [1, 5, 10, 25, 100] should return one coin of value 5, one coin of value 10, and one coin of value 25, or [5, 10, 25].
26 changes: 26 additions & 0 deletions exercises/practice/change/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Introduction

In the mystical village of Coinholt, you stand behind the counter of your bakery, arranging a fresh batch of pastries.
The door creaks open, and in walks Denara, a skilled merchant with a keen eye for quality goods.
After a quick meal, she slides a shimmering coin across the counter, representing a value of 100 units.

You smile, taking the coin, and glance at the total cost of the meal: 88 units.
That means you need to return 12 units in change.

Denara holds out her hand expectantly.
"Just give me the fewest coins," she says with a smile.
"My pouch is already full, and I don't want to risk losing them on the road."

You know you have a few options.
"We have Lumis (worth 10 units), Viras (worth 5 units), and Zenth (worth 2 units) available for change."

You quickly calculate the possibilities in your head:

- one Lumis (1 × 10 units) + one Zenth (1 × 2 units) = 2 coins total
- two Viras (2 × 5 units) + one Zenth (1 × 2 units) = 3 coins total
- six Zenth (6 × 2 units) = 6 coins total

"The best choice is two coins: one Lumis and one Zenth," you say, handing her the change.

Denara smiles, clearly impressed.
"As always, you've got it right."
19 changes: 19 additions & 0 deletions exercises/practice/change/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"erikschierboom"
],
"files": {
"solution": [
"change.ua"
],
"test": [
"tests.ua"
],
"example": [
".meta/example.ua"
]
},
"blurb": "Correctly determine change to be given using the least number of coins.",
"source": "Software Craftsmanship - Coin Change Kata",
"source_url": "https://web.archive.org/web/20130115115225/http://craftsmanship.sv.cmu.edu:80/exercises/coin-change-kata"
}
14 changes: 14 additions & 0 deletions exercises/practice/change/.meta/example.ua
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
ShouldUpdate ← ⨬(>+1∩(⨬(⧻|∘)≍∞.)|0) ≍∞.
Update ← ⍜(⊡|□◌) ⊃(⋅⋅∘|⋅⋅⋅⋅∘|⊂⊙⋅⋅∘)
Process ← (
⊙⊙◌◡⊃(°□⊡⊙⋅⋅|°□⊡⋅⊙⋅)◡(⌵-)°⊟
◡ShouldUpdate
⨬(⋅⋅⋅⋅∘|Update)
)
Amounts ← ⍜(⊢|□[]◌) ↯[+1]:∞
Combinations ← ▽⊸≡(≤°⊟)/⊂⊞⊂ ⊃(+1⇡◌|∘|⋅Amounts)
Coins ← (
◇⍆⊣ ∧Process Combinations
⨬(∘|⍤"can't make target with given coins")=∞.
)
Change ← ⨬(⍤"target can't be negative"|[]|Coins)+1±,
49 changes: 49 additions & 0 deletions exercises/practice/change/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# 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.

[d0ebd0e1-9d27-4609-a654-df5c0ba1d83a]
description = "change for 1 cent"

[36887bea-7f92-4a9c-b0cc-c0e886b3ecc8]
description = "single coin change"

[cef21ccc-0811-4e6e-af44-f011e7eab6c6]
description = "multiple coin change"

[d60952bc-0c1a-4571-bf0c-41be72690cb3]
description = "change with Lilliputian Coins"

[408390b9-fafa-4bb9-b608-ffe6036edb6c]
description = "change with Lower Elbonia Coins"

[7421a4cb-1c48-4bf9-99c7-7f049689132f]
description = "large target values"

[f79d2e9b-0ae3-4d6a-bb58-dc978b0dba28]
description = "possible change without unit coins available"

[9a166411-d35d-4f7f-a007-6724ac266178]
description = "another possible change without unit coins available"

[ce0f80d5-51c3-469d-818c-3e69dbd25f75]
description = "a greedy approach is not optimal"

[bbbcc154-e9e9-4209-a4db-dd6d81ec26bb]
description = "no coins make 0 change"

[c8b81d5a-49bd-4b61-af73-8ee5383a2ce1]
description = "error testing for change smaller than the smallest of coins"

[3c43e3e4-63f9-46ac-9476-a67516e98f68]
description = "error if no combination can add up to target"

[8fe1f076-9b2d-4f44-89fe-8a6ccd63c8f3]
description = "cannot find negative change values"
3 changes: 3 additions & 0 deletions exercises/practice/change/change.ua
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Determine the fewest number of coins for a given target value
# Change ? Coins Target
Change ← |2 ⊙⋅(⍤ "Please implement Change" 0)
70 changes: 70 additions & 0 deletions exercises/practice/change/tests.ua
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
~ "change.ua" ~ Change

# Change for 1 cent
Coins ← [1 5 10 25]
Target ← 1
Expected ← [1]
⍤⤙≍ Expected Change Coins Target

# Single coin change
Coins ← [1 5 10 25 100]
Target ← 25
Expected ← [25]
⍤⤙≍ Expected Change Coins Target

# Multiple coin change
Coins ← [1 5 10 25 100]
Target ← 15
Expected ← [5 10]
⍤⤙≍ Expected Change Coins Target

# Change with Lilliputian Coins
Coins ← [1 4 15 20 50]
Target ← 23
Expected ← [4 4 15]
⍤⤙≍ Expected Change Coins Target

# Change with Lower Elbonia Coins
Coins ← [1 5 10 21 25]
Target ← 63
Expected ← [21 21 21]
⍤⤙≍ Expected Change Coins Target

# Large target values
Coins ← [1 2 5 10 20 50 100]
Target ← 999
Expected ← [2 2 5 20 20 50 100 100 100 100 100 100 100 100 100]
⍤⤙≍ Expected Change Coins Target

# Possible change without unit coins available
Coins ← [2 5 10 20 50]
Target ← 21
Expected ← [2 2 2 5 10]
⍤⤙≍ Expected Change Coins Target

# Another possible change without unit coins available
Coins ← [4 5]
Target ← 27
Expected ← [4 4 4 5 5 5]
⍤⤙≍ Expected Change Coins Target

# No coins make 0 change
Coins ← [1 5 10 21 25]
Target ← 0
Expected ← []
⍤⤙≍ Expected Change Coins Target

# Error testing for change smaller than the smallest of coins
Coins ← [5 10]
Target ← 3
⍤⤙≍ "can't make target with given coins" ⍣(Change Coins Target)

# Error if no combination can add up to target
Coins ← [5 10]
Target ← 94
⍤⤙≍ "can't make target with given coins" ⍣(Change Coins Target)

# Cannot find negative change values
Coins ← [1 2 5]
Target ← ¯5
⍤⤙≍ "target can't be negative" ⍣(Change Coins Target)

0 comments on commit b5d5b5a

Please sign in to comment.