diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2024-03-05 12:09:08 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-05 12:09:08 +0000 |
| commit | bc6ebc2e0d058fdfcfd1286fb6e01e8102391981 (patch) | |
| tree | 2a9c0bfd938dd57e2d81e1e86cb522d262801fba | |
| parent | 934152a2c2fd30e63f23ff7671692349fcac308e (diff) | |
| parent | 2a270a0cc8050e78a0e947bed021699e1fe435cd (diff) | |
| download | perlweeklychallenge-club-bc6ebc2e0d058fdfcfd1286fb6e01e8102391981.tar.gz perlweeklychallenge-club-bc6ebc2e0d058fdfcfd1286fb6e01e8102391981.tar.bz2 perlweeklychallenge-club-bc6ebc2e0d058fdfcfd1286fb6e01e8102391981.zip | |
Merge pull request #9695 from pme/challenge-259
challenge-259
| -rwxr-xr-x | challenge-259/peter-meszaros/perl/ch-1.pl | 61 | ||||
| -rwxr-xr-x | challenge-259/peter-meszaros/perl/ch-2.pl | 99 |
2 files changed, 160 insertions, 0 deletions
diff --git a/challenge-259/peter-meszaros/perl/ch-1.pl b/challenge-259/peter-meszaros/perl/ch-1.pl new file mode 100755 index 0000000000..3e16d87eb9 --- /dev/null +++ b/challenge-259/peter-meszaros/perl/ch-1.pl @@ -0,0 +1,61 @@ +#!/usr/bin/env perl +# +# You are given a start date and offset counter. Optionally you also get bank +# holiday date list. +# +# Given a number (of days) and a start date, return the number (of days) +# adjusted to take into account non-banking days. In other words: convert a +# banking day offset to a calendar day offset. +# +# Non-banking days are: +# +# a) Weekends +# b) Bank holidays +# +# Example 1 +# +# Input: $start_date = '2018-06-28', $offset = 3, $bank_holidays = ['2018-07-03'] +# Output: '2018-07-04' +# +# Thursday bumped to Wednesday (3 day offset, with Monday a bank holiday) +# +# Example 2 +# +# Input: $start_date = '2018-06-28', $offset = 3 +# Output: '2018-07-03' +# + +use strict; +use warnings; +use Test2::V0 -no_srand => 1; +use Data::Dumper; +use Date::Calc qw/Add_Delta_Days Day_of_Week/; + +my $cases = [ + [ '2018-06-28', 3, ['2018-07-03']], + [ '2018-06-28', 3], +]; + +sub banking_day_offset +{ + my $date = $_[0]->[0]; + my $offset = $_[0]->[1]; + my $holidays = $_[0]->[2]; + + my %holidays = map { $_, 1 } @$holidays; + + my @date = split(/-/, $date); + + while ($offset > 0) { + @date = Add_Delta_Days(@date, 1); + my $dow = Day_of_Week(@date); + --$offset unless $dow == 6 or $dow == 7 or defined $holidays{sprintf("%04d-%02d-%02d", @date)}; + } + return sprintf("%04d-%02d-%02d", @date); +} + +is(banking_day_offset($cases->[0]), '2018-07-04', 'Example 1'); +is(banking_day_offset($cases->[1]), '2018-07-03', 'Example 2'); +done_testing(); + +exit 0; diff --git a/challenge-259/peter-meszaros/perl/ch-2.pl b/challenge-259/peter-meszaros/perl/ch-2.pl new file mode 100755 index 0000000000..190476a03a --- /dev/null +++ b/challenge-259/peter-meszaros/perl/ch-2.pl @@ -0,0 +1,99 @@ +#!/usr/bin/env perl +# +# You are given a line like below: +# +# {% id field1="value1" field2="value2" field3=42 %} +# +# Where +# +# a) "id" can be \w+. +# b) There can be 0 or more field-value pairs. +# c) The name of the fields are \w+. +# b) The values are either number in which case we don't need double quotes or +# string in which case we need double quotes around them. +# +# The line parser should return structure like below: +# { +# name => id, +# fields => { +# field1 => value1, +# field2 => value2, +# field3 => value3, +# } +# } +# +# It should be able to parse the following edge cases too: +# {% youtube title="Title \"quoted\" done" %} +# and +# {% youtube title="Title with escaped backslash \\" %} +# +# BONUS: Extend it to be able to handle multiline tags: +# +# {% id filed1="value1" ... %} +# LINES +# {% endid %} +# +# You should expect the following structure from your line parser: +# { +# name => id, +# fields => { +# field1 => value1, +# field2 => value2, +# field3 => value3, +# } +# text => LINES +# } +# + +use strict; +use warnings; +use Test2::V0 -no_srand => 1; +use Data::Dumper; + +my $cases = [ + q/{% id field1="value1" field2="value2" field3=42 %}/, + q/{% id field1="value1" field2="va \"xxx\" lue2" field3=42 %}/, + q/{% %}/, +]; + +sub line_parser +{ + my $row = shift; + + my $href = {}; + + $row =~ /\{%\s*(\w+)/; + return undef unless $1; + + $href->{name} = $1; + + $row =~ s/\\"/\034/g; + while ($row =~ /([\w\d]+)="?(\d+|[\w\034\s]+)"?/cg) { + my $f = $1; + my $v = $2; + $v =~ s/\034/"/g; + $href->{fields}->{$f} = $v; + } + + return $href; +} + +is(line_parser($cases->[0]), { name => 'id', + fields => { + field1 => 'value1', + field2 => 'value2', + field3 => 42, + } + }, 'Example 1'); +is(line_parser($cases->[1]), { name => 'id', + fields => { + field1 => 'value1', + field2 => 'va "xxx" lue2', + field3 => 42, + } + }, 'Example 2'); +is(line_parser($cases->[2]), undef, 'Example 3'); +done_testing(); + +exit 0; + |
