From 08865512aa558c5ef3155f66d2ca03d58ac65ecc Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 25 Sep 2022 23:28:02 +0200 Subject: Arne Sommer --- challenge-183/arne-sommer/blog.txt | 1 + challenge-183/arne-sommer/dates.txt | 9 +++++ challenge-183/arne-sommer/perl/ch-01.pl | 29 ++++++++++++++ challenge-183/arne-sommer/perl/ch-02.pl | 44 ++++++++++++++++++++++ .../arne-sommer/perl/date-difference-perl | 44 ++++++++++++++++++++++ challenge-183/arne-sommer/perl/unique-array-perl | 29 ++++++++++++++ challenge-183/arne-sommer/raku/ch-01.raku | 25 ++++++++++++ challenge-183/arne-sommer/raku/ch-02.raku | 44 ++++++++++++++++++++++ challenge-183/arne-sommer/raku/date-difference | 44 ++++++++++++++++++++++ challenge-183/arne-sommer/raku/unique-array | 25 ++++++++++++ 10 files changed, 294 insertions(+) create mode 100644 challenge-183/arne-sommer/blog.txt create mode 100644 challenge-183/arne-sommer/dates.txt create mode 100755 challenge-183/arne-sommer/perl/ch-01.pl create mode 100755 challenge-183/arne-sommer/perl/ch-02.pl create mode 100755 challenge-183/arne-sommer/perl/date-difference-perl create mode 100755 challenge-183/arne-sommer/perl/unique-array-perl create mode 100755 challenge-183/arne-sommer/raku/ch-01.raku create mode 100755 challenge-183/arne-sommer/raku/ch-02.raku create mode 100755 challenge-183/arne-sommer/raku/date-difference create mode 100755 challenge-183/arne-sommer/raku/unique-array diff --git a/challenge-183/arne-sommer/blog.txt b/challenge-183/arne-sommer/blog.txt new file mode 100644 index 0000000000..8b8b4197e5 --- /dev/null +++ b/challenge-183/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/unique-difference.html diff --git a/challenge-183/arne-sommer/dates.txt b/challenge-183/arne-sommer/dates.txt new file mode 100644 index 0000000000..359e4a4874 --- /dev/null +++ b/challenge-183/arne-sommer/dates.txt @@ -0,0 +1,9 @@ +2019-02-10 2022-11-01 +2020-09-15 2022-03-29 +2019-12-31 2020-01-01 +2019-12-01 2019-12-31 +2019-12-31 2020-12-31 +2019-12-31 2021-12-31 +2020-09-15 2021-09-16 +2019-09-15 2021-09-16 +2023-01-01 2023-01-01 diff --git a/challenge-183/arne-sommer/perl/ch-01.pl b/challenge-183/arne-sommer/perl/ch-01.pl new file mode 100755 index 0000000000..1a8d575c21 --- /dev/null +++ b/challenge-183/arne-sommer/perl/ch-01.pl @@ -0,0 +1,29 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; + +no warnings 'experimental::signatures'; + +my @list1 = ([1,2], [3,4], [5,6], [1,2]); +my @list2 = ([9,1], [3,7], [2,5], [2,5]); + +say "(", join(", ", map { "[$_->[0],$_->[1]]" } unique_array(@list1)), ")"; +say "(", join(", ", map { "[$_->[0],$_->[1]]" } unique_array(@list2)), ")"; + +sub unique_array (@list) +{ + my @unique; + my %seen; + + for my $ref (@list) + { + next if $seen{"$ref->[0] $ref->[1]"}; + push @unique, $ref; + $seen{"$ref->[0] $ref->[1]"}++; + } + + return @unique; +} diff --git a/challenge-183/arne-sommer/perl/ch-02.pl b/challenge-183/arne-sommer/perl/ch-02.pl new file mode 100755 index 0000000000..6788c03594 --- /dev/null +++ b/challenge-183/arne-sommer/perl/ch-02.pl @@ -0,0 +1,44 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use File::Slurp; +use Date::Calc qw/N_Delta_YMD Delta_Days/; +use feature 'signatures'; + +no warnings 'experimental::signatures'; + +my $file = shift(@ARGV) || "dates.txt"; +my @rows = read_file($file, chomp => 1); + +for my $row (@rows) +{ + my ($date1, $date2) = split(/\s+/, $row); + + say "$date1 vs $date2 -> " . date_diff($date1, $date2); +} + + +sub date_diff ($date1, $date2) +{ + ($date1, $date2) = ($date2, $date1) if $date1 gt $date2; + my ($y, $m, $d) = N_Delta_YMD(split("-", $date1), split("-", $date2)); + my ($y2, $m2, $d2) = split("-", $date1); + my $days = Delta_Days($y2 + $y, $m2, $d2, split("-", $date2)); + my @return; + + push(@return, plural("year", $y)) if $y; + push(@return, plural("day", $days)) if $days; + + return "0 days" unless @return; + + return join(" ", @return); + +} + +sub plural ($label, $val) +{ + return "$val $label" if $val == 1; + return "$val $label". "s"; +} diff --git a/challenge-183/arne-sommer/perl/date-difference-perl b/challenge-183/arne-sommer/perl/date-difference-perl new file mode 100755 index 0000000000..6788c03594 --- /dev/null +++ b/challenge-183/arne-sommer/perl/date-difference-perl @@ -0,0 +1,44 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use File::Slurp; +use Date::Calc qw/N_Delta_YMD Delta_Days/; +use feature 'signatures'; + +no warnings 'experimental::signatures'; + +my $file = shift(@ARGV) || "dates.txt"; +my @rows = read_file($file, chomp => 1); + +for my $row (@rows) +{ + my ($date1, $date2) = split(/\s+/, $row); + + say "$date1 vs $date2 -> " . date_diff($date1, $date2); +} + + +sub date_diff ($date1, $date2) +{ + ($date1, $date2) = ($date2, $date1) if $date1 gt $date2; + my ($y, $m, $d) = N_Delta_YMD(split("-", $date1), split("-", $date2)); + my ($y2, $m2, $d2) = split("-", $date1); + my $days = Delta_Days($y2 + $y, $m2, $d2, split("-", $date2)); + my @return; + + push(@return, plural("year", $y)) if $y; + push(@return, plural("day", $days)) if $days; + + return "0 days" unless @return; + + return join(" ", @return); + +} + +sub plural ($label, $val) +{ + return "$val $label" if $val == 1; + return "$val $label". "s"; +} diff --git a/challenge-183/arne-sommer/perl/unique-array-perl b/challenge-183/arne-sommer/perl/unique-array-perl new file mode 100755 index 0000000000..1a8d575c21 --- /dev/null +++ b/challenge-183/arne-sommer/perl/unique-array-perl @@ -0,0 +1,29 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; + +no warnings 'experimental::signatures'; + +my @list1 = ([1,2], [3,4], [5,6], [1,2]); +my @list2 = ([9,1], [3,7], [2,5], [2,5]); + +say "(", join(", ", map { "[$_->[0],$_->[1]]" } unique_array(@list1)), ")"; +say "(", join(", ", map { "[$_->[0],$_->[1]]" } unique_array(@list2)), ")"; + +sub unique_array (@list) +{ + my @unique; + my %seen; + + for my $ref (@list) + { + next if $seen{"$ref->[0] $ref->[1]"}; + push @unique, $ref; + $seen{"$ref->[0] $ref->[1]"}++; + } + + return @unique; +} diff --git a/challenge-183/arne-sommer/raku/ch-01.raku b/challenge-183/arne-sommer/raku/ch-01.raku new file mode 100755 index 0000000000..ff47dceeda --- /dev/null +++ b/challenge-183/arne-sommer/raku/ch-01.raku @@ -0,0 +1,25 @@ +#! /usr/bin/env raku + +unit sub MAIN (:v(:$verbose)); + +my @list1 = ([1,2], [3,4], [5,6], [1,2]); +my @list2 = ([9,1], [3,7], [2,5], [2,5]); + +say unique-array(@list1); +say unique-array(@list2); + +sub unique-array (@list) +{ + my @unique; + my %seen; + + for @list -> $ref + { + next if %seen{$ref}; + @unique.push: $ref; + %seen{$ref}++; + } + + say ": Seen: " ~ %seen.raku if $verbose; + return @unique; +} diff --git a/challenge-183/arne-sommer/raku/ch-02.raku b/challenge-183/arne-sommer/raku/ch-02.raku new file mode 100755 index 0000000000..3fa090874a --- /dev/null +++ b/challenge-183/arne-sommer/raku/ch-02.raku @@ -0,0 +1,44 @@ +#! /usr/bin/env raku + +unit sub MAIN ($file where $file.IO.f && $file.IO.r = "dates.txt"); + +my @rows = $file.IO.lines; + +for @rows -> $row +{ + my ($date1, $date2) = $row.words; + + say "$date1 vs $date2 -> " ~ date-diff($date1, $date2); +} + +sub date-diff ($date1, $date2) +{ + ($date1, $date2) = ($date2, $date1) if $date1 gt $date2; + + my $d1 = $date1.Date; + my $d2 = $date2.Date; + + my $years = 0; + + while ( $d2 >= $d1.later(:year)) + { + $years++; + $d1 = $d1.later(:year); + } + + my $days = $d2.daycount - $d1.daycount; + my @return; + + push(@return, plural("year", $years)) if $years; + push(@return, plural("day", $days)) if $days; + + return "0 days" unless @return; + + return join(" ", @return); +} + +sub plural ($label, $val) +{ + return "$val $label" if $val == 1; + return "$val $label" ~ "s"; +} diff --git a/challenge-183/arne-sommer/raku/date-difference b/challenge-183/arne-sommer/raku/date-difference new file mode 100755 index 0000000000..3fa090874a --- /dev/null +++ b/challenge-183/arne-sommer/raku/date-difference @@ -0,0 +1,44 @@ +#! /usr/bin/env raku + +unit sub MAIN ($file where $file.IO.f && $file.IO.r = "dates.txt"); + +my @rows = $file.IO.lines; + +for @rows -> $row +{ + my ($date1, $date2) = $row.words; + + say "$date1 vs $date2 -> " ~ date-diff($date1, $date2); +} + +sub date-diff ($date1, $date2) +{ + ($date1, $date2) = ($date2, $date1) if $date1 gt $date2; + + my $d1 = $date1.Date; + my $d2 = $date2.Date; + + my $years = 0; + + while ( $d2 >= $d1.later(:year)) + { + $years++; + $d1 = $d1.later(:year); + } + + my $days = $d2.daycount - $d1.daycount; + my @return; + + push(@return, plural("year", $years)) if $years; + push(@return, plural("day", $days)) if $days; + + return "0 days" unless @return; + + return join(" ", @return); +} + +sub plural ($label, $val) +{ + return "$val $label" if $val == 1; + return "$val $label" ~ "s"; +} diff --git a/challenge-183/arne-sommer/raku/unique-array b/challenge-183/arne-sommer/raku/unique-array new file mode 100755 index 0000000000..ff47dceeda --- /dev/null +++ b/challenge-183/arne-sommer/raku/unique-array @@ -0,0 +1,25 @@ +#! /usr/bin/env raku + +unit sub MAIN (:v(:$verbose)); + +my @list1 = ([1,2], [3,4], [5,6], [1,2]); +my @list2 = ([9,1], [3,7], [2,5], [2,5]); + +say unique-array(@list1); +say unique-array(@list2); + +sub unique-array (@list) +{ + my @unique; + my %seen; + + for @list -> $ref + { + next if %seen{$ref}; + @unique.push: $ref; + %seen{$ref}++; + } + + say ": Seen: " ~ %seen.raku if $verbose; + return @unique; +} -- cgit