aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Lynn <bizlsg@localhost.localdomain>2022-11-25 07:35:29 +0800
committerStephen Lynn <bizlsg@localhost.localdomain>2022-11-25 07:35:29 +0800
commitcdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307 (patch)
tree4a76246afae08f836fa35cfc874c60c9fa0815cf
parent58930a18870dae3dab9305594f3b387cc19e0cde (diff)
downloadperlweeklychallenge-club-cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307.tar.gz
perlweeklychallenge-club-cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307.tar.bz2
perlweeklychallenge-club-cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307.zip
pwc 192
-rw-r--r--challenge-192/steve-g-lynn/blog.txt1
-rwxr-xr-xchallenge-192/steve-g-lynn/perl/ch-1.pl12
-rwxr-xr-xchallenge-192/steve-g-lynn/perl/ch-2.pl92
-rwxr-xr-xchallenge-192/steve-g-lynn/raku/ch-1.p611
-rwxr-xr-xchallenge-192/steve-g-lynn/raku/ch-2.p694
5 files changed, 210 insertions, 0 deletions
diff --git a/challenge-192/steve-g-lynn/blog.txt b/challenge-192/steve-g-lynn/blog.txt
new file mode 100644
index 0000000000..c02a87f0c8
--- /dev/null
+++ b/challenge-192/steve-g-lynn/blog.txt
@@ -0,0 +1 @@
+https://thiujiac.blogspot.com/2022/11/pwc-192.html
diff --git a/challenge-192/steve-g-lynn/perl/ch-1.pl b/challenge-192/steve-g-lynn/perl/ch-1.pl
new file mode 100755
index 0000000000..63aab12c75
--- /dev/null
+++ b/challenge-192/steve-g-lynn/perl/ch-1.pl
@@ -0,0 +1,12 @@
+#!/usr/bin/env perl
+
+print &binary_flip(5),"\n"; #2
+print &binary_flip(4),"\n"; #3
+print &binary_flip(6),"\n"; #1
+
+sub binary_flip {
+ my $b=sprintf("%b",shift);
+ $b =~ tr/[10]/[01]/;
+ eval('0b' . $b);
+}
+
diff --git a/challenge-192/steve-g-lynn/perl/ch-2.pl b/challenge-192/steve-g-lynn/perl/ch-2.pl
new file mode 100755
index 0000000000..1ec5fe44cf
--- /dev/null
+++ b/challenge-192/steve-g-lynn/perl/ch-2.pl
@@ -0,0 +1,92 @@
+#!/usr/bin/env perl
+
+{
+use List::Util qw(sum max min);
+
+local *equal_distribution=sub {
+
+ #-- nested sub-subroutines
+ local *minindx = sub {
+ local (@list)=@_;
+ (grep {$list[$_] == (min @list)} (0 .. @list));
+ };
+
+ local *maxindx = sub {
+ local (@list)=@_;
+ (grep {$list[$_] == (max @list)} (0 .. @list));
+ };
+
+ local *distance = sub {
+ local (@list)=@_;
+ min (
+ abs((max &maxindx(@list))-(min &minindx(@list))),
+ abs((min &maxindx(@list))-(max &minindx(@list)))
+ );
+ };
+
+ local *closest_pair = sub {
+ local (@list)=@_;
+ local (@retval);
+
+ local (@minindx)=&minindx(@list);
+ local (@maxindx)=&maxindx(@list);
+
+
+ local ($min_min,$max_min,$min_max,$max_max)=(
+ (min @minindx),
+ (max @minindx),
+ (min @maxindx),
+ (max @maxindx),
+ );
+
+ local ($ctr,$min,$max)=(0,0,0); #-- counters
+ local $last_ctr=@list;
+
+ for $min ($min_min, $max_min) {
+ for $max ($min_max, $max_max) {
+ $ctr=abs($min-$max);
+ if ($ctr < $last_ctr) {
+ @retval=($min,$max);
+ $last_ctr=$ctr;
+ }
+ }
+ }
+ return @retval;
+ };
+
+ local *is_equal = sub {
+ local (@list)=@_;
+ (sum map {$_==$tgt} @list)==@list;
+ };
+
+ local *iterate = sub {
+ local (@closest_pair)=&closest_pair(@list);
+
+ $count += &distance(@list);
+ ($list[$closest_pair[0]]) += 1;
+ ($list[$closest_pair[1]]) -= 1;
+ };
+
+
+ #-- the root subroutine starts here
+ #-- dynamic scope (local keyword) is convenient
+
+ local (@list) = @_;
+ ((sum @list) % @list) && (return -1);
+
+ local $tgt = (sum @list)/@list;
+ local $count = 0;
+
+ while (1) {
+ &is_equal(@list) && return $count;
+ &iterate;
+ }
+};
+
+print &equal_distribution(1,0,5),"\n"; #4
+print &equal_distribution(0,2,0),"\n"; #-1
+print &equal_distribution(0,3,0),"\n"; #2
+
+
+}
+
diff --git a/challenge-192/steve-g-lynn/raku/ch-1.p6 b/challenge-192/steve-g-lynn/raku/ch-1.p6
new file mode 100755
index 0000000000..185bdcdaf0
--- /dev/null
+++ b/challenge-192/steve-g-lynn/raku/ch-1.p6
@@ -0,0 +1,11 @@
+#!/usr/bin/env perl6
+
+say &binary-flip(5); #2
+say &binary-flip(4); #3
+say &binary-flip(6); #1
+
+sub binary-flip (Int $n) {
+ my $b=sprintf("%b",$n);
+ $b ~~ tr/<[1 0]>/<[0 1]>/;
+ +('0b' ~ $b);
+}
diff --git a/challenge-192/steve-g-lynn/raku/ch-2.p6 b/challenge-192/steve-g-lynn/raku/ch-2.p6
new file mode 100755
index 0000000000..4af1802400
--- /dev/null
+++ b/challenge-192/steve-g-lynn/raku/ch-2.p6
@@ -0,0 +1,94 @@
+#!/usr/bin/env perl6
+
+
+say &equal-distribution((1,0,5)); #4
+say &equal-distribution((0,2,0)); #-1
+say &equal-distribution((0,3,0)); #2
+
+#-- helper subs
+
+sub minindx (@list) {
+ (0 .. @list.elems-1).grep( {@list[$_] == (@list.min)} );
+}
+
+sub maxindx (@list) {
+ (0 .. @list.elems-1).grep( {@list[$_] == (@list.max)} );
+}
+
+sub distance (@list) {
+ min (
+ abs(&maxindx(@list).max - &minindx(@list).min),
+ abs(&maxindx(@list).min - &minindx(@list).max)
+ );
+}
+
+sub closest_pair (@list) {
+ my (@retval);
+
+ my @minindx=&minindx(@list);
+ my @maxindx=&maxindx(@list);
+
+ my ($min_min,$max_min,$min_max,$max_max)=(
+ @minindx.min,
+ @minindx.max,
+ @maxindx.min,
+ @maxindx.max,
+ );
+
+ my $ctr=0; #-- counter
+ my $last_ctr=@list;
+
+ for ($min_min, $max_min) -> $min {
+ for ($min_max, $max_max) -> $max {
+ $ctr=abs($min-$max);
+ if ($ctr < $last_ctr) {
+ @retval=($min,$max);
+ $last_ctr=$ctr;
+ }
+ }
+ }
+ return @retval;
+}
+
+sub is_equal( @list, $tgt ) {
+ @list.map({$_==$tgt}).sum==@list;
+}
+
+sub iterate( @list ) {
+
+ my $distance=&distance(@list);
+
+ my ($minindx,$maxindx)=&closest_pair(@list);
+
+ return ($distance, $minindx, $maxindx)
+}
+
+#-- root sub
+
+sub equal-distribution(@list_) {
+ my @list;
+
+ for (@list_) {
+ push(@list,$_);
+ }
+
+
+ (@list_.sum !%% @list_.elems) && (return -1);
+
+ my $tgt = @list_.sum div @list_.elems;
+ my $count = 0;
+
+ while (1) {
+
+ (&is_equal(@list, $tgt)) && (return $count);
+
+ my ($distance, $minindx, $maxindx) = &iterate(@list);
+
+ $count += $distance;
+
+ @list[$minindx] += 1;
+ @list[$maxindx] -= 1;
+
+ }
+}
+