aboutsummaryrefslogtreecommitdiff
path: root/challenge-010/daniel-mita
diff options
context:
space:
mode:
authorDaniel Mita <mienaikage@gmail.com>2019-05-29 18:10:49 +0100
committerDaniel Mita <mienaikage@gmail.com>2019-05-29 18:10:49 +0100
commit606fb0027b1743c071a1ca7daa29a1981b01d8a2 (patch)
treea57ee6992c08209fef02ca0d2400d624556fabb5 /challenge-010/daniel-mita
parent93c3556567146a4521a86b0a9e0c3b201888626b (diff)
downloadperlweeklychallenge-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.p646
-rw-r--r--challenge-010/daniel-mita/perl6/ch-1.p656
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;
}