aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-04-28 20:40:40 +0100
committerGitHub <noreply@github.com>2020-04-28 20:40:40 +0100
commitc98b60002de07e5f7f3afa0d60ef27f8eab5d33b (patch)
tree5506d710d87aacdc8521032a2c60364a1b6b7ead
parent340eaae418d13fdb3ee501f9144f18c681d84692 (diff)
parent545b14d59ee9b8066de64bfc441081062cbf7469 (diff)
downloadperlweeklychallenge-club-c98b60002de07e5f7f3afa0d60ef27f8eab5d33b.tar.gz
perlweeklychallenge-club-c98b60002de07e5f7f3afa0d60ef27f8eab5d33b.tar.bz2
perlweeklychallenge-club-c98b60002de07e5f7f3afa0d60ef27f8eab5d33b.zip
Merge pull request #1647 from andemark/branch-for-challenge-058
Challenge 58 Solutions
-rw-r--r--challenge-058/mark-anderson/raku/ch-1.p689
-rw-r--r--challenge-058/mark-anderson/raku/ch-2.p62
2 files changed, 90 insertions, 1 deletions
diff --git a/challenge-058/mark-anderson/raku/ch-1.p6 b/challenge-058/mark-anderson/raku/ch-1.p6
new file mode 100644
index 0000000000..c92494f3ff
--- /dev/null
+++ b/challenge-058/mark-anderson/raku/ch-1.p6
@@ -0,0 +1,89 @@
+#!/usr/bin/env raku
+
+use Test;
+
+# Leading zeroes are ignored.
+
+multi sub MAIN {
+ for <<
+
+ #example tests
+ 0.1 < 1.1 -1
+ 2.0 > 1.2 1
+ 1.2 < 1.2_5 -1
+ 1.2.1 > 1.2_1 1
+ 1.2.1 = 1.2.1 0
+
+ #more tests
+ 1.2.1 < 1.11.1 -1
+ 1.2_2 < 1.2_11 -1
+ 001.2_3 = 1.2_03 0
+ 1.0 < 10 -1
+
+ >> -> $str1, $sign, $str2, $result {
+
+ ok compare($str1, $str2) == $result,
+ sprintf "%8s %s %-8s %2s\n", $str1, $sign, $str2, $result;
+ }
+
+ done-testing;
+}
+
+multi sub MAIN (*@args where (.elems == 2 and .all ~~ /^ [\d+]+ % <[._]> $/)) {
+ my %sign = 0 => "=",
+ -1 => "<",
+ 1 => ">";
+
+ my $result = compare(@args[0], @args[1]);
+
+ printf "%s %3s\n", "@args[0] %sign{$result} @args[1]", $result;
+}
+
+sub compare(Str $str1, Str $str2) {
+ my @str1 = $str1.comb(/\d+|\.|_/);
+ my @str2 = $str2.comb(/\d+|\.|_/);
+
+ my @elems = @str1 Z @str2;
+
+ my $result;
+
+ for @elems -> ($e1, $e2) {
+ $result = compare_elems($e1, $e2);
+ last unless $result == 0;
+ }
+
+ if $result == 0 {
+ if @str1 > @str2 { $result = 1 }
+ if @str1 < @str2 { $result = -1 }
+ }
+
+ $result;
+}
+
+sub compare_elems(Str $e1, Str $e2) {
+ given $e1 {
+ when /\d+/ {
+ given $e2 {
+ when /\d+/ { +($e1.subst(/^0+(\d+)$/, { $0 })
+ <=>
+ $e2.subst(/^0+(\d+)$/, { $0 })) }
+ when "." { 1 }
+ when "_" { 1 }
+ }
+ }
+ when "." {
+ given $e2 {
+ when /\d+/ { -1 }
+ when "." { 0 }
+ when "_" { 1 }
+ }
+ }
+ when "_" {
+ given $e2 {
+ when /\d+/ { -1 }
+ when "." { -1 }
+ when "_" { 0 }
+ }
+ }
+ }
+}
diff --git a/challenge-058/mark-anderson/raku/ch-2.p6 b/challenge-058/mark-anderson/raku/ch-2.p6
index 4478b41e9f..8038afc82d 100644
--- a/challenge-058/mark-anderson/raku/ch-2.p6
+++ b/challenge-058/mark-anderson/raku/ch-2.p6
@@ -15,7 +15,7 @@ my @A = (@H Z @T).sort;
my @Ans;
while @A.pop -> ($h, $t) {
- @Ans = |@Ans[0 .. $t-1], ($h, $t), |@Ans[$t .. *-1];
+ @Ans.splice($t, 0, [$($h, $t)]);
}
say @Ans.map(*[0]).rotor(16).join("\n");