From 7554512a5def78d9b0a73e8a1b66ef72c4aa174a Mon Sep 17 00:00:00 2001 From: CY Fung Date: Sun, 27 Nov 2022 00:12:30 +0800 Subject: Week 192 --- challenge-192/cheok-yin-fung/perl/ch-1.pl | 17 ++++++++++ challenge-192/cheok-yin-fung/perl/ch-2.pl | 54 +++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 challenge-192/cheok-yin-fung/perl/ch-1.pl create mode 100644 challenge-192/cheok-yin-fung/perl/ch-2.pl 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; -- cgit