diff options
| author | Jared Martin <jaredor+github@gmail.com> | 2020-05-15 12:23:44 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-15 12:23:44 -0500 |
| commit | 16b5c61e73278b37d483e0153ee9455d7c9b3be9 (patch) | |
| tree | ffa87d894d19cbe1cf09dc6cb1dfb41c2f00a0b2 /challenge-059 | |
| parent | 25203be9ff4441f1ecd8773cec5b7bbf67a2c3a7 (diff) | |
| parent | 4bd44dfd597811f71468831c7ee80a9101e7f30a (diff) | |
| download | perlweeklychallenge-club-16b5c61e73278b37d483e0153ee9455d7c9b3be9.tar.gz perlweeklychallenge-club-16b5c61e73278b37d483e0153ee9455d7c9b3be9.tar.bz2 perlweeklychallenge-club-16b5c61e73278b37d483e0153ee9455d7c9b3be9.zip | |
Merge pull request #13 from manwar/master
PWC 059
Diffstat (limited to 'challenge-059')
80 files changed, 2979 insertions, 141 deletions
diff --git a/challenge-059/adam-russell/blog.txt b/challenge-059/adam-russell/blog.txt new file mode 100644 index 0000000000..4f5e408d78 --- /dev/null +++ b/challenge-059/adam-russell/blog.txt @@ -0,0 +1 @@ +https://adamcrussell.livejournal.com/16202.html diff --git a/challenge-059/adam-russell/perl/LinkedList.pm b/challenge-059/adam-russell/perl/LinkedList.pm new file mode 100644 index 0000000000..a340f898e9 --- /dev/null +++ b/challenge-059/adam-russell/perl/LinkedList.pm @@ -0,0 +1,75 @@ +use strict; +use warnings; +package LinkedList{ + use boolean; + use Tie::RefHash; + use Class::Struct; + package Node{ + use Class::Struct; + + struct( + data => q/$/, + next => q/Node/ + ); + } + + struct( + head => q/Node/ + ); + + sub stringify{ + my($self) = @_; + my $s = ""; + my $next = $self->head()->next(); + while($next && $next->next()){ + $s .= " -> " if $s; + $s = $s . $next->data(); + $next = $next->next(); + } + $s = $s . " -> " . $next->data() if $next->data(); + $s .= "\n"; + return $s; + } + + sub insert{ + my($self, $data, $previous) = @_; + if(!$previous){ + $previous=new Node(data => undef, next => undef); + $self->head($previous); + } + my $next=new Node(data => $data, next => undef); + $previous->next($next); + return $next; + } + + sub partition{ + my($self, $k) = @_; + my $previous = $self->head(); + my $next = $self->head()->next(); + tie my %node_value, "Tie::RefHash"; + while($next){ + if($next->data() < $k){ + $node_value{$next} = $next->data(); + if($next->next()){ + $previous->next($next->next()); + } + else{ + $previous->next(new Node()); + $next = undef; + next; + } + } + $previous = $next; + $next = $next->next(); + } + my @sorted_nodes = sort {$node_value{$b} <=> $node_value{$a}} keys %node_value; + $previous = $self->head(); + my $old_first = $previous->next(); + while(@sorted_nodes){ + my $node = pop @sorted_nodes; + $previous = insert($self,$node->data(), $previous); + } + $previous->next($old_first); + } + true; +} diff --git a/challenge-059/adam-russell/perl/ch-1.pl b/challenge-059/adam-russell/perl/ch-1.pl new file mode 100644 index 0000000000..960302b6a3 --- /dev/null +++ b/challenge-059/adam-russell/perl/ch-1.pl @@ -0,0 +1,22 @@ +use strict; +use warnings; +## +# Write a script to partition a linked list such that +# all nodes less than k come before nodes greater than or equal to k. +## +use LinkedList; + +MAIN:{ + my $ll = new LinkedList(); + my $next = $ll->insert(1, undef); + $next = $ll->insert(4, $next); + $next = $ll->insert(3, $next); + $next = $ll->insert(2, $next); + $next = $ll->insert(5, $next); + $next = $ll->insert(2, $next); + print "Original: "; + print $ll->stringify(); + $ll->partition(3); + print "Partitioned: "; + print $ll->stringify(); +} diff --git a/challenge-059/adam-russell/perl/ch-2.pl b/challenge-059/adam-russell/perl/ch-2.pl new file mode 100644 index 0000000000..ea09ad3c25 --- /dev/null +++ b/challenge-059/adam-russell/perl/ch-2.pl @@ -0,0 +1,38 @@ +use strict; +use warnings; +## +# Write a function which returns the count of +# different bits of the binary representation of +# positive numbers a and b. The script should +# accept n positive numbers and sum the result +# for every pair of numbers given. +## +sub count_different_bits{ + my($a, $b) = @_; + my $bits = 0; + while($a || $b){ + $bits++ if ($a & 1) && !($b & 1); + $bits++ if !($a & 1) && ($b & 1); + $a = $a >> 1; + $b = $b >> 1; + } + return $bits; +} + +MAIN:{ + my $sum = 0; + my $line; + while($line = <DATA>){ + chomp($line); + my($a, $b) = split(/,/, $line); + my $different_bits = count_different_bits($a, $b); + print "($a, $b) = $different_bits\n"; + $sum += $different_bits; + } + print "sum of all bit differences: $sum\n"; +} + +__DATA__ +2,3 +2,4 +3,4 diff --git a/challenge-059/arne-sommer/blog.txt b/challenge-059/arne-sommer/blog.txt new file mode 100644 index 0000000000..3217ab84fe --- /dev/null +++ b/challenge-059/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/linked-sum.html diff --git a/challenge-059/arne-sommer/raku/bit-diff b/challenge-059/arne-sommer/raku/bit-diff new file mode 100755 index 0000000000..fc27e3b060 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-diff @@ -0,0 +1,23 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $a is copy, $b is copy, :$verbose); + +($a, $b) = ($b, $a) if $b > $a; + +my $a2 = $a.base(2); + +my $length = $a2.chars; + +my $b2 = $b.fmt('%0' ~ $length ~ 'b'); + +my $c2 = ($a +^ $b).fmt('%0' ~ $length ~ 'b'); + +if $verbose +{ + say ": $a2 ($a)"; + say ": $b2 ($b)"; + say ": $c2 -> ", $c2.comb.sum; +} + +say $c2.comb.sum; + diff --git a/challenge-059/arne-sommer/raku/bit-diff2 b/challenge-059/arne-sommer/raku/bit-diff2 new file mode 100755 index 0000000000..0cb783fa56 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-diff2 @@ -0,0 +1,18 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $a, $b, :$verbose); + +my $c = ($a +^ $b); + +my $sum = $c.comb.sum; + +if $verbose +{ + my $length = (max($a, $b)).base(2).chars; + + say ": { $a.fmt('%0' ~ $length ~ 'b') } ($a)"; + say ": { $b.fmt('%0' ~ $length ~ 'b') } ($b)"; + say ": { $c.fmt('%0' ~ $length ~ 'b') } -> $sum"; +} + +say $sum; diff --git a/challenge-059/arne-sommer/raku/bit-sum b/challenge-059/arne-sommer/raku/bit-sum new file mode 100755 index 0000000000..89962b4271 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-sum @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int, + :$verbose); + +my $grand-total; + +for @numbers.combinations(2) -> $list +{ + my $sum = bit-diff(|$list); + say ": $list -> $sum" if $verbose; + $grand-total += $sum; +} + +say $grand-total; + +sub bit-diff (Int $a, Int $b) +{ + return ($a +^ $b).base(2).comb.sum; +} diff --git a/challenge-059/arne-sommer/raku/bit-sum-musing b/challenge-059/arne-sommer/raku/bit-sum-musing new file mode 100755 index 0000000000..e4d1166e93 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-sum-musing @@ -0,0 +1,46 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $limit where $limit > 1 = 100, :$verbose); + +my $prev-sum = 0; +my $prev-inc = 0; +my $prev-inx = 0; + +my @result; + +for 2 .. $limit -> $number +{ + my @list = 1 .. $number; + + my $sum = bit-sum(@list); + my $inc = $sum - $prev-sum; + my $inx = $inc - $prev-inc; + + say ": bit-sum 1..{ $number.fmt("%3d") } -> { $sum.fmt("%3d") } -> { $inc.fmt("%3d") } -> { $inx.fmt("%3d") }" if $verbose; + + @result.push: $inx; + + $prev-sum = $sum; + $prev-inc = $inc; + $prev-inx = $inx; +} + +put @result; + +sub bit-sum (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int) +{ + my $grand-total; + + for @numbers.combinations(2) -> $list + { + my $sum = bit-diff(|$list); + $grand-total += $sum; + } + + return $grand-total; + + sub bit-diff (Int $a, Int $b) + { + return ($a +^ $b).base(2).comb.sum; + } +} diff --git a/challenge-059/arne-sommer/raku/bit-sum-musing2 b/challenge-059/arne-sommer/raku/bit-sum-musing2 new file mode 100755 index 0000000000..9562349691 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-sum-musing2 @@ -0,0 +1,56 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $limit where $limit > 1 = 100, :$verbose, :$type = "int"); + +my $prev-sum = 0; +my $prev-inc = 0; +my $prev-inx = 0; + +my @result; + +for 2 .. $limit -> $number +{ + my @list; + + given $type + { + when "int" { @list = (1 .. Inf)[^$number] } + when "even" { @list = (2, 4 ... Inf)[^$number] } + when "odd" { @list = (1, 3 ... Inf)[^$number] } + when "prime" { @list = ((1 .. Inf).grep: *.is-prime)[^$number] } + when "fib" { @list = (1, 1, * + * ... Inf)[^$number] } + default { die "Unknown type $_" } + } + + my $sum = bit-sum(@list); + my $inc = $sum - $prev-sum; + my $inx = $inc - $prev-inc; + + say ": bit-sum @list[] -> { $sum.fmt("%3d") } -> { $inc.fmt("%3d") } -> { $inx.fmt("%3d") }" if $verbose; + + @result.push: $inx; + + $prev-sum = $sum; + $prev-inc = $inc; + $prev-inx = $inx; +} + +put @result; + +sub bit-sum (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int) +{ + my $grand-total; + + for @numbers.combinations(2) -> $list + { + my $sum = bit-diff(|$list); + $grand-total += $sum; + } + + return $grand-total; + + sub bit-diff (Int $a, Int $b) + { + return ($a +^ $b).base(2).comb.sum; + } +} diff --git a/challenge-059/arne-sommer/raku/ch-1.p6 b/challenge-059/arne-sommer/raku/ch-1.p6 new file mode 100755 index 0000000000..27b549dfd5 --- /dev/null +++ b/challenge-059/arne-sommer/raku/ch-1.p6 @@ -0,0 +1,31 @@ +#! /usr/bin/env raku + +multi MAIN (Int $k = 3, Str $list = "1 4 3 2 5 2", :$verbose) +{ + MAIN($k, $list.words, :$verbose); +} + +multi MAIN (Int $k = 3, *@list, :$verbose) +{ + my @lower; + my @higher; + + for @list -> $elem + { + $elem >= $k + ?? @higher.push: $elem + !! @lower.push: $elem; + } + + my @result = (@lower, @higher).flat; + + if $verbose + { + say ": == : $k"; + say ": < : @lower[]"; + say ": >= : @higher[]"; + } + + say @result.join(" → "); +} +
\ No newline at end of file diff --git a/challenge-059/arne-sommer/raku/ch-2.p6 b/challenge-059/arne-sommer/raku/ch-2.p6 new file mode 100755 index 0000000000..89962b4271 --- /dev/null +++ b/challenge-059/arne-sommer/raku/ch-2.p6 @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int, + :$verbose); + +my $grand-total; + +for @numbers.combinations(2) -> $list +{ + my $sum = bit-diff(|$list); + say ": $list -> $sum" if $verbose; + $grand-total += $sum; +} + +say $grand-total; + +sub bit-diff (Int $a, Int $b) +{ + return ($a +^ $b).base(2).comb.sum; |
