From 545b14d59ee9b8066de64bfc441081062cbf7469 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 28 Apr 2020 13:16:53 -0600 Subject: Challenge 58 Solutions --- challenge-058/mark-anderson/raku/ch-1.p6 | 89 ++++++++++++++++++++++++++++++++ challenge-058/mark-anderson/raku/ch-2.p6 | 2 +- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 challenge-058/mark-anderson/raku/ch-1.p6 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"); -- cgit