diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-12-27 09:50:05 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-12-27 09:50:05 +0000 |
| commit | c35dbff0ed10a535921cbb598aae211300657c4f (patch) | |
| tree | b277b5f31bf48a81002ff747e2a26ae52b92c44b /challenge-092 | |
| parent | 571c1c64d2a057f3af80d367e15887ea600de29c (diff) | |
| download | perlweeklychallenge-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-x | challenge-092/alexander-karelas/perl/ch-1.pl | 31 | ||||
| -rwxr-xr-x | challenge-092/alexander-karelas/perl/ch-2.pl | 44 |
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); |
