From f3c7eeb85c70bc713b5430bf863c4d695a92139e Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 20 Sep 2022 20:49:09 +0000 Subject: w183 - Task 1 --- challenge-183/perlboy1967/perl/ch-1.pl | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 challenge-183/perlboy1967/perl/ch-1.pl diff --git a/challenge-183/perlboy1967/perl/ch-1.pl b/challenge-183/perlboy1967/perl/ch-1.pl new file mode 100755 index 0000000000..a5df6bc3e3 --- /dev/null +++ b/challenge-183/perlboy1967/perl/ch-1.pl @@ -0,0 +1,62 @@ +#!/bin/perl + +=pod + +The Weekly Challenge - 183 + - https://theweeklychallenge.org/blog/perl-weekly-challenge-183/#TASK1 + +Author: Niels 'PerlBoy' van Dijke + +Task 1: Unique Array +Submitted by: Mohammad S Anwar + +You are given list of arrayrefs. + +Write a script to remove the duplicate arrayrefs from the given list. + +=cut + +use v5.16; +use warnings; + +use Test::More; +use Test::Deep qw(cmp_deeply); + +use Data::Compare; + +#################################################################### +# sub uuniq(@list) +# +# Description: Returns a unique list regardlessly list element types +# Name: Universal uniq => 'uuniq' +#################################################################### +sub uuniq (@) { + my @r; + map { + my $r = $_; + push(@r,$_) + if (!grep { Data::Compare::Compare($r,$_) } @r); + } @_; + return @r; +} + +# Simple 'uniq' +cmp_deeply([uuniq(1,2,3,4,5,4,3,2,1)], + [1,2,3,4,5]); +# Uniq list of lists +cmp_deeply([uuniq([1,2],[3,4],[5,6],[1,2])], + [[1,2],[3,4],[5,6]]); +cmp_deeply([uuniq([9,1],[3,7],[2,5],[2,5])], + [[9,1],[3,7],[2,5]]); +cmp_deeply([uuniq([1,2],[1,2,3],[1,2],[2,3])], + [[1,2],[1,2,3],[2,3]]); +# Uniq list of hashes +cmp_deeply([uuniq({a=>1},{b=>2},{a=>1})], + [{a=>1},{b=>2}]); +cmp_deeply([uuniq({a=>1},{a=>1,b=>2},{b=>2},{a=>1})], + [{a=>1},{a=>1,b=>2},{b=>2}]); +# Going wild.... :-) +cmp_deeply([uuniq(1,[1,2],2,[2,3],2,{a=>1},{b=>1},{a=>1},[1,2])], + [1,[1,2],2,[2,3],{a=>1},{b=>1}]); + +done_testing(); -- cgit From 43537fbd46a28d35ca24b90f9116b0b091d3c8a5 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 20 Sep 2022 22:09:14 +0000 Subject: Task 2 --- challenge-183/perlboy1967/perl/ch-2.pl | 69 ++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 challenge-183/perlboy1967/perl/ch-2.pl diff --git a/challenge-183/perlboy1967/perl/ch-2.pl b/challenge-183/perlboy1967/perl/ch-2.pl new file mode 100755 index 0000000000..33da26f65d --- /dev/null +++ b/challenge-183/perlboy1967/perl/ch-2.pl @@ -0,0 +1,69 @@ +#!/bin/perl + +=pod + +The Weekly Challenge - 183 + - https://theweeklychallenge.org/blog/perl-weekly-challenge-183/#TASK2 + +Author: Niels 'PerlBoy' van Dijke + +Task 2: Date Difference +Submitted by: Mohammad S Anwar + +You are given two dates, $date1 and $date2 in the format YYYY-MM-DD. + +Write a script to find the difference between the given dates in terms on years and days only. + +=cut + +use v5.16; +use warnings; + +use Test::More; +use Test::Deep; + +use DateTime; +use DateTime::Duration; + + +sub dateToHash($) { + return {year => $1, month => $2, day => $3} + if ($_[0] =~ /^(\d+)-(\d+)-(\d+)$/); +} + +sub dateDifference($$) { + my ($f,$t) = sort map { DateTime->new(dateToHash $_) } @_; + + my $year = DateTime::Duration->new(years => 1); + + my $y = 0; + while ($f < $t) { + $y++; + $f->add_duration($year); + if ($f > $t) { + $y--; + $f->subtract_duration($year); + last; + } + } + + return [$y,$f->delta_days($t)->{days}]; +} + +my @d = ( + ['2019-02-10','2022-11-01',[3,264]], + ['2020-09-15','2022-03-29',[1,195]], + ['2019-12-31','2020-01-01',[0,1]], + ['2019-12-01','2019-12-31',[0,30]], + ['2019-12-31','2020-12-31',[1,0]], + ['2019-12-31','2021-12-31',[2,0]], + ['2020-09-15','2021-09-16',[1,1]], + ['2019-09-15','2021-09-16',[2,1]], +); + +foreach my $c (@d) { + cmp_deeply(dateDifference($$c[0],$$c[1]),$c->[2]); + cmp_deeply(dateDifference($$c[1],$$c[0]),$c->[2]); +} + +done_testing; -- cgit From 0bb6e076e6247817844ff7be0b33f8e1a191e812 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 20 Sep 2022 22:26:45 +0000 Subject: Minor cleanup --- challenge-183/perlboy1967/perl/ch-1.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-183/perlboy1967/perl/ch-1.pl b/challenge-183/perlboy1967/perl/ch-1.pl index a5df6bc3e3..0311101076 100755 --- a/challenge-183/perlboy1967/perl/ch-1.pl +++ b/challenge-183/perlboy1967/perl/ch-1.pl @@ -22,7 +22,7 @@ use warnings; use Test::More; use Test::Deep qw(cmp_deeply); -use Data::Compare; +use Data::Compare qw(); #################################################################### # sub uuniq(@list) -- cgit From 41525f249c3d65cfcf21f8a0a9f29208c7a54da3 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 20 Sep 2022 23:08:29 +0000 Subject: Task 2 - more compact code --- challenge-183/perlboy1967/perl/ch-2.pl | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/challenge-183/perlboy1967/perl/ch-2.pl b/challenge-183/perlboy1967/perl/ch-2.pl index 33da26f65d..513f76d87a 100755 --- a/challenge-183/perlboy1967/perl/ch-2.pl +++ b/challenge-183/perlboy1967/perl/ch-2.pl @@ -37,14 +37,9 @@ sub dateDifference($$) { my $year = DateTime::Duration->new(years => 1); my $y = 0; - while ($f < $t) { + while ($f <= $t - $year) { + $f += $year; $y++; - $f->add_duration($year); - if ($f > $t) { - $y--; - $f->subtract_duration($year); - last; - } } return [$y,$f->delta_days($t)->{days}]; -- cgit From 64a818705933d415c4f77d22b0e404c5d250a6c0 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Wed, 21 Sep 2022 19:41:15 +0000 Subject: Task 2: Remove the while and do simple date arithmatic --- challenge-183/perlboy1967/ch-2.pl | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 challenge-183/perlboy1967/ch-2.pl diff --git a/challenge-183/perlboy1967/ch-2.pl b/challenge-183/perlboy1967/ch-2.pl new file mode 100755 index 0000000000..12e50fc040 --- /dev/null +++ b/challenge-183/perlboy1967/ch-2.pl @@ -0,0 +1,60 @@ +#!/bin/perl + +=pod + +The Weekly Challenge - 183 + - https://theweeklychallenge.org/blog/perl-weekly-challenge-183/#TASK2 + +Author: Niels 'PerlBoy' van Dijke + +Task 2: Date Difference +Submitted by: Mohammad S Anwar + +You are given two dates, $date1 and $date2 in the format YYYY-MM-DD. + +Write a script to find the difference between the given dates in terms on years and days only. + +=cut + +use v5.16; +use warnings; + +use Test::More; +use Test::Deep; +use Data::Printer output => 'stdout'; + +use DateTime; +use DateTime::Duration; + + +sub dateToHash($) { + return {year => $1, month => $2, day => $3} + if ($_[0] =~ /^(\d+)-(\d+)-(\d+)$/); +} + +sub dateDifference($$) { + my ($f,$t) = map { DateTime->new(dateToHash $_) } sort @_; + + my $y = $t->subtract_datetime($f)->in_units('years'); + $f += DateTime::Duration->new(years => $y); + + return [$y, $f->delta_days($t)->{days}]; +} + +my @d = ( + ['2019-02-10','2022-11-01',[3,264]], + ['2020-09-15','2022-03-29',[1,195]], + ['2019-12-31','2020-01-01',[0,1]], + ['2019-12-01','2019-12-31',[0,30]], + ['2019-12-31','2020-12-31',[1,0]], + ['2019-12-31','2021-12-31',[2,0]], + ['2020-09-15','2021-09-16',[1,1]], + ['2019-09-15','2021-09-16',[2,1]], +); + +foreach my $c (@d) { + cmp_deeply(dateDifference($$c[0],$$c[1]),$c->[2]); + cmp_deeply(dateDifference($$c[1],$$c[0]),$c->[2]); +} + +done_testing; -- cgit