diff options
| author | 冯昶 <fengchang@novel-supertv.com> | 2020-11-17 14:40:24 +0800 |
|---|---|---|
| committer | 冯昶 <fengchang@novel-supertv.com> | 2020-11-17 14:40:24 +0800 |
| commit | baadeac3908d309acdc95cae65176602acadce4e (patch) | |
| tree | d50160f5ed958beca7f1c1a7ab050c9299ea75e7 | |
| parent | 15f7046d6105e6f413a284592e1ce4d5cd27997e (diff) | |
| parent | dac3cad558402193f4acc14548c71fdb80a61bc2 (diff) | |
| download | perlweeklychallenge-club-baadeac3908d309acdc95cae65176602acadce4e.tar.gz perlweeklychallenge-club-baadeac3908d309acdc95cae65176602acadce4e.tar.bz2 perlweeklychallenge-club-baadeac3908d309acdc95cae65176602acadce4e.zip | |
Merge remote-tracking branch 'upstream/master'
68 files changed, 5153 insertions, 3215 deletions
diff --git a/challenge-031/stuart-little/README b/challenge-031/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-031/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-031/stuart-little/raku/ch-1.p6 b/challenge-031/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..55288764c8 --- /dev/null +++ b/challenge-031/stuart-little/raku/ch-1.p6 @@ -0,0 +1,11 @@ +#!/usr/bin/env perl6 +use v6; + +try { + say @*ARGS[0].Real/@*ARGS[1].Real; +} + +($!) && say "Tried to divide by 0, eh?" + +# run as <script> <numerator> <denominator> + diff --git a/challenge-031/stuart-little/raku/ch-2.p6 b/challenge-031/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..350f958e82 --- /dev/null +++ b/challenge-031/stuart-little/raku/ch-2.p6 @@ -0,0 +1,11 @@ +#!/usr/bin/env perl6 +use v6; + +my $name = "\$@*ARGS[0]"; +spurt 'MySymbols.pm6', "use v6; unit module MySymbols; my $name = \'@*ARGS[1]\'; say \"\\$name = $name\""; +use lib '.'; +require MySymbols; +unlink 'MySymbols.pm6'; + +# run as <script> <variable name> <variable value> +# ref: https://stackoverflow.com/questions/47332941/how-to-define-variable-names-dynamically-in-perl-6 diff --git a/challenge-032/stuart-little/README b/challenge-032/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-032/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-032/stuart-little/raku/ch-1.p6 b/challenge-032/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..9961930fcd --- /dev/null +++ b/challenge-032/stuart-little/raku/ch-1.p6 @@ -0,0 +1,22 @@ +#!/usr/bin/env perl6 +use v6; + +my %*SUB-MAIN-OPTS=:named-anywhere,; +sub MAIN( + Bool :c(:$csv), + *@FILES, + ) { + + sub freq(@a,$cflag) { + my @bg=@a.Bag.sort({$^b.value leg $^a.value}); + (! $cflag) ?? + (@bg) !! + (@bg.map({ $_.key ~ ',' ~ $_.value })) + } + + my @a=(! @FILES) + ?? ($*IN.lines) + !! (@FILES.map({ $_.IO.lines }).flat); + for freq(@a,$csv) {.say}; +} + diff --git a/challenge-032/stuart-little/raku/ch-2.p6 b/challenge-032/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..79743021c9 --- /dev/null +++ b/challenge-032/stuart-little/raku/ch-2.p6 @@ -0,0 +1,24 @@ +#!/usr/bin/env perl6 +use v6; + +my %*SUB-MAIN-OPTS=:named-anywhere,; +sub MAIN( + Str :b(:$by) ="values", + *@ARGS, + ) { + + sub chrt(%h, Str $by) { + %h.sort({ ($by eq "labels") && $_.key + || ($by eq "values") && -$_.value }) + .map({ sprintf("%10s", $_.key) ~ ' | ' ~ '#' x $_.value }) + } + + my %h=@ARGS; + for chrt(%h.map({$_.key => $_.value.Int}).Hash,$by) {.say}; +} + +sub USAGE() { + print Q:c:to/EOH/; + Usage: <script> [hash passed as key value key value ..] [-b|--by=values(default)|labels] +EOH +} diff --git a/challenge-048/stuart-little/README b/challenge-048/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-048/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-048/stuart-little/raku/ch-1.p6 b/challenge-048/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..25a4cd51bd --- /dev/null +++ b/challenge-048/stuart-little/raku/ch-1.p6 @@ -0,0 +1,15 @@ +#!/usr/bin/env perl6 +use v6; + +sub surv(@a where *.elems >= 1) { + given @a.elems { + when * <= 2 {@a[0]} + default { + (|@a[2..*], @a[0]).&surv + } + } +} + +say (1..@*ARGS[0].Int).&surv.base(2) + +# run as <script> <number of players> diff --git a/challenge-048/stuart-little/raku/ch-2.p6 b/challenge-048/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..d863cafea0 --- /dev/null +++ b/challenge-048/stuart-little/raku/ch-2.p6 @@ -0,0 +1,6 @@ +#!/usr/bin/env perl6 +use v6; + +say (Date.new(2000, 1, 1)..Date.new(2200, 12, 31)).grep({ $_.day == 2 || $_.day == 12 }).grep({ ($_.year %% 10) && (! $_.year %% 100) || ($_.year % 100 == (1,11,21).any ) }).map({ sprintf("%02d", $_.month) ~ sprintf("%02d", $_.day) ~ $_.year }).grep({ $_ eq $_.flip }) + +# run as <script> diff --git a/challenge-054/stuart-little/README b/challenge-054/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-054/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-054/stuart-little/raku/ch-1.p6 b/challenge-054/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..3530a98037 --- /dev/null +++ b/challenge-054/stuart-little/raku/ch-1.p6 @@ -0,0 +1,21 @@ +#!/usr/bin/env perl6 +use v6; + +sub rk_perm(@a, $k) { + given my ($ix,$fact) = ((1..@a.elems) Z [\*](1..@a.elems)).first({ $_[1] < $k }, :end) { + when ! *.[0].defined { @a } + when *.[0] == @a.elems { @a.reverse } + when *.[0] < @a.elems-1 { + (|@a[^(@a.elems-$ix-1)], |rk_perm(@a[(@a.elems-$ix-1)..*], $k)) + } + default { + my $init_ix=ceiling($k/$fact)-1; + my @rest=(@a.keys (-) $init_ix).keys.sort; + (@a[$init_ix], |rk_perm(@a[@rest], $k-($fact * (ceiling($k/$fact)-1)))) + } + } +} + +say rk_perm((1..@*ARGS[0].Int).List, (@*ARGS[1] || 1).Int); + +# run as <script> <$n for which we're permuting 1..$n> <the rank $k of the permutation you want> diff --git a/challenge-054/stuart-little/raku/ch-2.p6 b/challenge-054/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..7c71620fc1 --- /dev/null +++ b/challenge-054/stuart-little/raku/ch-2.p6 @@ -0,0 +1,45 @@ +#!/usr/bin/env perl6 +use v6; + +my %*SUB-MAIN-OPTS=:named-anywhere,; +my %cllens = (1 => 1); + +sub cltz($n) { ($n %% 2) ?? ($n div 2) !! (($n > 1) ?? (3*$n+1) !! (1)) } + +sub cllen($n) { + %cllens{$n} //= 1+cllen($n.&cltz) +} + +sub cltz_seq(Int $n where * > 0) { + given $n { + when 1 { (1,) } + when * %% 2 { ($n,|cltz_seq($n div 2)) } + default { ($n,|cltz_seq(3*$n+1)) } + } +} + +multi sub MAIN( + Bool :b(:$bonus), +) { + my $L=1_000_000; + my $wndw=20; + my @maxn=[1]; + + for (1..$L) { + my $ln = cllen($_); + ($ln > %cllens{@maxn}.max) && do { + (@maxn.elems == $wndw) && @maxn.shift; + @maxn.push($_) + } + } + + for @maxn { + say $_ ~ " " ~ %cllens{$_} + } +} + +multi sub MAIN( + *@ARGS, +) { + say @ARGS[0].Int.&cltz_seq; +} diff --git a/challenge-055/stuart-little/README b/challenge-055/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-055/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-055/stuart-little/raku/ch-1.p6 b/challenge-055/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..bd77d55d9e --- /dev/null +++ b/challenge-055/stuart-little/raku/ch-1.p6 @@ -0,0 +1,10 @@ +#!/usr/bin/env perl6 +use v6; + +sub max1flip(Str $s where * ~~ /^(0|1)*$/) { + ((^$s.chars) X (^$s.chars)).grep({ $_[0] <= $_[1] }).classify({ $s.substr($_[0]..$_[1]).comb.grep(0).elems - $s.substr($_[0]..$_[1]).comb.grep(1).elems }).max(*.key).value +} + +say @*ARGS[0].&max1flip + +# run as <script> <binary string> diff --git a/challenge-055/stuart-little/raku/ch-2.p6 b/challenge-055/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..49aece53ba --- /dev/null +++ b/challenge-055/stuart-little/raku/ch-2.p6 @@ -0,0 +1,13 @@ +#!/usr/bin/env perl6 +use v6; + +sub wv(@a,$b) { + $b eqv ().Bag && do {say @a; return}; + for $b.keys.grep({ (@a %% 2) ?? ($_ >= (@a[*-1] || -Inf)) !! ($_ <= (@a[*-1] || Inf)) }) { + wv((|@a,$_),($b (-) $_)) + } +} + +wv((), @*ARGS.map(*.Int).Bag) + +# run as <script> <space-separated integers> diff --git a/challenge-064/stuart-little/README b/challenge-064/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-064/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-064/stuart-little/raku/ch-1.p6 b/challenge-064/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..97673cbeb9 --- /dev/null +++ b/challenge-064/stuart-little/raku/ch-1.p6 @@ -0,0 +1,26 @@ +#!/usr/bin/env perl6 +use v6; + +my @gr=[ + < 1 2 3 >, + < 4 5 6 >, + < 7 8 9 >, +].map(*.map({ $_.Int })).map(*.Array); + +sub cost(@gr,$i,$j) { + $i==0 && return @gr[0][0..$j].sum; + $j==0 && return @gr[0..$i].map(*.[0]).sum; + return @gr[$i][$j]+min(cost(@gr,$i-1,$j),cost(@gr,$i,$j-1)); +} + +sub pth(@gr,@acc) { + @acc+1 == @gr + @gr[0] && return @acc; + given my ($x,$y) = @acc[0] { + when ($x >= 1) && (@gr.&cost($x,$y)-@gr.&cost($x-1,$y)==@gr[$x][$y]) { pth(@gr,(($x-1,$y), |@acc)) } + when ($y >= 1) && (@gr.&cost($x,$y)-@gr.&cost($x,$y-1)==@gr[$x][$y]) { pth(@gr,(($x,$y-1), |@acc)) } + } +} + +say cost(@gr, @gr.elems-1, @gr[0].elems-1), ": ", pth(@gr, ((@gr-1,@gr[0]-1),)).map({ @gr[$_[0]][$_[1]] }).join(" -> ") + +# run as <script> diff --git a/challenge-064/stuart-little/raku/ch-2.p6 b/challenge-064/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..93a9c2d763 --- /dev/null +++ b/challenge-064/stuart-little/raku/ch-2.p6 @@ -0,0 +1,15 @@ +#!/usr/bin/env perl6 +use v6; + +sub partw($w,@a,@acc) { + $w eq '' && return @acc; + @a.map({ $w.starts-with($_) && (partw($w.substr($_.chars),@a,(|@acc,$_))) }) + .grep( *.so ) +} + +partw(@*ARGS[0],@*ARGS[1..*],()) +.map(*.flat) +.say + +# run as <script> <target word> <array of space-separated words> + diff --git a/challenge-066/stuart-little/README b/challenge-066/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-066/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-066/stuart-little/raku/ch-1.p6 b/challenge-066/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..70dd7bfeee --- /dev/null +++ b/challenge-066/stuart-little/raku/ch-1.p6 @@ -0,0 +1,28 @@ +#!/usr/bin/env perl6 +use v6; + +multi sub awkdiv(Int $n, 0) { + "You're dividing by zero!" +} + +multi sub awkdiv(0, Int $d) { + 0 +} + +multi sub awkdiv(Int $n, Int $d where {sign($_) == sign $n}) { + given $d.abs { + when * > $n.abs {0} + default { 1+ awkdiv(($n-$d).abs,$d.abs)} + } +} + +multi sub awkdiv(Int $n, Int $d where {sign($_) !== sign $n}) { + given $d.abs { + when * > $n.abs {-1} + default { -1+ awkdiv(($n+$d).abs,-$d.abs)} + } +} + +say awkdiv(@*ARGS[0].Int, @*ARGS[1].Int) + +# run as <script> <numerator> <denominator> diff --git a/challenge-066/stuart-little/raku/ch-2.p6 b/challenge-066/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..8c072a7bd9 --- /dev/null +++ b/challenge-066/stuart-little/raku/ch-2.p6 @@ -0,0 +1,10 @@ +#!/usr/bin/env perl6 +use v6; + +sub pws(Int $n) { + (2..$n.sqrt).grep({ $_ ** log($n,$_).Int == $n }).map({ $_, log($n,$_) }) +} + +say (@*ARGS[0].Int.&pws) ?? ("$_[0]^$_[1]" for |@*ARGS[0].Int.&pws) !! 0 + +# run as <script> <number> diff --git a/challenge-067/stuart-little/README b/challenge-067/stuart-little/README new file mode 100644 index 0000000000..78439907de --- /dev/null +++ b/challenge-067/stuart-little/README @@ -0,0 +1 @@ +Solutions by Stuart Little diff --git a/challenge-067/stuart-little/raku/ch-1.p6 b/challenge-067/stuart-little/raku/ch-1.p6 new file mode 100755 index 0000000000..90074e7548 --- /dev/null +++ b/challenge-067/stuart-little/raku/ch-1.p6 @@ -0,0 +1,6 @@ +#!/usr/bin/env perl6 +use v6; + +(1..@*ARGS[0].Int).combinations(@*ARGS[1].Int).say + +# run as <script> <number> <combination size> diff --git a/challenge-067/stuart-little/raku/ch-2.p6 b/challenge-067/stuart-little/raku/ch-2.p6 new file mode 100755 index 0000000000..94515f20fb --- /dev/null +++ b/challenge-067/stuart-little/raku/ch-2.p6 @@ -0,0 +1,22 @@ +#!/usr/bin/env perl6 +use v6; + +my %trhsh = ( + 1 => <_ @>, + 2 => <a b c>, + 3 => <d e f>, + 4 => <g h i>, + 5 => <j k l>, + 6 => <m n o>, + 7 => <p q r s>, + 8 => <t u v>, + 9 => <w x y z>, +); + +sub kypd(Str $s where * ~~ /^<[1..9]>+$/) { + $s.comb.map({ %trhsh.{$_} }).reduce(&infix:<X>).map(*.join) +} + +@*ARGS[0].&kypd.say + +# run as <script> <digit string> diff --git a/challenge-086/duncan-c-white/README b/challenge-086/duncan-c-white/README index 53a59c4fc8..306809ff7f 100644 --- a/challenge-086/duncan-c-white/README +++ b/challenge-086/duncan-c-white/README @@ -1,50 +1,91 @@ -Task 1: "Triplet Sum +Task 1: "Pair Difference -You are given an array of real numbers greater than zero. +You are given an array of integers @N and an integer $A. -Write a script to find if there exists a triplet (a,b,c) such that 1 < -a+b+c < 2. Print 1 if you succeed otherwise 0. +Write a script to find find if there exists a pair of elements in the +array whose difference is $A. Print 1 if exists otherwise 0. Example 1: - Input: @R = (1.2, 0.4, 0.1, 2.5) - Output: 1 as 1 < 1.2 + 0.4 + 0.1 < 2 + Input: @N = (10, 8, 12, 15, 5) and $A = 7 + Output: 1 as 15 - 8 = 7 Example 2: - Input: @R = (0.2, 1.5, 0.9, 1.1) - Output: 0 + Input: @N = (1, 5, 2, 9, 7) and $A = 6 + Output: 1 as 7 - 1 = 6 Example 3: - Input: @R = (0.5, 1.1, 0.3, 0.7) - Output: 1 as 1 < 0.5 + 1.1 + 0.3 < 2 + Input: @N = (10, 30, 20, 50, 40) and $A = 15 + Output: 0 -My notes: simple, I think it means "pick any 3 elements a, b and c from the -array and determine if any a,b,c triple sums to between 1 and 2", although both -successful examples show 3 ADJACENT elements a, b and c... +My notes: simple and straightforward: try all pairs of elements looking +for abs(x-y)==A -Task 2: "Power of Two Integers +Task 2: "Sudoku Puzzle -You are given a positive integer $N. +You are given Sudoku puzzle (9x9). -Write a script to find if it can be expressed as a ** b where a > 0 and -b > 1. Print 1 if you succeed otherwise 0. +Write a script to complete the puzzle and must respect the following rules: +a) Each row must have the numbers 1-9 occuring just once. +b) Each column must have the numbers 1-9 occuring just once. +c) The numbers 1-9 must occur just once in each of the 9 sub-boxes (3x3) of the grid. -Example 1: +Example: -Input: 8 -Output: 1 as 8 = 2 ** 3 +[ _ _ _ 2 6 _ 7 _ 1 ] +[ 6 8 _ _ 7 _ _ 9 _ ] +[ 1 9 _ _ _ 4 5 _ _ ] +[ 8 2 _ 1 _ _ _ 4 _ ] +[ _ _ 4 6 _ 2 9 _ _ ] |
