aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariano Spadaccini <spadacciniweb@gmail.com>2024-03-05 12:17:12 +0100
committerMariano Spadaccini <spadacciniweb@gmail.com>2024-03-05 12:17:12 +0100
commita188681389c509987a2d113a8deaa06ce082b3e3 (patch)
tree6957af1e3f64f89b3a3339e7336660a58163e1ff
parentad381c1123e47114d3d98f1749f9f354eebafcdd (diff)
downloadperlweeklychallenge-club-a188681389c509987a2d113a8deaa06ce082b3e3.tar.gz
perlweeklychallenge-club-a188681389c509987a2d113a8deaa06ce082b3e3.tar.bz2
perlweeklychallenge-club-a188681389c509987a2d113a8deaa06ce082b3e3.zip
Add ch-1 in Perl, Go, Elixir, Python, Ruby
-rw-r--r--challenge-259/spadacciniweb/elixir/ch-1.exs57
-rw-r--r--challenge-259/spadacciniweb/go/ch-1.go80
-rw-r--r--challenge-259/spadacciniweb/perl/ch-1.pl76
-rw-r--r--challenge-259/spadacciniweb/python/ch-1.py54
-rw-r--r--challenge-259/spadacciniweb/ruby/ch-1.rb56
5 files changed, 323 insertions, 0 deletions
diff --git a/challenge-259/spadacciniweb/elixir/ch-1.exs b/challenge-259/spadacciniweb/elixir/ch-1.exs
new file mode 100644
index 0000000000..434545bfd9
--- /dev/null
+++ b/challenge-259/spadacciniweb/elixir/ch-1.exs
@@ -0,0 +1,57 @@
+# Task 1: Banking Day Offset
+# Submitted by: Lee Johnson
+#
+# 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'
+
+defmodule BankingDay do
+
+ def banking_day_offset(start_date, offset, bank_holidays) do
+ out(start_date, offset, bank_holidays,
+ next_working_day( Date.from_iso8601!(start_date), offset, bank_holidays)
+ )
+ end
+
+ def next_working_day(dt, offset, bank_holidays) when offset > 0 do
+ dt1 = Date.add(dt, 1)
+ if Date.day_of_week(dt1) >= 6 || Enum.member?(bank_holidays, "#{dt1}") do
+ next_working_day(dt1, offset, bank_holidays)
+ else
+ next_working_day(dt1, offset-1, bank_holidays)
+ end
+ end
+
+ def next_working_day(dt, 0, _bank_holidays) do
+ Date.to_iso8601(dt)
+ end
+
+ def out(start_date, offset, bank_holidays, ymd) do
+ IO.write( "(start #{start_date} offset #{offset} Bank holidays [" <> Enum.join(bank_holidays, ", ") <> "]) -> ")
+ IO.puts( ymd )
+ end
+end
+
+start_date = "2018-06-28"
+offset = 3
+bank_holidays = ["2018-07-03"]
+BankingDay.banking_day_offset(start_date, offset, bank_holidays)
+
+start_date = "2018-06-28"
+offset = 3
+bank_holidays = []
+BankingDay.banking_day_offset(start_date, offset, bank_holidays)
diff --git a/challenge-259/spadacciniweb/go/ch-1.go b/challenge-259/spadacciniweb/go/ch-1.go
new file mode 100644
index 0000000000..37446a936b
--- /dev/null
+++ b/challenge-259/spadacciniweb/go/ch-1.go
@@ -0,0 +1,80 @@
+/*
+Task 1: Banking Day Offset
+Submitted by: Lee Johnson
+
+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'
+*/
+
+package main
+
+import (
+ "fmt"
+ "log"
+ "strings"
+ "time"
+)
+
+func contains(s []string, str string) bool {
+ for _, v := range s {
+ if v == str {
+ return true
+ }
+ }
+ return false
+}
+
+func no_banking_day(t time.Time, bank_holidays []string) bool {
+ ymd := t.Format("2006-01-02")
+ if (t.Weekday() == 0 || t.Weekday() == 6 || contains(bank_holidays, ymd)) {
+ return true
+ }
+ return false
+}
+
+func banking_day_offset(start_date string, offset int, bank_holidays []string) {
+ t, err := time.Parse("2006-01-02", start_date)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for i := 1; i <= offset; i++ {
+ t = t.AddDate(0, 0, 1)
+ for no_banking_day(t, bank_holidays) {
+ t = t.AddDate(0, 0, 1)
+ }
+ }
+
+ fmt.Printf("start %s offset %d Bank holidays [%s]) -> %s\n",
+ start_date, offset,
+ strings.Join(bank_holidays, " "),
+ t.Format("2006-01-02"))
+}
+
+func main() {
+ start_date := "2018-06-28"
+ offset := 3;
+ bank_holidays := []string{"2018-07-03"}
+ banking_day_offset(start_date, offset, bank_holidays)
+
+ start_date = "2018-06-28"
+ offset = 3;
+ bank_holidays = []string{}
+ banking_day_offset(start_date, offset, bank_holidays)
+}
+
diff --git a/challenge-259/spadacciniweb/perl/ch-1.pl b/challenge-259/spadacciniweb/perl/ch-1.pl
new file mode 100644
index 0000000000..8f804849b6
--- /dev/null
+++ b/challenge-259/spadacciniweb/perl/ch-1.pl
@@ -0,0 +1,76 @@
+#!/usr/bin/env perl
+
+# Task 1: Banking Day Offset
+# Submitted by: Lee Johnson
+#
+# 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 DateTime;
+
+my $start_date = '2018-06-28';
+my $offset = 3;
+my $bank_holidays = ['2018-07-03'];
+banking_day_offset($start_date, $offset, $bank_holidays);
+
+$start_date = '2018-06-28';
+$offset = 3;
+$bank_holidays = [];
+banking_day_offset($start_date, $offset, $bank_holidays);
+
+exit 0;
+
+sub banking_day_offset {
+ my $start_date = shift;
+ my $offset = shift;
+ my $bank_holidays = shift;
+
+ my ($yyyy, $mm, $dd) = split /-/, $start_date;
+ my $dt = DateTime->new(
+ year => $yyyy,
+ month => $mm,
+ day => $dd
+ );
+
+ foreach (1..$offset) {
+ $dt->add( days => 1 );
+ while (no_banking_day($dt)) {
+ $dt->add( days => 1 );
+ }
+ }
+
+ printf "(start %s offset %s Bank holidays [%s]) -> %s\n",
+ $start_date,
+ $offset,
+ (join ' / ', @$bank_holidays ),
+ $dt->ymd;
+
+ return undef;
+}
+
+sub no_banking_day {
+ my $dt = shift;
+ my $ymd = $dt->ymd;
+ return 1
+ if $dt->day_of_week >= 6
+ ||
+ grep /$ymd/, @$bank_holidays;
+ return 0;
+}
diff --git a/challenge-259/spadacciniweb/python/ch-1.py b/challenge-259/spadacciniweb/python/ch-1.py
new file mode 100644
index 0000000000..23cedaa661
--- /dev/null
+++ b/challenge-259/spadacciniweb/python/ch-1.py
@@ -0,0 +1,54 @@
+# Task 1: Banking Day Offset
+# Submitted by: Lee Johnson
+#
+# 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'
+
+from dateutil.parser import *
+import datetime
+
+def banking_day_offset(start_date, offset, bank_holidays):
+ dt = parse(start_date, dayfirst = False, yearfirst = True)
+
+ for i in range(1,5):
+ dt += datetime.timedelta(days=1)
+ while no_banking_day(dt):
+ dt += datetime.timedelta(days=1)
+
+ print("(start %s offset %s Bank holidays [%s]) -> %s" %
+ (start_date, offset,
+ ' / '.join(bank_holidays),
+ dt.strftime('%Y-%m-%d')
+ )
+ )
+
+def no_banking_day(dt):
+ if (dt.weekday() >= 6) or (dt.strftime('%Y-%m-%d') in bank_holidays):
+ return 1
+ return 0
+
+if __name__ == "__main__":
+ start_date = '2018-06-28'
+ offset = 3
+ bank_holidays = ['2018-07-03']
+ banking_day_offset(start_date, offset, bank_holidays)
+
+ start_date = '2018-06-28';
+ offset = 3;
+ bank_holidays = [];
+ banking_day_offset(start_date, offset, bank_holidays)
diff --git a/challenge-259/spadacciniweb/ruby/ch-1.rb b/challenge-259/spadacciniweb/ruby/ch-1.rb
new file mode 100644
index 0000000000..b069356a52
--- /dev/null
+++ b/challenge-259/spadacciniweb/ruby/ch-1.rb
@@ -0,0 +1,56 @@
+# Task 1: Banking Day Offset
+# Submitted by: Lee Johnson
+#
+# 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'
+
+require 'date'
+
+def banking_day_offset(start_date, offset, bank_holidays)
+ dt = Date.strptime(start_date, '%Y-%m-%d')
+
+ (1..offset).each do |i|
+ dt += 1
+ while no_banking_day(dt, bank_holidays) == true
+ dt += 1
+ end
+ end
+
+ printf "(start %s offset %s Bank holidays [%s]) -> %s\n",
+ start_date,
+ offset,
+ bank_holidays.join(" / "),
+ dt.strftime('%Y-%m-%d');
+end
+
+def no_banking_day(dt, bank_holidays)
+ if dt.strftime("%u").to_i >= 6 or bank_holidays.include?( dt.strftime('%Y-%m-%d') )
+ return true
+ end
+ false
+end
+
+start_date = '2018-06-28'
+offset = 3
+bank_holidays = ['2018-07-03']
+banking_day_offset(start_date, offset, bank_holidays)
+
+start_date = '2018-06-28';
+offset = 3;
+bank_holidays = [];
+banking_day_offset(start_date, offset, bank_holidays);