diff options
| author | rir <rirans@comcast.net> | 2023-07-27 11:06:58 -0400 |
|---|---|---|
| committer | rir <rirans@comcast.net> | 2023-07-27 11:10:58 -0400 |
| commit | 3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec (patch) | |
| tree | 27ba3382586b1e42ddf9d481aab0898e99fd54be /challenge-227/0rir | |
| parent | f84f38be0e67c61c44fa0769b00e53124d1bdde0 (diff) | |
| download | perlweeklychallenge-club-3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec.tar.gz perlweeklychallenge-club-3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec.tar.bz2 perlweeklychallenge-club-3c3fe5f2916ed8ea6a1d93584b9ab53223fadfec.zip | |
227
Diffstat (limited to 'challenge-227/0rir')
| -rwxr-xr-x | challenge-227/0rir/raku/ch-1.raku | 30 | ||||
| -rwxr-xr-x | challenge-227/0rir/raku/ch-2.raku | 97 |
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) + + |
