-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathcoinsum.raku
More file actions
executable file
·31 lines (27 loc) · 920 Bytes
/
Copy pathcoinsum.raku
File metadata and controls
executable file
·31 lines (27 loc) · 920 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env raku
sub gen_coin_sum(Int $sum, @coins) {
my @stack = @coins.map(-> $k { %( sum => $k, coins => %($k, 1), _last => $k ) });
while @stack.elems > 0 {
my %x = @stack.pop();
if %x<sum> == $sum {
# Found!
say "$sum = " ~ (%x<coins>.sort({ .key.Int }).reverse.map(-> $p { $p.key ~ "×" ~ $p.value })).join(" + ");
}
elsif %x<sum> < $sum {
for @coins -> $k {
my $s = %x<sum> + $k;
if $s <= $sum {
my %coins = %x<coins>;
if %x<_last> >= $k {
%coins{$k} += 1;
@stack.push(%( sum => $s, coins => %coins, _last => $k ));
}
}
}
}
}
}
sub MAIN (Int $sum, Str $coins) {
my @coins = $coins.split(",").map({ .Int }).sort;
gen_coin_sum($sum, @coins);
}