aboutsummaryrefslogtreecommitdiff
path: root/challenge-092
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-12-27 09:50:05 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-12-27 09:50:05 +0000
commitc35dbff0ed10a535921cbb598aae211300657c4f (patch)
treeb277b5f31bf48a81002ff747e2a26ae52b92c44b /challenge-092
parent571c1c64d2a057f3af80d367e15887ea600de29c (diff)
downloadperlweeklychallenge-club-c35dbff0ed10a535921cbb598aae211300657c4f.tar.gz
perlweeklychallenge-club-c35dbff0ed10a535921cbb598aae211300657c4f.tar.bz2
perlweeklychallenge-club-c35dbff0ed10a535921cbb598aae211300657c4f.zip
- Added solutions by Alexander Karelas.
Diffstat (limited to 'challenge-092')
-rwxr-xr-xchallenge-092/alexander-karelas/perl/ch-1.pl31
-rwxr-xr-xchallenge-092/alexander-karelas/perl/ch-2.pl44
2 files changed, 75 insertions, 0 deletions
diff --git a/challenge-092/alexander-karelas/perl/ch-1.pl b/challenge-092/alexander-karelas/perl/ch-1.pl
new file mode 100755
index 0000000000..a6fcb0c681
--- /dev/null
+++ b/challenge-092/alexander-karelas/perl/ch-1.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+
+use v5.30;
+use warnings;
+
+# args
+my ($A, $B) = @ARGV;
+length $A and length $B or die "Usage: $0 \$A \$B";
+
+# pre-check
+length $A == length $B or say(0), exit;
+
+# start
+my (%a_to_b, %b_to_a);
+
+my @a = split //, $A;
+my @b = split //, $B;
+
+while (@a) {
+ my $x = shift @a;
+ my $y = shift @b;
+
+ if (exists $a_to_b{$x} or exists $b_to_a{$y}) {
+ ($a_to_b{$x} // '') eq $y and ($b_to_a{$y} // '') eq $x or say(0), exit;
+ }
+
+ $a_to_b{$x} //= $y;
+ $b_to_a{$y} //= $x;
+}
+
+say 1;
diff --git a/challenge-092/alexander-karelas/perl/ch-2.pl b/challenge-092/alexander-karelas/perl/ch-2.pl
new file mode 100755
index 0000000000..a1d6011572
--- /dev/null
+++ b/challenge-092/alexander-karelas/perl/ch-2.pl
@@ -0,0 +1,44 @@
+#!/usr/bin/env perl
+
+use v5.30;
+use warnings;
+
+use List::Util 'min', 'max';
+
+my @S = (
+ [1, 5],
+ [7, 9],
+);
+
+my $N = [10, 11];
+
+push @S, $N;
+
+LOOP:
+{
+ # check all pairs of intervals, whether they merge
+ for (my $i = 0; $i < @S - 1; $i++) {
+ for (my $j = $i + 1; $j < @S; $j++) {
+ my $pair_a = $S[$i];
+ my $pair_b = $S[$j];
+
+ # do they touch?
+ if ($pair_a->[1] >= $pair_b->[0] and $pair_a->[0] <= $pair_b->[1]) {
+ # merge the two intervals and start over
+ my $min = min($pair_a->[0], $pair_b->[0]);
+ my $max = max($pair_a->[1], $pair_b->[1]);
+ splice @S, $j, 1;
+ splice @S, $i, 1;
+ push @S, [$min, $max];
+
+ redo LOOP;
+ }
+ }
+ }
+}
+
+# sort intervals
+@S = sort {$a->[0] <=> $b->[0]} @S;
+
+# display them
+say join(", ", map {"($_->[0],$_->[1])"} @S);