aboutsummaryrefslogtreecommitdiff
path: root/challenge-092
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2020-12-27 23:37:33 +0100
committerarnesom <arne@bbop.org>2020-12-27 23:37:33 +0100
commita6515d7279950e62cc5d5bbe3578f25fe42ff44c (patch)
tree63c7e1d93a54a0d2d089d8637b6bfecee41b05bf /challenge-092
parentec898c003abe3ec2e478384b6a28ecd61f060136 (diff)
downloadperlweeklychallenge-club-a6515d7279950e62cc5d5bbe3578f25fe42ff44c.tar.gz
perlweeklychallenge-club-a6515d7279950e62cc5d5bbe3578f25fe42ff44c.tar.bz2
perlweeklychallenge-club-a6515d7279950e62cc5d5bbe3578f25fe42ff44c.zip
Arne Sommer
Diffstat (limited to 'challenge-092')
-rw-r--r--challenge-092/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-092/arne-sommer/perl/ch-1.pl55
-rwxr-xr-xchallenge-092/arne-sommer/perl/isomorphic-strings-perl55
-rwxr-xr-xchallenge-092/arne-sommer/raku/ch-1.raku45
-rwxr-xr-xchallenge-092/arne-sommer/raku/ch-2.raku76
-rwxr-xr-xchallenge-092/arne-sommer/raku/insert-interval76
-rwxr-xr-xchallenge-092/arne-sommer/raku/insert-interval279
-rwxr-xr-xchallenge-092/arne-sommer/raku/isomorphic-strings-roundrobin45
-rwxr-xr-xchallenge-092/arne-sommer/raku/isomorphic-strings-zip19
-rwxr-xr-xchallenge-092/arne-sommer/raku/isomorphic-strings-zip-again40
10 files changed, 491 insertions, 0 deletions
diff --git a/challenge-092/arne-sommer/blog.txt b/challenge-092/arne-sommer/blog.txt
new file mode 100644
index 0000000000..b3edba34c6
--- /dev/null
+++ b/challenge-092/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/isomorphic-insert.html
diff --git a/challenge-092/arne-sommer/perl/ch-1.pl b/challenge-092/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..cc2fa14dc5
--- /dev/null
+++ b/challenge-092/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,55 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+use List::Util 'uniq';
+use Getopt::Long;
+
+my $verbose = 0;
+
+GetOptions("verbose" => \$verbose);
+
+my $A = shift(@ARGV) // die 'Please specify $A';
+my $B = shift(@ARGV) // die 'Please specify $B';
+
+if (length($A) != length($B))
+{
+ say ": Different length" if $verbose;
+ say 0;
+ exit;
+}
+
+my %A;
+
+for my $index (0 .. length $A -1)
+{
+ my $pair0 = substr($A, $index, 1);
+ my $pair1 = substr($B, $index, 1);
+
+ say ": Pair: $pair0 -> $pair1" if $verbose;
+
+ if (defined %A{$pair0})
+ {
+ if ($A{$pair0} eq $pair1)
+ {
+ say ": Duplicate of $pair0 (value: $pair1)" if $verbose;
+ next;
+ }
+
+ say ": Redeclaration of $pair0 (values: " . $A{$pair0} . " and " . $pair1 . ")" if $verbose;
+ say 0;
+ exit;
+ }
+
+ $A{$pair0} = $pair1;
+}
+
+if (scalar keys %A == scalar uniq values %A)
+{
+ say 1;
+}
+else
+{
+ say ': Redeclaration of value (in $B).' if $verbose;
+ say 0;
+}
diff --git a/challenge-092/arne-sommer/perl/isomorphic-strings-perl b/challenge-092/arne-sommer/perl/isomorphic-strings-perl
new file mode 100755
index 0000000000..cc2fa14dc5
--- /dev/null
+++ b/challenge-092/arne-sommer/perl/isomorphic-strings-perl
@@ -0,0 +1,55 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+use List::Util 'uniq';
+use Getopt::Long;
+
+my $verbose = 0;
+
+GetOptions("verbose" => \$verbose);
+
+my $A = shift(@ARGV) // die 'Please specify $A';
+my $B = shift(@ARGV) // die 'Please specify $B';
+
+if (length($A) != length($B))
+{
+ say ": Different length" if $verbose;
+ say 0;
+ exit;
+}
+
+my %A;
+
+for my $index (0 .. length $A -1)
+{
+ my $pair0 = substr($A, $index, 1);
+ my $pair1 = substr($B, $index, 1);
+
+ say ": Pair: $pair0 -> $pair1" if $verbose;
+
+ if (defined %A{$pair0})
+ {
+ if ($A{$pair0} eq $pair1)
+ {
+ say ": Duplicate of $pair0 (value: $pair1)" if $verbose;
+ next;
+ }
+
+ say ": Redeclaration of $pair0 (values: " . $A{$pair0} . " and " . $pair1 . ")" if $verbose;
+ say 0;
+ exit;
+ }
+
+ $A{$pair0} = $pair1;
+}
+
+if (scalar keys %A == scalar uniq values %A)
+{
+ say 1;
+}
+else
+{
+ say ': Redeclaration of value (in $B).' if $verbose;
+ say 0;
+}
diff --git a/challenge-092/arne-sommer/raku/ch-1.raku b/challenge-092/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..0d78a1ecf5
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,45 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $A, Str $B, :v($verbose));
+
+my @A2B = (roundrobin($A.comb, $B.comb));
+
+say ": Array: { @A2B.raku }" if $verbose;
+
+my %A;
+
+for @A2B -> @pair
+{
+ unless @pair[1].defined
+ {
+ say ": Different length" if $verbose;
+ say 0;
+ exit;
+ }
+
+ say ": Pair: @pair[0] -> @pair[1]" if $verbose;
+
+ if %A{@pair[0]}.defined
+ {
+ if %A{@pair[0]} eq @pair[1]
+ {
+ say ": Duplicate of @pair[0] (value: @pair[1])";
+ next;
+ }
+
+ say ": Redeclaration of @pair[0] (values: %A{@pair[0]} and @pair[1])";
+ say 0;
+ exit;
+ }
+ %A{@pair[0]} = @pair[1];
+}
+
+if %A.keys.elems == %A.values.unique.elems
+{
+ say 1;
+}
+else
+{
+ say ': Redeclaration of value (in $B).';
+ say 0;
+}
diff --git a/challenge-092/arne-sommer/raku/ch-2.raku b/challenge-092/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..cb08c0e98a
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,76 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (:$S = "(1,4),(8,10)", :$N ="(2,6)", :v(:$verbose));
+
+my $s = $S.EVAL;
+my $n = $N.EVAL;
+
+class interval
+{
+ has $.start;
+ has $.stop;
+
+ method inside ($value)
+ {
+ return $.start <= $value <= $.stop;
+ }
+
+ method mergable (interval $new)
+ {
+ return True if $.start -1 < $new.start < $.stop +1;
+ return True if $.start -1 < $new.stop < $.stop +1;
+ return False;
+ }
+ method merge (interval $new)
+ {
+ return interval.new(start => min($.start, $new.start),
+ stop => max($.stop, $new.stop));
+ }
+ method Str
+ {
+ return "({ $.start },{ $.stop })";
+ }
+}
+
+my @all = @$s.map({ interval.new(start => $_[0], stop => $_[1]) });
+my $m = interval.new(start => $n[0], stop => $n[1]);
+
+@all.push($m);
+
+@all = @all.sort: { $^a.start <=> $^b.start || $^a.stop <=> $^b.stop };
+
+my @result;
+
+my $first = @all.shift;
+
+loop
+{
+ last unless @all.elems;
+
+ my $second = @all.shift;
+ if $first.mergable($second)
+ {
+ # say ":m" if $verbose;
+ my $new = $first.merge($second);
+ $first = $new;
+ next;
+ }
+ elsif $first.stop < $second.start + 1
+ {
+ # say ":<" if $verbose;
+ @result.push($first);
+ $first = $second;
+ next;
+ }
+ else
+ {
+ # say ":>" if $verbose;
+ @result.append($first, $second, @all);
+ $first = Any;
+ last;
+ }
+}
+
+@result.push($first) if $first;
+
+say @result.join(", ");
diff --git a/challenge-092/arne-sommer/raku/insert-interval b/challenge-092/arne-sommer/raku/insert-interval
new file mode 100755
index 0000000000..cb08c0e98a
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/insert-interval
@@ -0,0 +1,76 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (:$S = "(1,4),(8,10)", :$N ="(2,6)", :v(:$verbose));
+
+my $s = $S.EVAL;
+my $n = $N.EVAL;
+
+class interval
+{
+ has $.start;
+ has $.stop;
+
+ method inside ($value)
+ {
+ return $.start <= $value <= $.stop;
+ }
+
+ method mergable (interval $new)
+ {
+ return True if $.start -1 < $new.start < $.stop +1;
+ return True if $.start -1 < $new.stop < $.stop +1;
+ return False;
+ }
+ method merge (interval $new)
+ {
+ return interval.new(start => min($.start, $new.start),
+ stop => max($.stop, $new.stop));
+ }
+ method Str
+ {
+ return "({ $.start },{ $.stop })";
+ }
+}
+
+my @all = @$s.map({ interval.new(start => $_[0], stop => $_[1]) });
+my $m = interval.new(start => $n[0], stop => $n[1]);
+
+@all.push($m);
+
+@all = @all.sort: { $^a.start <=> $^b.start || $^a.stop <=> $^b.stop };
+
+my @result;
+
+my $first = @all.shift;
+
+loop
+{
+ last unless @all.elems;
+
+ my $second = @all.shift;
+ if $first.mergable($second)
+ {
+ # say ":m" if $verbose;
+ my $new = $first.merge($second);
+ $first = $new;
+ next;
+ }
+ elsif $first.stop < $second.start + 1
+ {
+ # say ":<" if $verbose;
+ @result.push($first);
+ $first = $second;
+ next;
+ }
+ else
+ {
+ # say ":>" if $verbose;
+ @result.append($first, $second, @all);
+ $first = Any;
+ last;
+ }
+}
+
+@result.push($first) if $first;
+
+say @result.join(", ");
diff --git a/challenge-092/arne-sommer/raku/insert-interval2 b/challenge-092/arne-sommer/raku/insert-interval2
new file mode 100755
index 0000000000..804030957b
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/insert-interval2
@@ -0,0 +1,79 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (:$S = "(1,4),(8,10)", :$N ="(2,6)",
+ :i($integer), :v(:$verbose));
+
+my $s = $S.EVAL;
+my $n = $N.EVAL;
+
+my $limit = $integer ?? 2 !! 1;
+
+class interval
+{
+ has $.start;
+ has $.stop;
+
+ method inside ($value)
+ {
+ return $.start <= $value <= $.stop;
+ }
+
+ method mergable (interval $new)
+ {
+ return True if $.start -$limit < $new.start < $.stop +$limit;
+ return True if $.start -$limit < $new.stop < $.stop +$limit;
+ return False;
+ }
+ method merge (interval $new)
+ {
+ return interval.new(start => min($.start, $new.start),
+ stop => max($.stop, $new.stop));
+ }
+ method Str
+ {
+ return "({ $.start },{ $.stop })";
+ }
+}
+
+my @all = @$s.map({ interval.new(start => $_[0], stop => $_[1]) });
+my $m = interval.new(start => $n[0], stop => $n[1]);
+
+@all.push($m);
+
+@all = @all.sort: { $^a.start <=> $^b.start || $^a.stop <=> $^b.stop };
+
+my @result;
+
+my $first = @all.shift;
+
+loop
+{
+ last unless @all.elems;
+
+ my $second = @all.shift;
+ if $first.mergable($second)
+ {
+ # say ":m" if $verbose;
+ my $new = $first.merge($second);
+ $first = $new;
+ next;
+ }
+ elsif $first.stop < $second.start + 1
+ {
+ # say ":<" if $verbose;
+ @result.push($first);
+ $first = $second;
+ next;
+ }
+ else
+ {
+ # say ":>" if $verbose;
+ @result.append($first, $second, @all);
+ $first = Any;
+ last;
+ }
+}
+
+@result.push($first) if $first;
+
+say @result.join(", ");
diff --git a/challenge-092/arne-sommer/raku/isomorphic-strings-roundrobin b/challenge-092/arne-sommer/raku/isomorphic-strings-roundrobin
new file mode 100755
index 0000000000..0d78a1ecf5
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/isomorphic-strings-roundrobin
@@ -0,0 +1,45 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $A, Str $B, :v($verbose));
+
+my @A2B = (roundrobin($A.comb, $B.comb));
+
+say ": Array: { @A2B.raku }" if $verbose;
+
+my %A;
+
+for @A2B -> @pair
+{
+ unless @pair[1].defined
+ {
+ say ": Different length" if $verbose;
+ say 0;
+ exit;
+ }
+
+ say ": Pair: @pair[0] -> @pair[1]" if $verbose;
+
+ if %A{@pair[0]}.defined
+ {
+ if %A{@pair[0]} eq @pair[1]
+ {
+ say ": Duplicate of @pair[0] (value: @pair[1])";
+ next;
+ }
+
+ say ": Redeclaration of @pair[0] (values: %A{@pair[0]} and @pair[1])";
+ say 0;
+ exit;
+ }
+ %A{@pair[0]} = @pair[1];
+}
+
+if %A.keys.elems == %A.values.unique.elems
+{
+ say 1;
+}
+else
+{
+ say ': Redeclaration of value (in $B).';
+ say 0;
+}
diff --git a/challenge-092/arne-sommer/raku/isomorphic-strings-zip b/challenge-092/arne-sommer/raku/isomorphic-strings-zip
new file mode 100755
index 0000000000..b10f48086b
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/isomorphic-strings-zip
@@ -0,0 +1,19 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $A, Str $B, :v($verbose));
+
+if $A.chars != $B.chars
+{
+ say ": Different length" if $verbose;
+ say 0;
+ exit;
+}
+
+my %A2B = ($A.comb Z $B.comb)>>.hash;
+
+say ": Hash: { %A2B.raku }" if $verbose;
+
+say %A2B.keys.elems == %A2B.values.unique.elems
+ ?? 1
+ !! 0;
+
diff --git a/challenge-092/arne-sommer/raku/isomorphic-strings-zip-again b/challenge-092/arne-sommer/raku/isomorphic-strings-zip-again
new file mode 100755
index 0000000000..e7c9205458
--- /dev/null
+++ b/challenge-092/arne-sommer/raku/isomorphic-strings-zip-again
@@ -0,0 +1,40 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $A, Str $B, :v($verbose));
+
+if $A.chars != $B.chars
+{
+ say ": Different length" if $verbose;
+ say 0;
+ exit;
+}
+
+my @A2B = ($A.comb Z $B.comb);
+
+say ": Array: { @A2B.raku }" if $verbose;
+
+my %A;
+
+for @A2B -> @pair
+{
+ say ": Pair: @pair[0] -> @pair[1]" if $verbose;
+
+ if %A{@pair[0]}.defined
+ {
+ if %A{@pair[0]} eq @pair[1]
+ {
+ say ": Duplicate of @pair[0] (value: @pair[1])";
+ next;
+ }
+
+ say ": Redeclaration of @pair[0] (values: %A{@pair[0]} and @pair[1])";
+ say 0;
+ exit;
+ }
+ %A{@pair[0]} = @pair[1];
+}
+
+say %A.keys.elems == %A.values.unique.elems
+ ?? 1
+ !! 0;
+