diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2024-03-05 12:12:24 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-05 12:12:24 +0000 |
| commit | 7a8545402b45caae224420ec9811914daa1a06ec (patch) | |
| tree | 9a5af4cf69613dddbc0d0e3a1d0bfce112657a99 | |
| parent | 152e8a0cc895f66aed5db82c00e89ed7b2272038 (diff) | |
| parent | a188681389c509987a2d113a8deaa06ce082b3e3 (diff) | |
| download | perlweeklychallenge-club-7a8545402b45caae224420ec9811914daa1a06ec.tar.gz perlweeklychallenge-club-7a8545402b45caae224420ec9811914daa1a06ec.tar.bz2 perlweeklychallenge-club-7a8545402b45caae224420ec9811914daa1a06ec.zip | |
Merge pull request #9699 from spadacciniweb/PWC-259
Add ch-1 in Perl, Go, Elixir, Python, Ruby
| -rw-r--r-- | challenge-259/spadacciniweb/elixir/ch-1.exs | 57 | ||||
| -rw-r--r-- | challenge-259/spadacciniweb/go/ch-1.go | 80 | ||||
| -rw-r--r-- | challenge-259/spadacciniweb/perl/ch-1.pl | 76 | ||||
| -rw-r--r-- | challenge-259/spadacciniweb/python/ch-1.py | 54 | ||||
| -rw-r--r-- | challenge-259/spadacciniweb/ruby/ch-1.rb | 56 |
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); |
