diff options
| author | arnesom <arne@bbop.org> | 2021-08-28 22:02:40 +0200 |
|---|---|---|
| committer | arnesom <arne@bbop.org> | 2021-08-28 22:02:40 +0200 |
| commit | 9a5f44061ee800f1423fe4e6423ee56b5760e3d7 (patch) | |
| tree | f6fb86835a6467d4e77da30b78a7dc675c93809b | |
| parent | d47e12f36aede87c7b4975f8afc8c07b2b91337d (diff) | |
| download | perlweeklychallenge-club-9a5f44061ee800f1423fe4e6423ee56b5760e3d7.tar.gz perlweeklychallenge-club-9a5f44061ee800f1423fe4e6423ee56b5760e3d7.tar.bz2 perlweeklychallenge-club-9a5f44061ee800f1423fe4e6423ee56b5760e3d7.zip | |
Arne Sommer
| -rw-r--r-- | challenge-127/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/perl/ch-1.pl | 21 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/perl/ch-2.pl | 48 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/perl/conflict-intervals-perl | 48 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/perl/disjoint-set-perl | 21 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/raku/ch-1.raku | 11 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/raku/ch-2.raku | 46 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/raku/conflict-intervals | 46 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/raku/disjoint-set | 11 | ||||
| -rwxr-xr-x | challenge-127/arne-sommer/raku/disjoint-set-unique | 11 |
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; |
