diff options
| author | arnesom <arne@bbop.org> | 2020-12-27 23:37:33 +0100 |
|---|---|---|
| committer | arnesom <arne@bbop.org> | 2020-12-27 23:37:33 +0100 |
| commit | a6515d7279950e62cc5d5bbe3578f25fe42ff44c (patch) | |
| tree | 63c7e1d93a54a0d2d089d8637b6bfecee41b05bf /challenge-092 | |
| parent | ec898c003abe3ec2e478384b6a28ecd61f060136 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/perl/ch-1.pl | 55 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/perl/isomorphic-strings-perl | 55 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/ch-1.raku | 45 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/ch-2.raku | 76 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/insert-interval | 76 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/insert-interval2 | 79 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/isomorphic-strings-roundrobin | 45 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/isomorphic-strings-zip | 19 | ||||
| -rwxr-xr-x | challenge-092/arne-sommer/raku/isomorphic-strings-zip-again | 40 |
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; + |
