From e4550b603e1bcfe010180e46645f2bda1d5cb797 Mon Sep 17 00:00:00 2001 From: Daniel Mita Date: Wed, 29 May 2019 23:46:19 +0100 Subject: Add concurrent bruteforce roman decoder --- challenge-010/daniel-mita/perl6/ch-1.p6 | 45 ++++++++++++++++++++++++++------- 1 file 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..82b3fc3500 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 ~~ / ^ ( @(@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; } } }; -- cgit From d477193d025f9a0ec4df03c1d35e5a5f63e26cb7 Mon Sep 17 00:00:00 2001 From: Daniel Mita Date: Thu, 30 May 2019 09:02:29 +0100 Subject: Add .uc method to roman-numerals string --- challenge-010/daniel-mita/perl6/ch-1.p6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-010/daniel-mita/perl6/ch-1.p6 b/challenge-010/daniel-mita/perl6/ch-1.p6 index 82b3fc3500..7a12b34226 100644 --- a/challenge-010/daniel-mita/perl6/ch-1.p6 +++ b/challenge-010/daniel-mita/perl6/ch-1.p6 @@ -32,7 +32,7 @@ multi MAIN ( --> Nil ) { given |( @overlines.map(@letters X~ *).reverse ), @letters -> @set { - $roman-numerals ~~ / ^ ( @(@set[0])+ )? ( @(@set[1])+ )? ( @(@set[2])+ )? $ /; + $roman-numerals.uc ~~ / ^ ( @(@set[0])+ )? ( @(@set[1])+ )? ( @(@set[2])+ )? $ /; } if $/ { -- cgit