diff options
| author | 冯昶 <seaker@qq.com> | 2020-09-21 15:50:45 +0800 |
|---|---|---|
| committer | 冯昶 <seaker@qq.com> | 2020-09-21 15:50:45 +0800 |
| commit | acbc30c04977af09ff3e93e74642e325ea1e7083 (patch) | |
| tree | 67fecb4fb03ba8beb15f2bcdc95d8ef064ac3508 | |
| parent | bca0c362c212fc0dadc5ed7d9a5e4fa1aece4bfb (diff) | |
| download | perlweeklychallenge-club-acbc30c04977af09ff3e93e74642e325ea1e7083.tar.gz perlweeklychallenge-club-acbc30c04977af09ff3e93e74642e325ea1e7083.tar.bz2 perlweeklychallenge-club-acbc30c04977af09ff3e93e74642e325ea1e7083.zip | |
challeng#079, raku solutions
| -rwxr-xr-x | challenge-076/feng-chang/raku/ch-1.raku | 13 | ||||
| -rwxr-xr-x | challenge-077/feng-chang/raku/ch-1.raku | 13 | ||||
| -rwxr-xr-x | challenge-077/feng-chang/raku/ch-2.raku | 18 | ||||
| -rw-r--r-- | challenge-077/feng-chang/raku/data-c2-01.txt | 3 | ||||
| -rw-r--r-- | challenge-077/feng-chang/raku/data-c2-02.txt | 4 | ||||
| -rwxr-xr-x | challenge-079/feng-chang/raku/ch-1.raku | 6 | ||||
| -rwxr-xr-x | challenge-079/feng-chang/raku/ch-2.raku | 23 |
7 files changed, 66 insertions, 14 deletions
diff --git a/challenge-076/feng-chang/raku/ch-1.raku b/challenge-076/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..6b039c80e9 --- /dev/null +++ b/challenge-076/feng-chang/raku/ch-1.raku @@ -0,0 +1,13 @@ +#!/bin/env raku + +my Int @primes = (2..∞).grep: *.is-prime; + +sub sum-of-primes(Int:D $N, Int:D $pi, Int:D $cnt --> Num) { + when $N < @primes[$pi] { Inf } + when $N.is-prime { (1 + $cnt).Num } + min(sum-of-primes($N - @primes[$pi], $pi, $cnt + 1), + sum-of-primes($N, $pi + 1, $cnt) + ); +} + +say "$_:\t{sum-of-primes($_, 0, 0)}" for 2..30; diff --git a/challenge-077/feng-chang/raku/ch-1.raku b/challenge-077/feng-chang/raku/ch-1.raku index 18676223f9..053b739a43 100755 --- a/challenge-077/feng-chang/raku/ch-1.raku +++ b/challenge-077/feng-chang/raku/ch-1.raku @@ -3,26 +3,29 @@ my Bool $found = False; my $Num; +# $N: = (intial N) - @num.sum +# @fibs: fibonacci numbers as candidates +# @num: solution 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]; + return unless @fibs; # all fibonacci numbers are exhausted + return if $N < @fibs[0]; # impossible to find a solution my @F = @fibs; my @N = @num; @N.push(@F.shift); - fib-sum($N - @fibs[0], @F, @N); + fib-sum($N - @fibs[0], @F, @N); # try all possibilities that includes current candidate - fib-sum($N, @F, @num); + fib-sum($N, @F, @num); # try all possibilities that excludes current candidate } sub MAIN(Int:D $N) { my Int @fibs = 1, 2, * + * ...^ * > $N; - $Num = $N; + $Num = $N; # remember the initial 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 index b9fdf10332..04c51308ff 100755 --- a/challenge-077/feng-chang/raku/ch-2.raku +++ b/challenge-077/feng-chang/raku/ch-2.raku @@ -1,7 +1,8 @@ #!/bin/env raku +# read input and surround matrix with O's +# e.g.: ./ch-2.raku < data-c2-01.txt my @a; - for $*IN.lines -> $line { @a.push($line.comb.Array.unshift('O').push('O')); } @@ -11,15 +12,14 @@ my UInt $width = @a[0].elems - 2; @a.unshift(['O' xx $width + 2]);; @a.push(['O' xx $width + 2]);; +# count lonely X's 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'; - } +for 1..$rows X 1..$width -> ($i, $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; diff --git a/challenge-077/feng-chang/raku/data-c2-01.txt b/challenge-077/feng-chang/raku/data-c2-01.txt new file mode 100644 index 0000000000..32e25b69b9 --- /dev/null +++ b/challenge-077/feng-chang/raku/data-c2-01.txt @@ -0,0 +1,3 @@ +OOX +XOO +XOO diff --git a/challenge-077/feng-chang/raku/data-c2-02.txt b/challenge-077/feng-chang/raku/data-c2-02.txt new file mode 100644 index 0000000000..600d69c9a9 --- /dev/null +++ b/challenge-077/feng-chang/raku/data-c2-02.txt @@ -0,0 +1,4 @@ +OOXO +XOOO +XOOX +OXOO diff --git a/challenge-079/feng-chang/raku/ch-1.raku b/challenge-079/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..e1c93acede --- /dev/null +++ b/challenge-079/feng-chang/raku/ch-1.raku @@ -0,0 +1,6 @@ +#!/bin/env raku + +sub MAIN(UInt:D $N) { + my UInt $total = (1..$N).map({ $_.base(2).comb.sum }).sum; + say "{ $total } % 1000000007 = { $total % 1000000007 }"; +} diff --git a/challenge-079/feng-chang/raku/ch-2.raku b/challenge-079/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..6bd9822e50 --- /dev/null +++ b/challenge-079/feng-chang/raku/ch-2.raku @@ -0,0 +1,23 @@ +#!/bin/env raku + +sub trapped-drops(@N) returns UInt { + my UInt $cnt; + + repeat { + @N.shift while @N.elems > 0 and @N[0] ≤ 0; + @N.pop while @N.elems > 0 and @N[*-1] ≤ 0; + last if @N.elems < 3; + + my $height = min(@N[0, *-1]); + for 0..^@N.elems -> $i { + my $drop = max(0, $height - @N[$i]); + $cnt += $drop; + @N[$i] += $drop - $height; + } + } while @N.elems > 2; + + $cnt; +} + +say trapped-drops(Array.new(2, 1, 4, 1, 2, 5)); +say trapped-drops(Array.new(3, 1, 3, 1, 1, 5)); |
