aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-08-23 13:49:55 +0100
committerGitHub <noreply@github.com>2022-08-23 13:49:55 +0100
commit97de700060ab40624ae7f8c73a8e21535deda579 (patch)
tree37f253aa34f87f50e55cee38f99ac72b4fe59036
parent6a2bfb87f57ececed07aaff17064d862f22b5ec1 (diff)
parent3501c9c0a78d3510cc692e56dc279adb4d7a0ba1 (diff)
downloadperlweeklychallenge-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.raku68
-rw-r--r--challenge-179/mark-anderson/raku/ch-2.raku17
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
+ }
+}