diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-08-23 13:49:55 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-23 13:49:55 +0100 |
| commit | 97de700060ab40624ae7f8c73a8e21535deda579 (patch) | |
| tree | 37f253aa34f87f50e55cee38f99ac72b4fe59036 | |
| parent | 6a2bfb87f57ececed07aaff17064d862f22b5ec1 (diff) | |
| parent | 3501c9c0a78d3510cc692e56dc279adb4d7a0ba1 (diff) | |
| download | perlweeklychallenge-club-97de700060ab40624ae7f8c73a8e21535deda579.tar.gz perlweeklychallenge-club-97de700060ab40624ae7f8c73a8e21535deda579.tar.bz2 perlweeklychallenge-club-97de700060ab40624ae7f8c73a8e21535deda579.zip | |
Merge pull request #6643 from andemark/branch-for-challenge-179
ch-1.raku
| -rw-r--r-- | challenge-179/mark-anderson/raku/ch-1.raku | 68 | ||||
| -rw-r--r-- | challenge-179/mark-anderson/raku/ch-2.raku | 17 |
2 files changed, 85 insertions, 0 deletions
diff --git a/challenge-179/mark-anderson/raku/ch-1.raku b/challenge-179/mark-anderson/raku/ch-1.raku new file mode 100644 index 0000000000..9f25e464ac --- /dev/null +++ b/challenge-179/mark-anderson/raku/ch-1.raku @@ -0,0 +1,68 @@ +#!/usr/bin/env raku +use Test; + +is ordinal(11), 'eleventh'; +is ordinal(62), 'sixty-second'; +is ordinal(99), 'ninety-ninth'; +is ordinal(100), 'one-hundredth'; +is ordinal(4320), 'four thousand, three-hundred-twentieth'; +is ordinal(11009029), 'eleven million, nine thousand, twenty-ninth'; + +multi ordinal($n where * ~~ UInt) +{ + ordinal(number2string($n)) +} + +multi ordinal($s) +{ + my $ord; + + my %h = :one('first'), :two('second'), :three('third'), :five('fifth'), + :eight('eighth'), :nine('ninth'), :twelve('twelfth'); + + my $m = $s ~~ / <[a..z]>+ $ /; + + given $m + { + when %h{$_}:exists { $ord = %h{$m} } + when .ends-with('y') { $ord = $m.subst(/ y $ /, 'ieth') } + default { $ord = $m ~ 'th' } + } + + $s.subst(/ $m $ /, $ord); +} + +sub number2string($num) +{ + my @n = $num.polymod(1000 xx *); + + my @lt-twenty = < one two three four five six seven eight nine ten eleven twelve + thirteen fourteen fifteen sixteen seventeen eighteen nineteen > andthen .unshift: ''; + + my @tens = < twenty thirty forty fifty sixty seventy eighty ninety > andthen .prepend: '', ''; + + my @magnitude = < thousand million billion trillion quadrillion quintillion > andthen .unshift: ''; + + return .reverse.join(', ') given gather for @n.kv -> $k, $v + { + given $v.chars + { + when 1 { take (@lt-twenty[$v] ~ ' ' ~ @magnitude[$k]).trim-trailing if $v } + when 2 { take (lt-hundred($v) ~ ' ' ~ @magnitude[$k]).trim-trailing } + default + { + my $h = @lt-twenty[$v.substr(0,1)] ~ '-hundred'; + my $t = lt-hundred($v.substr(1,2)); + take (not $t) ?? $h !! ($h ~ '-' ~ $t ~ ' ' ~ @magnitude[$k]).trim-trailing; + } + } + } + + sub lt-hundred($n) + { + return @lt-twenty[$n] if $n < 20; + my @d = $n.comb; + return @tens[@d[0]] unless +@d[1]; + return @tens[@d[0]] ~ '-' ~ @lt-twenty[@d[1]] + } +} diff --git a/challenge-179/mark-anderson/raku/ch-2.raku b/challenge-179/mark-anderson/raku/ch-2.raku new file mode 100644 index 0000000000..37e3b3a5d4 --- /dev/null +++ b/challenge-179/mark-anderson/raku/ch-2.raku @@ -0,0 +1,17 @@ +#!/usr/bin/env raku +use Test; + +is sparkline(2,4,6,8,10,12,14,16), '▁▂▃▄▅▆▇█'; + +sub sparkline(+$list) +{ + my @blocks = "\c[Lower One Eighth Block]" .. "\c[Full Block]"; + + return @blocks[ $list.map(&new-x) ].join; + + sub new-x($x) + { + # https://stackoverflow.com/a/47555593 + (7 * ($x - $list.min) / ($list.max - $list.min)).round + } +} |
