From ebd2701a3f2d170dc9658cf80b7a9c9e5df5f4e9 Mon Sep 17 00:00:00 2001 From: justani98 Date: Mon, 3 Jul 2017 10:41:25 +0530 Subject: [PATCH 1/6] Implement exercise change From 3a9688a89afc152816374bbdb1d73b3c79825a01 Mon Sep 17 00:00:00 2001 From: justani98 Date: Mon, 3 Jul 2017 15:32:48 +0530 Subject: [PATCH 2/6] Add new entry in config.json file for the exercise change --- config.json | 9 +++++++++ 1 file changed, 9 insertions(+) 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": [ From 48217ce45b4855ea833f57ea1802243fe7a9c3fc Mon Sep 17 00:00:00 2001 From: justani98 Date: Mon, 3 Jul 2017 16:11:47 +0530 Subject: [PATCH 3/6] Add change.py --- exercises/change/change.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 exercises/change/change.py 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 From cb30deb662a0ca34f459a6ac63fdddfec762f4f6 Mon Sep 17 00:00:00 2001 From: justani98 Date: Mon, 3 Jul 2017 16:12:20 +0530 Subject: [PATCH 4/6] Add example.py --- exercises/change/example.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 exercises/change/example.py diff --git a/exercises/change/example.py b/exercises/change/example.py new file mode 100644 index 00000000000..bbe5c92957a --- /dev/null +++ b/exercises/change/example.py @@ -0,0 +1,23 @@ +def find_minimum_coins(total_change, coins): + 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 From bf89ae4cd3a6edd89d570bdc5f2f0d01fc9a5620 Mon Sep 17 00:00:00 2001 From: justani98 Date: Mon, 3 Jul 2017 16:49:37 +0530 Subject: [PATCH 5/6] Modify example.py for a test case --- exercises/change/example.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exercises/change/example.py b/exercises/change/example.py index bbe5c92957a..895145fe575 100644 --- a/exercises/change/example.py +++ b/exercises/change/example.py @@ -1,4 +1,6 @@ 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 From 35ec8892cba71f4b987d9c0d8094fc40d850376a Mon Sep 17 00:00:00 2001 From: justani98 Date: Mon, 3 Jul 2017 16:50:16 +0530 Subject: [PATCH 6/6] Add test file --- exercises/change/change_test.py | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 exercises/change/change_test.py 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()