diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-05-30 11:48:16 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-30 11:48:16 +0100 |
| commit | c16b022f0c7b084a54628a2ab8055cf7a4917b95 (patch) | |
| tree | 89cf68b0ae569d8e4ab6e9e57033031bbf2880ef | |
| parent | 9044249712c9391dd23ca1b5d8680871b4860080 (diff) | |
| parent | d477193d025f9a0ec4df03c1d35e5a5f63e26cb7 (diff) | |
| download | perlweeklychallenge-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.p6 | 45 |
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; } } }; |
