diff options
| author | Mark A <andemark@a-iot1t.uch.ad.pvt> | 2021-08-22 06:30:32 -0600 |
|---|---|---|
| committer | Mark A <andemark@a-iot1t.uch.ad.pvt> | 2021-08-22 06:30:32 -0600 |
| commit | 7c67b3b4ed52d3aa51c712f1ac42d1d3e2a4db47 (patch) | |
| tree | aa7bb8ce299294e81bd6016f1874337e6bfe2e10 | |
| parent | 57d72cef9fa6fb0795c4cd315e61a73502d89bb7 (diff) | |
| download | perlweeklychallenge-club-7c67b3b4ed52d3aa51c712f1ac42d1d3e2a4db47.tar.gz perlweeklychallenge-club-7c67b3b4ed52d3aa51c712f1ac42d1d3e2a4db47.tar.bz2 perlweeklychallenge-club-7c67b3b4ed52d3aa51c712f1ac42d1d3e2a4db47.zip | |
Some improvements
| -rw-r--r-- | challenge-126/mark-anderson/raku/ch-1.raku | 52 | ||||
| -rw-r--r-- | challenge-126/mark-anderson/raku/ch-2.raku | 17 |
2 files changed, 52 insertions, 17 deletions
diff --git a/challenge-126/mark-anderson/raku/ch-1.raku b/challenge-126/mark-anderson/raku/ch-1.raku index c88fb4cf5b..6366bb830c 100644 --- a/challenge-126/mark-anderson/raku/ch-1.raku +++ b/challenge-126/mark-anderson/raku/ch-1.raku @@ -1,12 +1,54 @@ #!/usr/bin/env raku +# count-numbers uses the following algorithm. +# Example: The result of 9324 = 8*9^3 + 2*9^2 + 1*9^1 + 3*9^0 = 6006 + +# But first, adjust is called. +# Examples: 111 is converted to 99 +# 901 is converted to 900 +# 2731515 is converted to 2730999 +# A number with no 1s is unchanged + use Test; -plan 2; +plan 9; + +is count-numbers(1), 0; +is count-numbers(15), 8; +is count-numbers(25), 13; +is count-numbers(7777), 4920; +is count-numbers(12345), 6560; +is count-numbers(654321), 323847; +is count-numbers(1230456), 531440; +is count-numbers(9999999), 4782968; +is count-numbers(10**32), 3433683820292512484657849089280; -is count-numbers(15), 8; -is count-numbers(25), 13; +multi count-numbers($N where * == 1) { 0 } -sub count-numbers($N) +multi count-numbers($N is copy) { - + grep { not .contains: 1 }, 2..$N; + $N = adjust($N); + my @digits = $N.comb; + my $count; + + while @digits + { + my $d = @digits.shift; + next if $d == 0; + $count += ($d-1) * 9 ** @digits.elems; + } + + $count; +} + +sub adjust($N is copy) +{ + my @a = $N.split('1', 2); + + return $N if @a.elems == 1; # no 1s + + @a.tail = 0 ~ 9 x @a.tail.chars; + + return @a.tail.substr(1) unless @a.head; # first digit is 1 + + return @a.join; } diff --git a/challenge-126/mark-anderson/raku/ch-2.raku b/challenge-126/mark-anderson/raku/ch-2.raku index 75b2856b4c..c61e020976 100644 --- a/challenge-126/mark-anderson/raku/ch-2.raku +++ b/challenge-126/mark-anderson/raku/ch-2.raku @@ -17,23 +17,16 @@ sub MAIN($r, $c, $p) sub minesweeper(@m) { - my $rows = + @m; - my $cols = + @m.head; - - for ^$rows X ^$cols -> ($r, $c) + for ^@m X ^@m.head -> ($r, $c) { next if @m[$r;$c] eq 'x'; @m[$r;$c] = + .comb('x') given gather { - take @m[$r-1;$c] // '*'; # N - take @m[$r-1;$c+1] // '*'; # NE - take @m[$r;$c+1] // '*'; # E - take @m[$r+1;$c+1] // '*'; # SE - take @m[$r+1;$c] // '*'; # S - take @m[$r+1;$c-1] // '*'; # SW - take @m[$r;$c-1] // '*'; # W - take @m[$r-1;$c-1] // '*'; # NW + for [-1, 0, 1] X [-1, 0, 1] -> ($a, $b) + { + take @m[$r+$a;$c+$b] || '*'; + } } } |
