Coins Sum: The Raku Challenge Week 75, task 1

Here is my solution to the Task 1 of the Week 75 of the Weekly Challenge solved in the Raku programming language.

You are given a set of coins @C, assuming you have infinite amount of each coin in the set. Write a script to find how many ways you make sum $S using the coins from the set @C.

Hello, here is my solution to the Task 1 of the Week 75 of the Weekly Challenge solved in the Raku programming language.

Coins Sum

You are given a set of coins @C, assuming you have infinite amount of each coin in the set.

Write a script to find how many ways you make sum $S using the coins from the set @C.

My solution is a kind of a two-liner:

my @coins = 1, 2, 4;
my $sum = 6;

my @wallet;
@wallet.append: $_ xx ($sum div $_) for @coins;

.say for @wallet.combinations.unique(:as(*.Str)).grep({$sum == [+] $_});

The @coins array keeps the types of available coins. Then, we fill the @wallet so that we have enough real coins to make the $sum by using only a single kind of them (if that is possible at all).

For the given example, the @wallet contains the following collection:

[1 1 1 1 1 1 2 2 2 4]

The next step is to find all possible unique combinations of the coins from the wallet and take only those, whose sum is $sum.

To take only unique combinations, I am calling .unique(:as(*.Str)) which treats them as a string. This step can possibly be made more optimal.

To filter the combinations, a grep method is used, where the reduction operator is used to compute the sum: .grep({$sum == [+] $_}).

With the above input, the program prints the following combinations of coins that give the required amount:

(2 4)
(1 1 4)
(2 2 2)
(1 1 2 2)
(1 1 1 1 2)
(1 1 1 1 1 1)

* * *

GitHub repository
Navigation to the Raku challenges post series

Leave a Reply

Your email address will not be published. Required fields are marked *

Retype the CAPTCHA code from the image
Change the CAPTCHA codeSpeak the CAPTCHA code