aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-183/arne-sommer/blog.txt1
-rw-r--r--challenge-183/arne-sommer/dates.txt9
-rwxr-xr-xchallenge-183/arne-sommer/perl/ch-01.pl29
-rwxr-xr-xchallenge-183/arne-sommer/perl/ch-02.pl44
-rwxr-xr-xchallenge-183/arne-sommer/perl/date-difference-perl44
-rwxr-xr-xchallenge-183/arne-sommer/perl/unique-array-perl29
-rwxr-xr-xchallenge-183/arne-sommer/raku/ch-01.raku25
-rwxr-xr-xchallenge-183/arne-sommer/raku/ch-02.raku44
-rwxr-xr-xchallenge-183/arne-sommer/raku/date-difference44
-rwxr-xr-xchallenge-183/arne-sommer/raku/unique-array25
10 files changed, 294 insertions, 0 deletions
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;
+}