diff options
| author | Daniel Mita <mienaikage@gmail.com> | 2019-05-29 18:10:49 +0100 |
|---|---|---|
| committer | Daniel Mita <mienaikage@gmail.com> | 2019-05-29 18:10:49 +0100 |
| commit | 606fb0027b1743c071a1ca7daa29a1981b01d8a2 (patch) | |
| tree | a57ee6992c08209fef02ca0d2400d624556fabb5 /challenge-010/daniel-mita | |
| parent | 93c3556567146a4521a86b0a9e0c3b201888626b (diff) | |
| download | perlweeklychallenge-club-606fb0027b1743c071a1ca7daa29a1981b01d8a2.tar.gz perlweeklychallenge-club-606fb0027b1743c071a1ca7daa29a1981b01d8a2.tar.bz2 perlweeklychallenge-club-606fb0027b1743c071a1ca7daa29a1981b01d8a2.zip | |
Support numbers < 4 billion and add NYI for decode
Diffstat (limited to 'challenge-010/daniel-mita')
| -rw-r--r-- | challenge-010/daniel-mita/perl6/ch-1-arabic.p6 | 46 | ||||
| -rw-r--r-- | challenge-010/daniel-mita/perl6/ch-1.p6 | 56 |
2 files changed, 31 insertions, 71 deletions
diff --git a/challenge-010/daniel-mita/perl6/ch-1-arabic.p6 b/challenge-010/daniel-mita/perl6/ch-1-arabic.p6 deleted file mode 100644 index 3afc37f012..0000000000 --- a/challenge-010/daniel-mita/perl6/ch-1-arabic.p6 +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env perl6 -use v6; - -my %letters = ( 1, |( * X* 5, 10 ) … * ) Z=> 「IVXLCDM」.comb; - -sub MAIN ( - UInt:D $number where * < 4e6, #= A positive integer. - --> Nil -) { - when $number < 4000 { - say to-roman($number); - } - - say [~] gather { - for $number.comb.[0..*-4, *-3..*].pairs -> $pair { - given to-roman($pair.value.join) { - take $pair.key == 0 - ?? .comb.map(* ~ "\c[combining overline]").join.subst(/I̅ <![V̅X̅]>/, 'M', :g) - !! $_; - } - } - }; -} - -sub to-roman ( - UInt() $_ --> Str:D -) { - return [~] gather { - for .flip.comb.pairs.reverse { - when .value == 4 | 9 { - take [~] %letters{ 10 ** .key X* 1, .value + 1 }; - } - if .value ≥ 5 { - take %letters{ 10 ** .key * 5 }; - } - take %letters{ 10 ** .key } x .value % 5; - } - }; -} - -sub GENERATE-USAGE ( &main, |capture ) { - (capture[0] ~~ UInt && capture[0] ≥ 4e6 - ?? "Error:\n Numbers ≥ 4,000,000 not supported.\n\n" - !! '') - ~ $*USAGE; -} diff --git a/challenge-010/daniel-mita/perl6/ch-1.p6 b/challenge-010/daniel-mita/perl6/ch-1.p6 index d4ac898da0..27989b4f2b 100644 --- a/challenge-010/daniel-mita/perl6/ch-1.p6 +++ b/challenge-010/daniel-mita/perl6/ch-1.p6 @@ -1,46 +1,52 @@ #!/usr/bin/env perl6 use v6; -my %letters = ( Ⅰ, |( * X* Ⅴ, Ⅹ ) … * ) Z=> 「IVXLCDM」.comb; +my constant @overlines = "\c[combining overline]", "\c[combining double overline]"; -sub MAIN ( - UInt:D $number where * < Ⅳ * Ⅹ**Ⅵ, #= A positive integer. +my constant %letters = ( 1, |( * X* 5, 10 ) … ∞ ) Z=> + 'I', |('', |@overlines XR~ 「VXLCDM」.comb ); + +my constant %prefixes = %letters{ 10 X** 3, 6 } Z=> ( %letters<1> X~ @overlines ); + +multi MAIN ( + UInt:D $number where 0 < * < 4e9, #= A positive integer. --> Nil ) { - when $number < Ⅳ * Ⅿ { - say to-roman($number); - } + say to-roman($number); +} - say [~] gather { - for $number.comb.[*-*..*-Ⅳ, *-Ⅲ..*].pairs -> $pair { - given to-roman($pair.value.join) { - take $pair.key < Ⅰ - ?? .comb.map(* ~ "\c[combining overline]").join.subst(/I̅ <![V̅X̅]>/, 'M', :g) - !! $_; - } - } - }; +#| Not Yet Implemented +multi MAIN ( + Str:D $roman-numerals + where *.uc.comb ⊆ (%letters, %prefixes).map(*.values).flat, #= A string of roman numerals. + --> Nil +) { + say &?ROUTINE.WHY; } sub to-roman ( - UInt() $_ --> Str:D -) { + UInt() $_, + --> Str:D +){ return [~] gather { for .flip.comb.pairs.reverse { - when .value == Ⅳ | Ⅸ { - take [~] %letters{ Ⅹ ** .key X* Ⅰ, .value + Ⅰ }; - } - if .value ≥ Ⅴ { - take %letters{ Ⅹ ** .key * Ⅴ }; + given 10 ** .key -> $key { + when .value == 4 | 9 { + take %prefixes{ %letters{$key} } || %letters{$key}; + take %letters{ $key * (.value + 1) }; + } + if .value ≥ 5 { + take %letters{ $key * 5 }; + } + take %letters{ $key } x .value % 5; } - take %letters{ Ⅹ ** .key } x .value % Ⅴ; } }; } sub GENERATE-USAGE ( &main, |capture ) { - (capture.first ~~ UInt && capture.first ≥ Ⅳ × Ⅹ**Ⅵ - ?? "Error:\n Numbers > M̅M̅M̅C̅M̅X̅C̅I̅X̅CMXCIX not supported.\n\n" + (capture[0] ~~ UInt && capture[0] ≥ 4e9 + ?? "Error:\n Numbers ≥ 4,000,000,000 not supported.\n\n" !! '') ~ $*USAGE; } |
