aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark A <andemark@a-iot1t.uch.ad.pvt>2021-08-22 06:30:32 -0600
committerMark A <andemark@a-iot1t.uch.ad.pvt>2021-08-22 06:30:32 -0600
commit7c67b3b4ed52d3aa51c712f1ac42d1d3e2a4db47 (patch)
treeaa7bb8ce299294e81bd6016f1874337e6bfe2e10
parent57d72cef9fa6fb0795c4cd315e61a73502d89bb7 (diff)
downloadperlweeklychallenge-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.raku52
-rw-r--r--challenge-126/mark-anderson/raku/ch-2.raku17
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] || '*';
+ }
}
}