aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCY Fung <fungcheokyin@gmail.com>2022-11-27 00:12:30 +0800
committerCY Fung <fungcheokyin@gmail.com>2022-11-27 00:12:30 +0800
commit7554512a5def78d9b0a73e8a1b66ef72c4aa174a (patch)
tree05b523eebe431ac1c455ce64e84b8c5c80b32ed1
parent5230c50b80e1f16aca712343f5a743d693d7b651 (diff)
downloadperlweeklychallenge-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.pl17
-rw-r--r--challenge-192/cheok-yin-fung/perl/ch-2.pl54
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;