diff --git a/config.json b/config.json index fafc965c010..a8b1c57612b 100644 --- a/config.json +++ b/config.json @@ -565,6 +565,15 @@ "strings", "pattern matching" ] + }, + { + "slug": "change", + "difficulty": 4, + "topics": [ + "Control-flow (loops)", + "Arrays", + "Algorithms" + ] } ], "deprecated": [ diff --git a/exercises/change/change.py b/exercises/change/change.py new file mode 100644 index 00000000000..88b882e1632 --- /dev/null +++ b/exercises/change/change.py @@ -0,0 +1,2 @@ +def find_minimum_coins(total_change, coins): + pass diff --git a/exercises/change/change_test.py b/exercises/change/change_test.py new file mode 100644 index 00000000000..3f89363331c --- /dev/null +++ b/exercises/change/change_test.py @@ -0,0 +1,43 @@ +import unittest + +from change import find_minimum_coins + + +class ChangeTest(unittest.TestCase): + def test_single_coin_change(self): + self.assertEqual(find_minimum_coins(25, [1, 5, 10, 25, 100]), [25]) + + def test_multiple_coin_change(self): + self.assertEqual(find_minimum_coins(15, [1, 5, 10, 25, 100]), [5, 10]) + + def test_change_with_Lilliputian_Coins(self): + self.assertEqual(find_minimum_coins(23, [1, 4, 15, 20, 50]), + [4, 4, 15]) + + def test_change_with_Lower_Elbonia_Coins(self): + self.assertEqual(find_minimum_coins(63, [1, 5, 10, 21, 25]), + [21, 21, 21]) + + def test_large_target_values(self): + self.assertEqual(find_minimum_coins(21, [2, 5, 10, 20, 50]), + [2, 2, 2, 5, 10]) + + def test_possible_change_without_unit_coins_available(self): + self.assertEqual(find_minimum_coins(21, [2, 5, 10, 20, 50]), + [2, 2, 2, 5, 10]) + + def test_no_coins_make_0_change(self): + self.assertEqual(find_minimum_coins(0, [1, 5, 10, 21, 25]), []) + + def test_error_testing_for_change_smaller_than_smallest_coin(self): + self.assertEqual(find_minimum_coins(3, [5, 10]), -1) + + def test_error_if_no_combination_can_add_up_to_target(self): + self.assertEqual(find_minimum_coins(94, [5, 10]), -1) + + def test_cannot_find_negative_change_values(self): + self.assertEqual(find_minimum_coins(-5, [1, 2, 5]), -1) + + +if __name__ == "__main__": + unittest.main() diff --git a/exercises/change/example.py b/exercises/change/example.py new file mode 100644 index 00000000000..895145fe575 --- /dev/null +++ b/exercises/change/example.py @@ -0,0 +1,25 @@ +def find_minimum_coins(total_change, coins): + if total_change < 0: + return -1 + min_coins_required = [1e9] * (total_change + 1) + last_coin = [0]*(total_change + 1) + min_coins_required[0] = 0 + last_coin[0] = -1 + for change in range(1, total_change + 1): + final_result = min_coins_required[change] + for coin in coins: + if coin <= change: + result = min_coins_required[change - coin] + 1 + if result < final_result: + final_result = result + last_coin[change] = change - coin + min_coins_required[change] = final_result + if min_coins_required[total_change] == 1e9: + return -1 + else: + last_coin_value = total_change + array = [] + while(last_coin[last_coin_value] != -1): + array.append(last_coin_value-last_coin[last_coin_value]) + last_coin_value = last_coin[last_coin_value] + return array