diff options
| author | CY Fung <fungcheokyin@gmail.com> | 2022-11-27 00:12:30 +0800 |
|---|---|---|
| committer | CY Fung <fungcheokyin@gmail.com> | 2022-11-27 00:12:30 +0800 |
| commit | 7554512a5def78d9b0a73e8a1b66ef72c4aa174a (patch) | |
| tree | 05b523eebe431ac1c455ce64e84b8c5c80b32ed1 | |
| parent | 5230c50b80e1f16aca712343f5a743d693d7b651 (diff) | |
| download | perlweeklychallenge-club-7554512a5def78d9b0a73e8a1b66ef72c4aa174a.tar.gz perlweeklychallenge-club-7554512a5def78d9b0a73e8a1b66ef72c4aa174a.tar.bz2 perlweeklychallenge-club-7554512a5def78d9b0a73e8a1b66ef72c4aa174a.zip | |
Week 192
| -rw-r--r-- | challenge-192/cheok-yin-fung/perl/ch-1.pl | 17 | ||||
| -rw-r--r-- | challenge-192/cheok-yin-fung/perl/ch-2.pl | 54 |
2 files changed, 71 insertions, 0 deletions
diff --git a/challenge-192/cheok-yin-fung/perl/ch-1.pl b/challenge-192/cheok-yin-fung/perl/ch-1.pl new file mode 100644 index 0000000000..f9eaacd316 --- /dev/null +++ b/challenge-192/cheok-yin-fung/perl/ch-1.pl @@ -0,0 +1,17 @@ +# The Weekly Challenge 192 +# Task 1 Binary Flip +use v5.30.0; + +say bf($ARGV[0]) if defined($ARGV[0]); + +sub bf { + my $a = sprintf("%b", $_[0]); + $a =~ tr/01/10/; + $a =~ s/^[0]*//; + return oct("0b$a"); +} + +use Test::More tests=>3; +ok bf(5) == 2; +ok bf(4) == 3; +ok bf(6) == 1; diff --git a/challenge-192/cheok-yin-fung/perl/ch-2.pl b/challenge-192/cheok-yin-fung/perl/ch-2.pl new file mode 100644 index 0000000000..d7bb87efc3 --- /dev/null +++ b/challenge-192/cheok-yin-fung/perl/ch-2.pl @@ -0,0 +1,54 @@ +# The Weekly Challenge 192 +# Task 2 Equal Distribution + +use v5.30.0; +use List::Util qw/sum/; + +say eq_dist(@ARGV) if defined($ARGV[0]); + +sub eq_dist { + my @list = @_; + my $n = scalar @list; + my $avg = (sum @list)/$n; + return -1 if $avg =~ /\./; + say "start: ", join ", ", @list; + my $move = 0; + for my $i (0..$n-1) { + while ($list[$i] < $avg) { + my $j = $i; + while ($list[$j]-sum(@list[$i..$j-1]) < $avg + && $list[$j] <= $avg) + { + $j++; + } + if ($j>$i) { + for (1..$list[$j]-$avg) { + $list[$j-1]++; + $list[$j]--; + say join ", ", @list; + $move++; + last if sum(@list[$i..$j-1]) == $avg*($j-$i); + } + } + } + if ($list[$i] > $avg) { + for (1..$list[$i]-$avg) { + $list[$i+1]++; + $list[$i]--; + say join ", ", @list; + $move++; + } + } + } + return $move; +} + + +use Test::More tests=>6; +ok eq_dist(1, 0, 5) == 4; +ok eq_dist(0, 2, 0) == -1; +ok eq_dist(0, 3, 0) == 2; + +ok eq_dist(3, 3, 3, 3) == 0; +ok eq_dist(5, 0, 1) == 4; +ok eq_dist(5, 6, 0, 1) == 9; |
