diff options
78 files changed, 3873 insertions, 2730 deletions
diff --git a/challenge-006/stuart-little/README b/challenge-006/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-006/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-006/stuart-little/raku/ch-1.p6 b/challenge-006/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..c475bdde13 --- /dev/null +++ b/challenge-006/stuart-little/raku/ch-1.p6 @@ -0,0 +1,10 @@ +#!/usr/bin/env perl6 +use v6; + +# run as <script> <space-separated list entries> + +sub compactify(@a) { + S:g/\D*\-\D*/-/ with @a.sort.unique.map({ (($_-1,$_,$_+1).all == @a.any) ?? '-' !! $_ }).join(',') +} + +say @*ARGS.map(*.Int).&compactify diff --git a/challenge-006/stuart-little/raku/ch-2.p6 b/challenge-006/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..fb07fe23cd --- /dev/null +++ b/challenge-006/stuart-little/raku/ch-2.p6 @@ -0,0 +1,15 @@ +#!/usr/bin/env perl6 +use v6; + +# run as <script> + +use Inline::Perl5; +my $p5 = Inline::Perl5.new; + +$p5.run(q{ + use v5.12; + use Math::BigFloat; + Math::BigFloat->precision(-60); + + say substr(Math::BigFloat->new('1')->bexp()->bpow(Math::BigFloat->bpi()->bmul(Math::BigFloat->new('163')->bsqrt())->bround(60)),0,52); + }); diff --git a/challenge-046/stuart-little/README b/challenge-046/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-046/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-046/stuart-little/raku/ch-1.p6 b/challenge-046/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..4a94cafd3c --- /dev/null +++ b/challenge-046/stuart-little/raku/ch-1.p6 @@ -0,0 +1,27 @@ +#!/usr/bin/env perl6 +use v6; + +# run as <script> + +sub rep_across_msgs(@a) { + (roundrobin @a.List).map({ ($_.Bag (-) $_.Set).keys }) +} + +my @a1=( + <H x l 4 !>, + <c e - l o>, + <z e 6 l g>, + <H W l v R>, + <q 9 m # o>, +); + +my @a2=( + Q:w{P + 2 l ! a t o}, + Q:w{1 e 8 0 R $ 4 u}, + Q:w{5 - r ] + a > /}, + Q:w{P x w l b 3 k \}, + Q:w{2 e 3 5 R 8 y u}, + Q:w{< ! r ^ ( ) k 0}, +); + +for (@a1, @a2) {.&rep_across_msgs.say} diff --git a/challenge-046/stuart-little/raku/ch-2.p6 b/challenge-046/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..415f17ec1a --- /dev/null +++ b/challenge-046/stuart-little/raku/ch-2.p6 @@ -0,0 +1,6 @@ +#!/usr/bin/env perl6 +use v6; + +# run as <script> + +say (1..500).grep({ $_.sqrt.floor ** 2 == $_ }) diff --git a/challenge-050/stuart-little/README b/challenge-050/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-050/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-050/stuart-little/raku/ch-1.p6 b/challenge-050/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..7d14b691dd --- /dev/null +++ b/challenge-050/stuart-little/raku/ch-1.p6 @@ -0,0 +1,18 @@ +#!/usr/bin/env perl6 +use v6; + +sub mrg(@a) { + my @srta = @a.sort; + given @a.elems { + when * <= 1 { @srta } + default { + (@srta[0;1] < @srta[1;0]) + ?? (@srta[0], |mrg(@srta[1..*])) + !! (((@srta[0;0],max(@srta[0;1],@srta[1;1])), |@srta[2..*]).&mrg) + } + } +} + +say @*ARGS.map(*.split(',').map(*.Int)).&mrg + +# run as <script> <space-separated intervals with comma-separated endpoints; e.g. <script> 2,7 3,9 10,12 15,19 18,22 diff --git a/challenge-050/stuart-little/raku/ch-2.p6 b/challenge-050/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..1488e7ec86 --- /dev/null +++ b/challenge-050/stuart-little/raku/ch-2.p6 @@ -0,0 +1,10 @@ +#!/usr/bin/env perl6 +use v6; + +sub nob(@a) { + @a.grep({ $_ == @a.grep( * > $_ ) }) +} + +say nob(@*ARGS.map(*.Int)); + +# run as <script> <space-separated array entries> diff --git a/challenge-051/stuart-little/README b/challenge-051/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-051/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-051/stuart-little/raku/ch-1.p6 b/challenge-051/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..e395d47003 --- /dev/null +++ b/challenge-051/stuart-little/raku/ch-1.p6 @@ -0,0 +1,10 @@ +#!/usr/bin/env perl6 +use v6; + +sub sum3($t, @a) { + @a.combinations(3).grep({ $_.sum == $t }) +} + +say sum3(@*ARGS[0].Int, @*ARGS[1..*].map(*.Int)); + +# run as <script> <target> <space-separated array entries> diff --git a/challenge-051/stuart-little/raku/ch-2.p6 b/challenge-051/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..324e1ac8f0 --- /dev/null +++ b/challenge-051/stuart-little/raku/ch-2.p6 @@ -0,0 +1,11 @@ +#!/usr/bin/env perl6 +use v6; + +sub iscol($n) { + ((^$n.chars) X (^$n.chars)).grep({ $_[1] >= $_[0] }).map({ $n.substr($_[0]..$_[1]) }).map({ $_.split('',:skip-empty).reduce(&infix:<*>) }).unique.elems + == $n.chars * ($n.chars+1) /2 +} + +say (100..999).grep(&iscol); + +# run as <script> diff --git a/challenge-052/stuart-little/README b/challenge-052/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-052/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-052/stuart-little/raku/ch-1.p6 b/challenge-052/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..abe8385aff --- /dev/null +++ b/challenge-052/stuart-little/raku/ch-1.p6 @@ -0,0 +1,29 @@ +#!/usr/bin/env perl6 +use v6; + +sub p1max(@a where *.elems %% 2) { + given @a.elems { + when 0 { 0 } + when 2 { @a.max } + default { ( + @a[0] + (@a[2..*].&p1max, @a[1..^(@a-1)].&p1max).min, + @a[*-1] + (@a[1..^(@a-1)].&p1max, @a[0..^(@a-2)].&p1max).min + ).max } + } +} + +sub winner(@a) { + given @a.&p1max { + when * > @a.sum/2 {"Player 1 wins"} + when * < @a.sum/2 {"Player 2 wins"} + default {"Draw"} + } +} + + +my @coins=(1, 0.50, 0.01, 0.10, 0.05, 0.20, 2, 0.02); + +say "Best strategy for player 1 results in winning ", @coins.&p1max; +say @coins.&winner; + +# run as <script> diff --git a/challenge-052/stuart-little/raku/ch-2.p6 b/challenge-052/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..8c55a49ab4 --- /dev/null +++ b/challenge-052/stuart-little/raku/ch-2.p6 @@ -0,0 +1,10 @@ +#!/usr/bin/env perl6 +use v6; + +sub isstep($n) { + (($n.split('',:skip-empty) Z- $n.substr(1..*).split('',:skip-empty)).all ~~ *.abs==1).Bool +} + +say (100..999).grep(&isstep); + +# run as <script> diff --git a/challenge-053/stuart-little/README b/challenge-053/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-053/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-053/stuart-little/raku/ch-1.p6 b/challenge-053/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..f35fdf94e3 --- /dev/null +++ b/challenge-053/stuart-little/raku/ch-1.p6 @@ -0,0 +1,19 @@ +#!/usr/bin/env perl6 +use v6; + +sub rot(@a,$a) { + given $a { + when 0 { @a } + when 90 { @a[0].keys.map({ @a[0..^@a;$_] }).map(*.reverse) } + when 180 { @a.reverse.map(*.reverse) } + when 270 { rot(@a,90).reverse.map(*.reverse) } + } +} + +my @a=((1,2,3),(4,5,6),(7,8,9)); + +for rot(@a,@*ARGS[0]) { + .say +} + +# run as <script> <angle in degrees> diff --git a/challenge-053/stuart-little/raku/ch-2.p6 b/challenge-053/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..c7a93d448c --- /dev/null +++ b/challenge-053/stuart-little/raku/ch-2.p6 @@ -0,0 +1,24 @@ +#!/usr/bin/env perl6 +use v6; + +sub allwstr(Int $l where * >= 0, %h) { + given $l { + when 0 { () } + when 1 { %h.keys.sort } + default { + allwstr($l-1, %h).map({ $_ X~ @(%h.{$_.substr(*-1)}).sort }).flat + } + } +} + +my %h = ( + a => <e i>, + e => <i>, + i => <a e o u>, + o => <a u>, + u => <o e>, +); + +say allwstr(@*ARGS[0].Int,%h); + +# run as <script> <string length> diff --git a/challenge-090/aaronreidsmith/blog.txt b/challenge-090/aaronreidsmith/blog.txt new file mode 100644 index 0000000000..c0bf9276a7 --- /dev/null +++ b/challenge-090/aaronreidsmith/blog.txt @@ -0,0 +1 @@ +https://aaronreidsmith.github.io/blog/perl-weekly-challenge-090/
\ No newline at end of file diff --git a/challenge-090/aaronreidsmith/raku/ch-1.raku b/challenge-090/aaronreidsmith/raku/ch-1.raku new file mode 100644 index 0000000000..3c12a719c9 --- /dev/null +++ b/challenge-090/aaronreidsmith/raku/ch-1.raku @@ -0,0 +1,17 @@ +#!/usr/bin/env perl6 + +subset ValidDna of Str where { $_ ~~ /^^[A|T|G|C]+$$/ } + +# Since DNA is generally read from 5' to 3', I included the option to find the +# reverse compliment in addition to the complement +sub MAIN($dna where $dna ~~ ValidDna, Bool :rc(:$reverse-complement) = False) { + say "Input stats:\n{$dna.comb.Bag.Hash}\n"; + + say "Complement:"; + my $translated = $dna.trans('ATGC' => 'TACG'); + if $reverse-complement { + say "5'-{$translated.flip}-3'"; + } else { + say "3'-$translated-5'" + } +} diff --git a/challenge-090/aaronreidsmith/raku/ch-2.raku b/challenge-090/aaronreidsmith/raku/ch-2.raku new file mode 100644 index 0000000000..fa5fe375c6 --- /dev/null +++ b/challenge-090/aaronreidsmith/raku/ch-2.raku @@ -0,0 +1,21 @@ +#!/usr/bin/env perl6 + +subset PositiveInt of Int where { $_ ~~ Int && $_ > 0 } + +sub generate-pairs($a, $b) { + sprintf("%02d, %02d", $a, $b).put; + if $a == 1 { + (($a, $b),); + } else { + (($a, $b), |generate-pairs($a div 2, $b * 2)); + } +} + +sub MAIN(PositiveInt $A, PositiveInt $B) { + say "Input: A=$A, B=$B"; + say "Divide A by 2 (ignoring remainders) until it is 1. Multiply B by 2 as we go:"; + my @pairs = generate-pairs($A, $B); + say "Then, wherever A is odd, we add the Bs together:"; + my @odd-bs = @pairs.grep(-> @pair { !(@pair[0] %% 2) }).map(-> @pair { @pair[1] }); + say "{@odd-bs.join(' + ')} = {@odd-bs.sum}"; +} diff --git a/challenge-090/alexander-pankoff/perl/ch-1.pl b/challenge-090/alexander-pankoff/perl/ch-1.pl new file mode 100755 index 0000000000..15f2c016bc --- /dev/null +++ b/challenge-090/alexander-pankoff/perl/ch-1.pl @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +use v5.20; +use utf8; +use strict; +use warnings; +use feature qw(say signatures); +no warnings 'experimental::signatures'; + +{ + my ( $sequence ) = @ARGV; + die 'need dna sequence' unless $sequence; + my %complements = ( T => 'A', G => 'C' ); + %complements = ( %complements, reverse %complements ); + + say 'Nucleiobase count: ' . length( $sequence ); + say 'Complementary sequence: ' . join( '', map { $complements{$_} } split( '', $sequence ) ); +} diff --git a/challenge-090/alexander-pankoff/perl/ch-2.pl b/challenge-090/alexander-pankoff/perl/ch-2.pl new file mode 100755 index 0000000000..a66c4feea7 --- /dev/null +++ b/challenge-090/alexander-pankoff/perl/ch-2.pl @@ -0,0 +1,45 @@ +#!/usr/bin/env perl +use v5.20; +use utf8; +use strict; +use warnings; +use feature qw(say signatures); +no warnings 'experimental::signatures'; + +use List::Util qw(sum0); + +use Test::Simple tests => 20; + +use constant VERBOSE => $ENV{VERBOSE} // 0; + +{ + for ( 0 .. 19 ) { + my ( $a, $b ) = map { int( rand( 1000 ) ) + 1 } 0 .. 1; + my $expected = $a * $b; + ok( ethopian_mul( $a, $b ) == $expected, "ethopian_mul($a, $b) = $a * $b = $expected" ); + } +} + +sub ethopian_mul ( $a, $b ) { + my @chain = ethopian_mul_chain( $a, $b ); + verbose( "halving $a, doubling $b, till $a becomes 1" ); + verbose( $_->[0] . ' & ' . $_->[1] ) for @chain; + + my @filtered = map { $_->[1] } grep { odd( $_->[0] ) } @chain; + verbose( "taking right values where left value is odd" ); + verbose( $_ ) for @filtered; + my $product = sum0( @filtered ); + verbose( "product is $product" ); + return $product; +} + +sub ethopian_mul_chain ( $a, $b ) { + return [ $a, $b ] if $a <= 1; + + # using bit shifts to avoid use of multiplication + return ( [ $a, $b ], ethopian_mul_chain( $a >> 1, $b << 1 ) ); +} + +sub odd($x) { + $x & 1; +} diff --git a/challenge-090/andinus/README b/challenge-090/andinus/README index b372bec8d3..b662f1cb50 100644 --- a/challenge-090/andinus/README +++ b/challenge-090/andinus/README @@ -1,67 +1,95 @@ ━━━━━━━━━━━━━━━ - CHALLENGE 086 + CHALLENGE 090 Andinus ━━━━━━━━━━━━━━━ - 2020-11-15 + 2020-12-08 Table of Contents ───────────────── |
