diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2024-03-04 17:11:00 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2024-03-04 17:11:00 +0000 |
| commit | 93e897d94b55160397eff52df0d0b59f1b00a861 (patch) | |
| tree | 3e633f461ce14aa21b0e3ed4d8bc046271e2c798 /challenge-259 | |
| parent | 4f13579a82fca95fac5f46cd2d7a6227de16c614 (diff) | |
| parent | 5554b0cb03ebcceaaaf2bc1c51af40527b19d15f (diff) | |
| download | perlweeklychallenge-club-93e897d94b55160397eff52df0d0b59f1b00a861.tar.gz perlweeklychallenge-club-93e897d94b55160397eff52df0d0b59f1b00a861.tar.bz2 perlweeklychallenge-club-93e897d94b55160397eff52df0d0b59f1b00a861.zip | |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'challenge-259')
| -rwxr-xr-x | challenge-259/feng-chang/raku/ch-1.raku | 16 | ||||
| -rwxr-xr-x | challenge-259/feng-chang/raku/ch-2.raku | 62 | ||||
| -rwxr-xr-x | challenge-259/feng-chang/raku/test.raku | 20 | ||||
| -rw-r--r-- | challenge-259/mark-anderson/raku/ch-1.raku | 25 |
4 files changed, 123 insertions, 0 deletions
diff --git a/challenge-259/feng-chang/raku/ch-1.raku b/challenge-259/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..4851785d14 --- /dev/null +++ b/challenge-259/feng-chang/raku/ch-1.raku @@ -0,0 +1,16 @@ +#!/bin/env raku + +subset DateStr of Str where *.Date; + +unit sub MAIN(DateStr:D $start, UInt:D $offset is copy, *@bank-holidays); + +my $day = $start.Date; + +while $offset { + ++$day; + next if $day.day-of-week == 6|7; + next if ~$day (elem) @bank-holidays; + --$offset; +} + +put $day; diff --git a/challenge-259/feng-chang/raku/ch-2.raku b/challenge-259/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..c8d7a15ee6 --- /dev/null +++ b/challenge-259/feng-chang/raku/ch-2.raku @@ -0,0 +1,62 @@ +#!/bin/env raku + +grammar Line { + rule TOP { '{%' <Name> <Field>* '%}' [<Text> '{%' 'endid' '%}']? } + token Name { \w+ } + rule Field { <Name> '=' <Value> } + rule Value { \d+ || '"' <Chars> '"' } + token Chars { ["\\\\" | '\"' | <-["]>]+ } + rule Text { .+? } +} + +class LineActions { + method TOP($/) { + make ( + :name($<Name>.made), + :fields(($<Field>ยป.made).Hash), + (:text($<Text>.made) with $<Text>) + ).Hash + } + method Name($/) { make ~$/ } + method Field($/) { make $<Name>.made => $<Value>.made } + method Value($/) { + with $<Chars> { + make $<Chars>.made + } else { + make +$/ + } + } + method Chars($/) { make ~$/ } + method Text($/) { make (~$/).trim } +} + +multi sub MAIN('test') { + use Test; + + is Line.parse('abc', :rule<Chars>, :actions(LineActions)).made, 'abc', '"abc" parsed as Chars'; + is Line.parse('ab c ', :rule<Chars>, :actions(LineActions)).made, 'ab c ', '"ab c " parsed as Chars'; + is Line.parse('ab \"c ', :rule<Chars>, :actions(LineActions)).made, 'ab \"c ', '"ab \"c " parsed as Chars'; + + is-deeply Line.parse('{% id field1="value1" field2="value2" field3=42 %}', :actions(LineActions)).made, + (:name("id"), :fields((:field1("value1"), :field2("value2"), :field3(42)).Hash)).Hash, + q/{% id field1="value1" field2="value2" field3=42 %} => {name => id, fields => {field1 => value1, field2 => value2, field3 => 42}}/; + + is-deeply Line.parse('{% youtube title="Title \"quoted\" done" %}', :actions(LineActions)).made, + (:name("youtube"), :fields((:title("Title \\\"quoted\\\" done")).Hash)).Hash, + q/{% youtube title="Title \"quoted\" done" %} => {name => youtube, fields => {title => Title \"quoted\" done}}/; + + my $s = q:to/END/; + {% id field1="value1" field2="value2" %} + LINES + {% endid %} + END + is-deeply Line.parse($s, :actions(LineActions)).made, + (:name("id"), :fields((:field1("value1"), :field2("value2")).Hash), :text("LINES")).Hash, + "... => \{name => id, fields => \{field1 => value1, field2 => value2\}, text => LINES\}"; + + done-testing; +} + +multi sub MAIN(Str:D $line) { + put Line.parse($line, :actions(LineActions)).made.gist; +} diff --git a/challenge-259/feng-chang/raku/test.raku b/challenge-259/feng-chang/raku/test.raku new file mode 100755 index 0000000000..ca696e666e --- /dev/null +++ b/challenge-259/feng-chang/raku/test.raku @@ -0,0 +1,20 @@ +#!/bin/env raku + +# The Weekly Challenge 259 +use Test; + +sub pwc-test(Str:D $script, Bool :$deeply? = False, *@input) { + my ($expect, $assertion) = @input.splice(*-2, 2); + my $p = run $script, |@input, :out; + if $deeply { + is-deeply $p.out.slurp(:close).chomp.words.Bag, $expect, $assertion; + } else { + is $p.out.slurp(:close).chomp, $expect, $assertion; + } +} + +# Task 1, Banking Day Offset +pwc-test './ch-1.raku', '2018-06-28', 3, <2018-07-03>, '2018-07-04', + 'Banking Day Offset: $start_date = "2018-06-28", $offset = 3, $bank_holidays = ["2018-07-03"] => "2018-07-04"'; +pwc-test './ch-1.raku', '2018-06-28', 3, '2018-07-03', + 'Banking Day Offset: $start_date = "2018-06-28", $offset = 3 => "2018-07-03"'; diff --git a/challenge-259/mark-anderson/raku/ch-1.raku b/challenge-259/mark-anderson/raku/ch-1.raku new file mode 100644 index 0000000000..26c0180e8e --- /dev/null +++ b/challenge-259/mark-anderson/raku/ch-1.raku @@ -0,0 +1,25 @@ +#!/usr/bin/env raku +use Test; + +is banking-day-offset('2018-06-28', 3), '2018-07-03'; +is banking-day-offset('2018-06-28', 3, ['2018-07-03']), '2018-07-04'; +is banking-day-offset('2018-06-30', 0), '2018-07-02'; +is banking-day-offset('2018-06-30', 8, ['2018-07-04', '2018-07-03']), '2018-07-16'; +is banking-day-offset('2018-07-02', 0), '2018-07-02'; +is banking-day-offset('2018-07-16', 4), '2018-07-20'; + +sub banking-day-offset($date is copy, $offset is copy, @holidays=[]) +{ + $date .= Date; + + loop + { + given $date++ + { + if all(.day-of-week ~~ 1..5, .yyyy-mm-dd !(elem) @holidays) + { + return .yyyy-mm-dd unless $offset-- + } + } + } +} |
