diff options
| author | Stephen Lynn <bizlsg@localhost.localdomain> | 2022-11-25 07:35:29 +0800 |
|---|---|---|
| committer | Stephen Lynn <bizlsg@localhost.localdomain> | 2022-11-25 07:35:29 +0800 |
| commit | cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307 (patch) | |
| tree | 4a76246afae08f836fa35cfc874c60c9fa0815cf | |
| parent | 58930a18870dae3dab9305594f3b387cc19e0cde (diff) | |
| download | perlweeklychallenge-club-cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307.tar.gz perlweeklychallenge-club-cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307.tar.bz2 perlweeklychallenge-club-cdf78f9d07f8ca28b2a7cb50b1dda94d3beb3307.zip | |
pwc 192
| -rw-r--r-- | challenge-192/steve-g-lynn/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-192/steve-g-lynn/perl/ch-1.pl | 12 | ||||
| -rwxr-xr-x | challenge-192/steve-g-lynn/perl/ch-2.pl | 92 | ||||
| -rwxr-xr-x | challenge-192/steve-g-lynn/raku/ch-1.p6 | 11 | ||||
| -rwxr-xr-x | challenge-192/steve-g-lynn/raku/ch-2.p6 | 94 |
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; + + } +} + |
