diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-09-07 17:44:29 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-07 17:44:29 +0100 |
| commit | dcae10f2bd7759010355c8151496d27e1c0441a1 (patch) | |
| tree | 5c63562e360ed00978bc6510216d2638c8844778 | |
| parent | 4c6b8646adf507542fe2cf636af57d9032e597a3 (diff) | |
| parent | 1ec534344090149ac3944e320df6d639172d9d7c (diff) | |
| download | perlweeklychallenge-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/README | 1 | ||||
| -rwxr-xr-x | challenge-009/feng-chang/perl5/ch-1.pl | 16 | ||||
| -rwxr-xr-x | challenge-009/feng-chang/perl6/ch-1-one-liner.p6 | 4 | ||||
| -rwxr-xr-x | challenge-009/feng-chang/perl6/ch-1.p6 | 8 | ||||
| -rw-r--r-- | challenge-013/feng-chang/.gitignore | 1 | ||||
| -rwxr-xr-x | challenge-013/feng-chang/perl6/ch-1.p6 | 13 | ||||
| -rwxr-xr-x | challenge-013/feng-chang/perl6/ch-2.p6 | 12 | ||||
| -rwxr-xr-x | challenge-064/feng-chang/raku/ch-1.raku | 34 | ||||
| -rwxr-xr-x | challenge-064/feng-chang/raku/ch-2.raku | 27 | ||||
| -rwxr-xr-x | challenge-072/feng-chang/raku/ch-1a.raku | 14 | ||||
| -rwxr-xr-x | challenge-072/feng-chang/raku/ch-1b.raku | 5 | ||||
| -rwxr-xr-x | challenge-074/feng-chang/raku/ch-1.raku | 19 | ||||
| -rwxr-xr-x | challenge-075/feng-chang/raku/ch-1.raku | 19 | ||||
| -rwxr-xr-x | challenge-075/feng-chang/raku/ch-2.raku | 13 | ||||
| -rwxr-xr-x | challenge-077/feng-chang/raku/ch-1.raku | 29 | ||||
| -rwxr-xr-x | challenge-077/feng-chang/raku/ch-2.raku | 25 |
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; |
