aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-08-29 15:31:44 +0100
committerGitHub <noreply@github.com>2021-08-29 15:31:44 +0100
commit99b9b9766c45d8604f591b15db6439300ab3a3e2 (patch)
treef6fb86835a6467d4e77da30b78a7dc675c93809b
parentd47e12f36aede87c7b4975f8afc8c07b2b91337d (diff)
parent9a5f44061ee800f1423fe4e6423ee56b5760e3d7 (diff)
downloadperlweeklychallenge-club-99b9b9766c45d8604f591b15db6439300ab3a3e2.tar.gz
perlweeklychallenge-club-99b9b9766c45d8604f591b15db6439300ab3a3e2.tar.bz2
perlweeklychallenge-club-99b9b9766c45d8604f591b15db6439300ab3a3e2.zip
Merge pull request #4799 from arnesom/branch-for-challenge-127
Arne Sommer
-rw-r--r--challenge-127/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-127/arne-sommer/perl/ch-1.pl21
-rwxr-xr-xchallenge-127/arne-sommer/perl/ch-2.pl48
-rwxr-xr-xchallenge-127/arne-sommer/perl/conflict-intervals-perl48
-rwxr-xr-xchallenge-127/arne-sommer/perl/disjoint-set-perl21
-rwxr-xr-xchallenge-127/arne-sommer/raku/ch-1.raku11
-rwxr-xr-xchallenge-127/arne-sommer/raku/ch-2.raku46
-rwxr-xr-xchallenge-127/arne-sommer/raku/conflict-intervals46
-rwxr-xr-xchallenge-127/arne-sommer/raku/disjoint-set11
-rwxr-xr-xchallenge-127/arne-sommer/raku/disjoint-set-unique11
10 files changed, 264 insertions, 0 deletions
diff --git a/challenge-127/arne-sommer/blog.txt b/challenge-127/arne-sommer/blog.txt
new file mode 100644
index 0000000000..308578f848
--- /dev/null
+++ b/challenge-127/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/disjoint-conflict.html
diff --git a/challenge-127/arne-sommer/perl/ch-1.pl b/challenge-127/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..9fb5d32ffc
--- /dev/null
+++ b/challenge-127/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,21 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+my $S1 = $ARGV[0] // die 'Please specify @S1';
+my $S2 = $ARGV[1] // die 'Please specify @S2';
+
+my @S1 = split(/\s+/, $S1);
+my @S2 = split(/\s+/, $S2);
+
+my %S1 = map { /^\d+$/ ? ($_ => 1) : die 'Non-integer value ' . $_ . ' in @S1' } @S1;
+my %S2 = map { /^\d+$/ ? ($_ => 1) : die 'Non-integer value ' . $_ . ' in @S2' } @S2;
+
+die '@S1 has duplicates' unless keys %S1 == @S1;
+die '@S2 has duplicates' unless keys %S2 == @S2;
+
+my %all = (%S1, %S2);
+
+say 0 + (keys %all == %S1 + %S2);
diff --git a/challenge-127/arne-sommer/perl/ch-2.pl b/challenge-127/arne-sommer/perl/ch-2.pl
new file mode 100755
index 0000000000..1337a5e43c
--- /dev/null
+++ b/challenge-127/arne-sommer/perl/ch-2.pl
@@ -0,0 +1,48 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+use feature 'say';
+use feature 'signatures';
+
+no warnings qw(experimental::signatures);
+
+my $verbose = 0;
+
+GetOptions("verbose" => \$verbose);
+
+my $interval = $ARGV[0] // die 'Please specify one or more intervals';
+
+my @Intervals = split(/\s+|\s+/, $interval);
+
+sub does_intersect($first, $second)
+{
+ my ($first_from, $first_to) = split(",", $first);
+ my ($second_from, $second_to) = split(",", $second);
+
+ return 0 if $first_to < $second_from;
+ return 0 if $second_to < $first_from;
+ return 1;
+}
+
+my @done;
+my @conflict;
+
+for my $interval (@Intervals)
+{
+ say ": Inspecting interval: $interval" if $verbose;
+
+ for my $iv (@done)
+ {
+ if (does_intersect($interval, $iv))
+ {
+ push(@conflict, $interval);
+ last;
+ }
+ }
+
+ push(@done, $interval);
+}
+
+say '[ ', join(", ", map { "($_)" } @conflict), ' ]';
diff --git a/challenge-127/arne-sommer/perl/conflict-intervals-perl b/challenge-127/arne-sommer/perl/conflict-intervals-perl
new file mode 100755
index 0000000000..1337a5e43c
--- /dev/null
+++ b/challenge-127/arne-sommer/perl/conflict-intervals-perl
@@ -0,0 +1,48 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+use feature 'say';
+use feature 'signatures';
+
+no warnings qw(experimental::signatures);
+
+my $verbose = 0;
+
+GetOptions("verbose" => \$verbose);
+
+my $interval = $ARGV[0] // die 'Please specify one or more intervals';
+
+my @Intervals = split(/\s+|\s+/, $interval);
+
+sub does_intersect($first, $second)
+{
+ my ($first_from, $first_to) = split(",", $first);
+ my ($second_from, $second_to) = split(",", $second);
+
+ return 0 if $first_to < $second_from;
+ return 0 if $second_to < $first_from;
+ return 1;
+}
+
+my @done;
+my @conflict;
+
+for my $interval (@Intervals)
+{
+ say ": Inspecting interval: $interval" if $verbose;
+
+ for my $iv (@done)
+ {
+ if (does_intersect($interval, $iv))
+ {
+ push(@conflict, $interval);
+ last;
+ }
+ }
+
+ push(@done, $interval);
+}
+
+say '[ ', join(", ", map { "($_)" } @conflict), ' ]';
diff --git a/challenge-127/arne-sommer/perl/disjoint-set-perl b/challenge-127/arne-sommer/perl/disjoint-set-perl
new file mode 100755
index 0000000000..9fb5d32ffc
--- /dev/null
+++ b/challenge-127/arne-sommer/perl/disjoint-set-perl
@@ -0,0 +1,21 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+my $S1 = $ARGV[0] // die 'Please specify @S1';
+my $S2 = $ARGV[1] // die 'Please specify @S2';
+
+my @S1 = split(/\s+/, $S1);
+my @S2 = split(/\s+/, $S2);
+
+my %S1 = map { /^\d+$/ ? ($_ => 1) : die 'Non-integer value ' . $_ . ' in @S1' } @S1;
+my %S2 = map { /^\d+$/ ? ($_ => 1) : die 'Non-integer value ' . $_ . ' in @S2' } @S2;
+
+die '@S1 has duplicates' unless keys %S1 == @S1;
+die '@S2 has duplicates' unless keys %S2 == @S2;
+
+my %all = (%S1, %S2);
+
+say 0 + (keys %all == %S1 + %S2);
diff --git a/challenge-127/arne-sommer/raku/ch-1.raku b/challenge-127/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..89b84c1556
--- /dev/null
+++ b/challenge-127/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,11 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $S1, Str $S2);
+
+my Int @S1 = $S1.words>>.Numeric;
+my Int @S2 = $S2.words>>.Numeric;
+
+die "@S1 has duplicates" unless @S1.elems == @S1.Set.elems;
+die "@S2 has duplicates" unless @S2.elems == @S2.Set.elems;
+
+say + ! so @S1 (&) @S2;
diff --git a/challenge-127/arne-sommer/raku/ch-2.raku b/challenge-127/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..08dbd1798b
--- /dev/null
+++ b/challenge-127/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,46 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $interval = '1 4 | 3 5 | 6 8 | 12 13 | 3 20', :v(:$verbose));
+
+my @Intervals = $interval.split("|")>>.words>>.Int;
+
+class interval
+{
+ has Int $.from;
+ has Int $.to;
+
+ method does-intersect(interval $interval)
+ {
+ return False if $.to < $interval.from;
+ return False if $interval.to < $.from;
+ return True;
+ }
+
+ method Str
+ {
+ return "($.from,$.to)";
+ }
+}
+
+my @done;
+my @conflict;
+
+for @Intervals -> $interval
+{
+ say ": Generating interval: @$interval[0] -> @$interval[1]" if $verbose;
+
+ my $i = interval.new(from => @$interval[0], to => @$interval[1]);
+
+ for @done -> $iv
+ {
+ if $i.does-intersect($iv)
+ {
+ @conflict.push: $i;
+ last;
+ }
+ }
+
+ @done.push: $i;
+}
+
+say '[ ', @conflict.join(", "), ' ]';
diff --git a/challenge-127/arne-sommer/raku/conflict-intervals b/challenge-127/arne-sommer/raku/conflict-intervals
new file mode 100755
index 0000000000..08dbd1798b
--- /dev/null
+++ b/challenge-127/arne-sommer/raku/conflict-intervals
@@ -0,0 +1,46 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $interval = '1 4 | 3 5 | 6 8 | 12 13 | 3 20', :v(:$verbose));
+
+my @Intervals = $interval.split("|")>>.words>>.Int;
+
+class interval
+{
+ has Int $.from;
+ has Int $.to;
+
+ method does-intersect(interval $interval)
+ {
+ return False if $.to < $interval.from;
+ return False if $interval.to < $.from;
+ return True;
+ }
+
+ method Str
+ {
+ return "($.from,$.to)";
+ }
+}
+
+my @done;
+my @conflict;
+
+for @Intervals -> $interval
+{
+ say ": Generating interval: @$interval[0] -> @$interval[1]" if $verbose;
+
+ my $i = interval.new(from => @$interval[0], to => @$interval[1]);
+
+ for @done -> $iv
+ {
+ if $i.does-intersect($iv)
+ {
+ @conflict.push: $i;
+ last;
+ }
+ }
+
+ @done.push: $i;
+}
+
+say '[ ', @conflict.join(", "), ' ]';
diff --git a/challenge-127/arne-sommer/raku/disjoint-set b/challenge-127/arne-sommer/raku/disjoint-set
new file mode 100755
index 0000000000..89b84c1556
--- /dev/null
+++ b/challenge-127/arne-sommer/raku/disjoint-set
@@ -0,0 +1,11 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $S1, Str $S2);
+
+my Int @S1 = $S1.words>>.Numeric;
+my Int @S2 = $S2.words>>.Numeric;
+
+die "@S1 has duplicates" unless @S1.elems == @S1.Set.elems;
+die "@S2 has duplicates" unless @S2.elems == @S2.Set.elems;
+
+say + ! so @S1 (&) @S2;
diff --git a/challenge-127/arne-sommer/raku/disjoint-set-unique b/challenge-127/arne-sommer/raku/disjoint-set-unique
new file mode 100755
index 0000000000..ef7cea1169
--- /dev/null
+++ b/challenge-127/arne-sommer/raku/disjoint-set-unique
@@ -0,0 +1,11 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $S1, Str $S2);
+
+my Int @S1 = $S1.words>>.Int;
+my Int @S2 = $S2.words>>.Int;
+
+die "@S1 has duplicates" unless @S1.elems == @S1.unique.elems;
+die "@S2 has duplicates" unless @S2.elems == @S2.unique.elems;
+
+say + ! so @S1 (&) @S2;