aboutsummaryrefslogtreecommitdiff
path: root/challenge-227/0rir
diff options
context:
space:
mode:
authorrir <rirans@comcast.net>2023-07-27 11:06:58 -0400
committerrir <rirans@comcast.net>2023-07-27 11:10:58 -0400
commit3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec (patch)
tree27ba3382586b1e42ddf9d481aab0898e99fd54be /challenge-227/0rir
parentf84f38be0e67c61c44fa0769b00e53124d1bdde0 (diff)
downloadperlweeklychallenge-club-3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec.tar.gz
perlweeklychallenge-club-3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec.tar.bz2
perlweeklychallenge-club-3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec.zip
227
Diffstat (limited to 'challenge-227/0rir')
-rwxr-xr-xchallenge-227/0rir/raku/ch-1.raku30
-rwxr-xr-xchallenge-227/0rir/raku/ch-2.raku97
2 files changed, 127 insertions, 0 deletions
diff --git a/challenge-227/0rir/raku/ch-1.raku b/challenge-227/0rir/raku/ch-1.raku
new file mode 100755
index 0000000000..34b3ef5294
--- /dev/null
+++ b/challenge-227/0rir/raku/ch-1.raku
@@ -0,0 +1,30 @@
+#!/usr/bin/env raku
+# :vim ft=raku sw=4 expandtab # 🦋 ∅∪∩∋∈∉ ≡ ≢ «␤ » ∴
+use v6.d;
+use Test;
+
+=begin comment
+227-1: Friday 13th Submitted by: Peter Campbell Smith
+
+Given a year number in the range 1753 to 9999, find how many dates in the
+year are Friday 13th, assume that the current Gregorian calendar applies.
+
+Example
+Input: $year = 2023
+Output: 2
+
+Since there are only 2 Friday 13th in the given year 2023 i.e. 13th Jan and 13th Oct.
+
+=end comment
+
+sub fri13ths-in-year( $year -->Int) {
+ my $ret;
+ for 1..12 -> $mo {
+ ++ $ret if Date.new( $year, $mo, 13).day-of-week == 5;
+ }
+ $ret;
+}
+
+my $year = 2026;
+say "Input: \$year = $year\n Output: ", fri13ths-in-year( $year);
+
diff --git a/challenge-227/0rir/raku/ch-2.raku b/challenge-227/0rir/raku/ch-2.raku
new file mode 100755
index 0000000000..267b722828
--- /dev/null
+++ b/challenge-227/0rir/raku/ch-2.raku
@@ -0,0 +1,97 @@
+#!/usr/bin/env raku
+# :vim ft=raku sw=4 expandtab # 🦋 ∅∪∩∋∈∉ ≡ ≢ «␤ » ∴
+use v6.d;
+use Test;
+
+constant \ROMAN-ZERO-MARKER = 'z';
+
+my @roman;
+my %roman;
+{ use Math::Roman;
+ @roman = gather for ^4000 { take ($_)R.Str }
+ @roman[0] = ROMAN-ZERO-MARKER;
+ %roman = @roman.antipairs;
+}
+
+grammar Roman {
+ rule TOP { ^ <expression> $ }
+ rule expression {
+ <lhs=.roman>
+ $<op>=( [ '+' | '-' | '*' | '×' | '/'| '÷' | '**' ] ) # ???
+ <rhs=.roman>
+ }
+ token roman { <[IVXLCDM]>+ <?{ %roman{$/} :exists or die 'ERRROMAN' }> }
+}
+
+class RomanCalc {
+ method TOP($/) { $/.make: @roman[ $/.<expression>.made ]; }
+
+ method expression($/) {
+ given $<op>.Str.trim { # ???
+ when '+' { $/.make: $/.<lhs>.made + $/.<rhs>.made }
+ when "-" { $/.make: $/.<lhs>.made - $/.<rhs>.made }
+ when '×' { $/.make: $/.<lhs>.made × $/.<rhs>.made }
+ when '*' { $/.make: $/.<lhs>.made × $/.<rhs>.made }
+ when '/' { $/.make: $/.<lhs>.made ÷ $/.<rhs>.made }
+ when '÷' { $/.make: $/.<lhs>.made ÷ $/.<rhs>.made }
+ when '**' { $/.make: $/.<lhs>.made ** $/.<rhs>.made }
+ default { die 'no match' }
+ }
+ }
+ method roman($/) { $/.make: %roman{$/.Str} }
+}
+
+my @Test =
+ "MMMCMXCIX - I", 'MMMCMXCVIII',
+ "IV + V", "IX",
+ "M - I", "CMXCIX",
+ "X / II", "V",
+ "XI * VI", "LXVI",
+ "VII ** III", "CCCXLIII",
+ "V - V", ROMAN-ZERO-MARKER,
+ "II ** II", "IV",
+ "II ** III", "VIII",
+ "II ** IV", "XVI",
+ "II ** V", "XXXII",
+ "II ** VI", "LXIV",
+ "II ** VII", "CXXVIII",
+ "II ** VIII", "CCLVI",
+ "II ** IX", "DXII",
+ "II ** X", "MXXIV",
+ "II ** XI", "MMXLVIII",
+;
+
+sub rocalc( Str $in -->Str) {
+ my $m = Roman.parse: $in, :actions(RomanCalc);
+ die "dying no match >" ~ $in ~ "<" unless $m;
+ $m.made;
+}
+
+plan @Test ÷ 2;
+
+for @Test -> $in, $exp {
+ is rocalc( $in), $exp, "$exp | %roman{$exp} <- $in" ;
+}
+
+print "\n";
+for @Test[0,2,4,6,8,10,12] -> $input {
+ printf "%-13s => %s\n", $input, rocalc( $input);
+}
+
+=finish
+277-2: Roman Maths Submitted by: Peter Campbell Smith
+Write a script to handle a 2-term arithmetic operation expressed in Roman
+numeral.
+
+Example
+IV + V => IX
+M - I => CMXCIX
+X / II => V
+XI * VI => LXVI
+VII ** III => CCCXLIII
+V - V => nulla (they knew about zero but didn't have a symbol)
+V / II => non potest (they didn't do fractions)
+MMM + M => non potest (they only went up to 3999)
+V - X => non potest (they didn't do negative numbers)
+
+