aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-09-07 17:44:29 +0100
committerGitHub <noreply@github.com>2020-09-07 17:44:29 +0100
commitdcae10f2bd7759010355c8151496d27e1c0441a1 (patch)
tree5c63562e360ed00978bc6510216d2638c8844778
parent4c6b8646adf507542fe2cf636af57d9032e597a3 (diff)
parent1ec534344090149ac3944e320df6d639172d9d7c (diff)
downloadperlweeklychallenge-club-dcae10f2bd7759010355c8151496d27e1c0441a1.tar.gz
perlweeklychallenge-club-dcae10f2bd7759010355c8151496d27e1c0441a1.tar.bz2
perlweeklychallenge-club-dcae10f2bd7759010355c8151496d27e1c0441a1.zip
Merge pull request #2229 from seaker/master
Raku solutions by Feng Chang, challenge #077
-rw-r--r--challenge-009/feng-chang/README1
-rwxr-xr-xchallenge-009/feng-chang/perl5/ch-1.pl16
-rwxr-xr-xchallenge-009/feng-chang/perl6/ch-1-one-liner.p64
-rwxr-xr-xchallenge-009/feng-chang/perl6/ch-1.p68
-rw-r--r--challenge-013/feng-chang/.gitignore1
-rwxr-xr-xchallenge-013/feng-chang/perl6/ch-1.p613
-rwxr-xr-xchallenge-013/feng-chang/perl6/ch-2.p612
-rwxr-xr-xchallenge-064/feng-chang/raku/ch-1.raku34
-rwxr-xr-xchallenge-064/feng-chang/raku/ch-2.raku27
-rwxr-xr-xchallenge-072/feng-chang/raku/ch-1a.raku14
-rwxr-xr-xchallenge-072/feng-chang/raku/ch-1b.raku5
-rwxr-xr-xchallenge-074/feng-chang/raku/ch-1.raku19
-rwxr-xr-xchallenge-075/feng-chang/raku/ch-1.raku19
-rwxr-xr-xchallenge-075/feng-chang/raku/ch-2.raku13
-rwxr-xr-xchallenge-077/feng-chang/raku/ch-1.raku29
-rwxr-xr-xchallenge-077/feng-chang/raku/ch-2.raku25
16 files changed, 240 insertions, 0 deletions
diff --git a/challenge-009/feng-chang/README b/challenge-009/feng-chang/README
new file mode 100644
index 0000000000..74e56de3ed
--- /dev/null
+++ b/challenge-009/feng-chang/README
@@ -0,0 +1 @@
+Solutions by Feng Chang.
diff --git a/challenge-009/feng-chang/perl5/ch-1.pl b/challenge-009/feng-chang/perl5/ch-1.pl
new file mode 100755
index 0000000000..a883e28946
--- /dev/null
+++ b/challenge-009/feng-chang/perl5/ch-1.pl
@@ -0,0 +1,16 @@
+#!/bin/env perl
+
+use Modern::Perl;
+use List::Uniq ':all';
+
+my $n = 101;
+my $n2;
+
+while (1) {
+ $n2 = $n * $n;
+ last if @{ uniq sort split(//, $n2) } >= 5;
+
+ ++$n;
+}
+
+say "$n2 = $n * $n";
diff --git a/challenge-009/feng-chang/perl6/ch-1-one-liner.p6 b/challenge-009/feng-chang/perl6/ch-1-one-liner.p6
new file mode 100755
index 0000000000..7699bd89c8
--- /dev/null
+++ b/challenge-009/feng-chang/perl6/ch-1-one-liner.p6
@@ -0,0 +1,4 @@
+#!/bin/env perl6
+
+my $n = (101 ... *).map({ $_ if ($_ * $_).comb.unique.elems >= 5 }).[0];
+say $n * $n, " = $n * $n";
diff --git a/challenge-009/feng-chang/perl6/ch-1.p6 b/challenge-009/feng-chang/perl6/ch-1.p6
new file mode 100755
index 0000000000..1039d77b3d
--- /dev/null
+++ b/challenge-009/feng-chang/perl6/ch-1.p6
@@ -0,0 +1,8 @@
+#!/bin/env perl6
+
+for (101 ... *) -> $n {
+ my int $n2 = $n * $n;
+ last if $n2.comb.unique.elems >= 5;
+
+ LAST { say "$n2 = $n * $n" }
+}
diff --git a/challenge-013/feng-chang/.gitignore b/challenge-013/feng-chang/.gitignore
new file mode 100644
index 0000000000..1377554ebe
--- /dev/null
+++ b/challenge-013/feng-chang/.gitignore
@@ -0,0 +1 @@
+*.swp
diff --git a/challenge-013/feng-chang/perl6/ch-1.p6 b/challenge-013/feng-chang/perl6/ch-1.p6
new file mode 100755
index 0000000000..17436e10c7
--- /dev/null
+++ b/challenge-013/feng-chang/perl6/ch-1.p6
@@ -0,0 +1,13 @@
+#!/bin/env perl6
+
+my $format = sub ($self) { sprintf '%04d/%02d/%02d', .year, .month, .day, given $self };
+
+sub last-day-to-last-friday(Int $year, Int $month, Int $day) {
+ my Date $d = Date.new(sprintf "%04d-%02d-%02d", $year, $month, $day);
+ $d -= ($d.day-of-week - 5) mod 7;
+}
+
+sub MAIN(Int $year) {
+ my @last-days = 31, Date.new(year => $year).is-leap-year ?? 29 !! 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;
+ (1 .. 12).map({ last-day-to-last-friday($year, $_, @last-days[$_ - 1]) })».clone(formatter => $format)».say;
+}
diff --git a/challenge-013/feng-chang/perl6/ch-2.p6 b/challenge-013/feng-chang/perl6/ch-2.p6
new file mode 100755
index 0000000000..262dfce177
--- /dev/null
+++ b/challenge-013/feng-chang/perl6/ch-2.p6
@@ -0,0 +1,12 @@
+#!/bin/env perl6
+
+multi F(0) { 1 }
+multi F(Int $n where * > 0) { $n - M(F($n - 1)) }
+
+multi M(0) { 0 }
+multi M(Int $n where * > 0) { $n - F(M($n - 1)) }
+
+sub MAIN(Int $n where * >= 0) {
+ (^$n)».&F.say;
+ (^$n)».&M.say;
+}
diff --git a/challenge-064/feng-chang/raku/ch-1.raku b/challenge-064/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..9f1add1f31
--- /dev/null
+++ b/challenge-064/feng-chang/raku/ch-1.raku
@@ -0,0 +1,34 @@
+#!/bin/env raku
+
+my Int $M = prompt 'm: ';
+my Int $N = prompt 'n: ';
+
+my @a;
+for $*IN.lines() -> $line {
+ @a.append($line.comb(/(\d+)/));
+ last if @a.elems ≥ $M * $N;
+}
+
+my Int @Mat[$M;$N];
+for ^$M -> Int $i {
+ for ^$N -> Int $j {
+ @Mat[$i;$j] = @a.shift.Int;
+ }
+}
+
+my @Path[$M;$N];
+@Path[0;0] = [@Mat[0;0]];
+
+for 1 .. $M + $N - 2 -> Int $s {
+ for (0, $s - $N + 1).max .. ($s, $M - 1).min -> Int $i {
+ my Int $j = $s - $i;
+
+ ($i > 0 ?? [+] @Path[$i-1;$j] !! ∞) < ($j > 0 ?? [+] @Path[$i;$j-1] !! ∞) ??
+ (@Path[$i;$j] = @Path[$i-1;$j].clone) !!
+ (@Path[$i;$j] = @Path[$i;$j-1].clone);
+
+ @Path[$i;$j].append(@Mat[$i;$j]);
+ }
+}
+
+say "{ [+] @Path[$M-1;$N-1] } ({ @Path[$M-1;$N-1].join(' -> ') })";
diff --git a/challenge-064/feng-chang/raku/ch-2.raku b/challenge-064/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..efc38f477e
--- /dev/null
+++ b/challenge-064/feng-chang/raku/ch-2.raku
@@ -0,0 +1,27 @@
+#!/bin/env raku
+
+wrapper('perlweeklychallenge', <weekly challenge perl>);
+wrapper('perlandraku', <python ruby haskell>);
+
+sub wrapper(Str:D $S, @W) {
+ my @w = @W.sort({ $^a.chars < $^b.chars });
+ my @res;
+
+ my Bool $found-match = False;
+ split-into($S, @w, @res);
+ say 'no match' unless $found-match;
+
+ sub split-into(Str:D $S, @W, @R) {
+ if $S eq '' {
+ say @R;
+ $found-match = True;
+ return;
+ }
+
+ for @W -> Str $word {
+ next unless $S.starts-with($word);
+
+ split-into($S.subst(/^$word/), @W, @R.push($word));
+ }
+ }
+}
diff --git a/challenge-072/feng-chang/raku/ch-1a.raku b/challenge-072/feng-chang/raku/ch-1a.raku
new file mode 100755
index 0000000000..5701a8172e
--- /dev/null
+++ b/challenge-072/feng-chang/raku/ch-1a.raku
@@ -0,0 +1,14 @@
+#!/bin/env raku
+
+# it all comes down to how many factors of 5 you have in N!
+sub MAIN(UInt $N) {
+ my UInt $cnt = 0;
+ my UInt $f5s = 5;
+
+ while $f5s <= $N {
+ $cnt += $N div $f5s;
+ $f5s *= 5;
+ }
+
+ say "{$N}! has $cnt trailing zeros";
+}
diff --git a/challenge-072/feng-chang/raku/ch-1b.raku b/challenge-072/feng-chang/raku/ch-1b.raku
new file mode 100755
index 0000000000..10e8277d34
--- /dev/null
+++ b/challenge-072/feng-chang/raku/ch-1b.raku
@@ -0,0 +1,5 @@
+#!/bin/env raku
+
+sub MAIN(UInt $N) {
+ say "{$N}! has { (([*] 1..$N) ~~ /(0*$)/).chars } trailing zeros";
+}
diff --git a/challenge-074/feng-chang/raku/ch-1.raku b/challenge-074/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..63316f8ca0
--- /dev/null
+++ b/challenge-074/feng-chang/raku/ch-1.raku
@@ -0,0 +1,19 @@
+#!/bin/env raku
+
+sub me(Int:D @a) {
+ my %cnts;
+ @a.map:{ ++%cnts{ $_ } };
+
+ my Bool $got-one = False;
+ for %cnts.keys -> $k {
+ if %cnts{ $k } > @a.elems / 2 {
+ say $k;
+ $got-one = True;
+ last;
+ }
+ }
+ say -1 unless $got-one;
+}
+
+me(my Int @ = 1, 2, 2, 3, 2, 4, 2);
+me(my Int @ = 1, 3, 1, 2, 4, 5);
diff --git a/challenge-075/feng-chang/raku/ch-1.raku b/challenge-075/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..2cfd88dfb6
--- /dev/null
+++ b/challenge-075/feng-chang/raku/ch-1.raku
@@ -0,0 +1,19 @@
+#!/bin/env raku
+
+sub coins-sum(Int:D @C, Int:D $S, Int:D @solution) {
+ { say @solution; return; } if $S == 0;
+ return if $S < @C[0];
+
+ my Int @coins = @C;
+ while @coins.elems > 0 {
+ my Int @Sol = @solution;
+ @Sol.push(@coins[0]);
+ coins-sum(@coins, $S - @coins[0], @Sol);
+
+ @coins.shift;
+ }
+}
+
+my Int @coins = 1, 2, 4;
+my Int @solution;
+coins-sum(@coins, 6, @solution);
diff --git a/challenge-075/feng-chang/raku/ch-2.raku b/challenge-075/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..b348d5350a
--- /dev/null
+++ b/challenge-075/feng-chang/raku/ch-2.raku
@@ -0,0 +1,13 @@
+#!/bin/env raku
+
+sub largest-rectangle-histogram(Int:D @A) {
+ print "[{@A}] -> ";
+ 0..@A.elems-1 X 0..@A.elems-1 ==>
+ grep { .[0] ≤ .[1] } ==>
+ map { min(|@A[.[0] .. .[1]]) * (.[1] - .[0] + 1) } ==>
+ max() ==>
+ say();
+}
+
+largest-rectangle-histogram(my Int @ = 2, 1, 4, 5, 3, 7);
+largest-rectangle-histogram(my Int @ = 3, 2, 3, 5, 7, 5);
diff --git a/challenge-077/feng-chang/raku/ch-1.raku b/challenge-077/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..18676223f9
--- /dev/null
+++ b/challenge-077/feng-chang/raku/ch-1.raku
@@ -0,0 +1,29 @@
+#!/bin/env raku
+
+my Bool $found = False;
+my $Num;
+
+sub fib-sum(Int:D $N, @fibs, @num) {
+ if $N == 0 {
+ say "{ @num.join(' + ') } = $Num";
+ $found = True;
+ return;
+ }
+ return unless @fibs;
+ return if $N < @fibs[0];
+
+ my @F = @fibs;
+ my @N = @num;
+ @N.push(@F.shift);
+ fib-sum($N - @fibs[0], @F, @N);
+
+ fib-sum($N, @F, @num);
+}
+
+sub MAIN(Int:D $N) {
+ my Int @fibs = 1, 2, * + * ...^ * > $N;
+ $Num = $N;
+
+ fib-sum($N, @fibs, Array.new);
+ 0.say unless $found;
+}
diff --git a/challenge-077/feng-chang/raku/ch-2.raku b/challenge-077/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..b9fdf10332
--- /dev/null
+++ b/challenge-077/feng-chang/raku/ch-2.raku
@@ -0,0 +1,25 @@
+#!/bin/env raku
+
+my @a;
+
+for $*IN.lines -> $line {
+ @a.push($line.comb.Array.unshift('O').push('O'));
+}
+
+my UInt $rows = @a.elems;
+my UInt $width = @a[0].elems - 2;
+@a.unshift(['O' xx $width + 2]);;
+@a.push(['O' xx $width + 2]);;
+
+my UInt $cnt = 0;
+for 1..$rows -> $i {
+ for 1..$width -> $j {
+ my $junc = all(@a[$i-1;$j-1], @a[$i-1;$j], @a[$i-1;$j+1],
+ @a[$i;$j-1], @a[$i;$j+1],
+ @a[$i+1;$j-1], @a[$i+1;$j], @a[$i+1;$j+1]
+ );
+ ++$cnt if @a[$i;$j] eq 'X' and $junc eq 'O';
+ }
+}
+
+say $cnt;