aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-05-30 11:48:16 +0100
committerGitHub <noreply@github.com>2019-05-30 11:48:16 +0100
commitc16b022f0c7b084a54628a2ab8055cf7a4917b95 (patch)
tree89cf68b0ae569d8e4ab6e9e57033031bbf2880ef
parent9044249712c9391dd23ca1b5d8680871b4860080 (diff)
parentd477193d025f9a0ec4df03c1d35e5a5f63e26cb7 (diff)
downloadperlweeklychallenge-club-c16b022f0c7b084a54628a2ab8055cf7a4917b95.tar.gz
perlweeklychallenge-club-c16b022f0c7b084a54628a2ab8055cf7a4917b95.tar.bz2
perlweeklychallenge-club-c16b022f0c7b084a54628a2ab8055cf7a4917b95.zip
Merge pull request #192 from mienaikage/bruteforce
Add concurrent bruteforce roman decoder
-rw-r--r--challenge-010/daniel-mita/perl6/ch-1.p645
1 files changed, 36 insertions, 9 deletions
diff --git a/challenge-010/daniel-mita/perl6/ch-1.p6 b/challenge-010/daniel-mita/perl6/ch-1.p6
index 27989b4f2b..7a12b34226 100644
--- a/challenge-010/daniel-mita/perl6/ch-1.p6
+++ b/challenge-010/daniel-mita/perl6/ch-1.p6
@@ -1,12 +1,15 @@
#!/usr/bin/env perl6
use v6;
+my %*SUB-MAIN-OPTS = :named-anywhere;
+
+my constant @letters = 「IVXLCDM」.comb;
my constant @overlines = "\c[combining overline]", "\c[combining double overline]";
-my constant %letters = ( 1, |( * X* 5, 10 ) … ∞ ) Z=>
- 'I', |('', |@overlines XR~ 「VXLCDM」.comb );
+my constant %letter-map = ( 1, |( * X* 5, 10 ) … ∞ ) Z=>
+ |@letters, |( @overlines XR~ @letters[1..*] );
-my constant %prefixes = %letters{ 10 X** 3, 6 } Z=> ( %letters<1> X~ @overlines );
+my constant %prefixes = %letter-map{ 10 X** 3, 6 } Z=> ( %letter-map<1> X~ @overlines );
multi MAIN (
UInt:D $number where 0 < * < 4e9, #= A positive integer.
@@ -18,12 +21,36 @@ multi MAIN (
#| Not Yet Implemented
multi MAIN (
Str:D $roman-numerals
- where *.uc.comb ⊆ (%letters, %prefixes).map(*.values).flat, #= A string of roman numerals.
--> Nil
-) {
+) is hidden-from-USAGE {
say &?ROUTINE.WHY;
}
+multi MAIN (
+ Str:D $roman-numerals where *.chars > 0, #= A string of roman numerals.
+ Bool:D :bruteforce(:$b) where *.so, #= Convert using bruteforce method.
+ --> Nil
+) {
+ given |( @overlines.map(@letters X~ *).reverse ), @letters -> @set {
+ $roman-numerals.uc ~~ / ^ ( @(@set[0])+ )? ( @(@set[1])+ )? ( @(@set[2])+ )? $ /;
+ }
+
+ if $/ {
+ given await gather {
+ take Promise.start( { (1..^4000).race.map(* * 1e6).first(*.&to-roman eq $0) } ) if $0;
+ take Promise.start( { (1..^4000).race.map(* * 1e3).first(*.&to-roman eq $1) } ) if $1;
+ take Promise.start( { (1..^4000).race.first(*.&to-roman eq $2) } ) if $2;
+ } {
+ if .all.so && .sum.&to-roman eq $roman-numerals.uc {
+ .sum.say;
+ return;
+ }
+ }
+ }
+
+ say "Error:\n The input was not understood.\n\n" ~ $*USAGE;
+}
+
sub to-roman (
UInt() $_,
--> Str:D
@@ -32,13 +59,13 @@ sub to-roman (
for .flip.comb.pairs.reverse {
given 10 ** .key -> $key {
when .value == 4 | 9 {
- take %prefixes{ %letters{$key} } || %letters{$key};
- take %letters{ $key * (.value + 1) };
+ take %prefixes{ %letter-map{$key} } || %letter-map{$key};
+ take %letter-map{ $key * (.value + 1) };
}
if .value ≥ 5 {
- take %letters{ $key * 5 };
+ take %letter-map{ $key * 5 };
}
- take %letters{ $key } x .value % 5;
+ take %letter-map{ $key } x .value % 5;
}
}
};