aboutsummaryrefslogtreecommitdiff
path: root/challenge-285/atschneid/perl/ch-2.pl
blob: b88384b28d5f065e6d49b92d3552abf0eda7ded9 (plain)
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
32
33
34
35
36
37
38
39
40
use warnings;
use strict;

use v5.38;

sub make_change_v1( $amount ) {
    my @dynamic_arr = (1) x ( $amount + 1 );
    my @coins = (5, 10, 25, 50);
    for my $coin_amount (@coins) {
	for my $idx ($coin_amount..$amount) {
	    $dynamic_arr[ $idx ] += $dynamic_arr[ $idx - $coin_amount ];	    
	}
    }
    return $dynamic_arr[ -1 ];
}

sub make_change_v2( $amount ) {
    # uses the fact that all coins not pennies are divisible by 5 to be 5 x more efficient
    $amount = int( $amount / 5 );
    return 1 if $amount == 0;
    
    my @dynamic_arr = (1) x ( $amount + 1 );
    my @coins = (1, 2, 5, 10);
    for my $coin_amount (@coins) {
	for my $idx ($coin_amount..$amount) {
	    $dynamic_arr[ $idx ] += $dynamic_arr[ $idx - $coin_amount ];	    
	}
    }
    return $dynamic_arr[ -1 ];
}

my @inputs = (
    9, 15, 100
    );
for my $input (@inputs) {
    say $input . ' => ' . make_change_v1( $input );
}
for my $input (@inputs) {
    say $input . ' => ' . make_change_v2( $input );
}