aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-259/peter-meszaros/perl/ch-1.pl61
-rwxr-xr-xchallenge-259/peter-meszaros/perl/ch-2.pl99
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;
+