aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2023-03-20 07:00:40 +0100
committerFlavio Poletti <flavio@polettix.it>2023-03-20 07:00:40 +0100
commit8c8741f38ea764d97845a8d4aacea241c98f5a53 (patch)
tree4d82e30b4a3579730c299ed874b9344588e1cf27
parent5e012a49ddfb8c869bf159d533fe28fdff003e16 (diff)
downloadperlweeklychallenge-club-8c8741f38ea764d97845a8d4aacea241c98f5a53.tar.gz
perlweeklychallenge-club-8c8741f38ea764d97845a8d4aacea241c98f5a53.tar.bz2
perlweeklychallenge-club-8c8741f38ea764d97845a8d4aacea241c98f5a53.zip
Add polettix's solution to challenge-208
-rw-r--r--challenge-208/polettix/blog.txt1
-rw-r--r--challenge-208/polettix/blog1.txt1
-rw-r--r--challenge-208/polettix/perl/ch-1.pl34
-rw-r--r--challenge-208/polettix/perl/ch-2.pl37
-rw-r--r--challenge-208/polettix/raku/ch-1.raku30
-rw-r--r--challenge-208/polettix/raku/ch-2.raku31
6 files changed, 134 insertions, 0 deletions
diff --git a/challenge-208/polettix/blog.txt b/challenge-208/polettix/blog.txt
new file mode 100644
index 0000000000..b64d98b4fb
--- /dev/null
+++ b/challenge-208/polettix/blog.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2023/03/17/pwc208-minimum-index-sum/
diff --git a/challenge-208/polettix/blog1.txt b/challenge-208/polettix/blog1.txt
new file mode 100644
index 0000000000..b904bd9799
--- /dev/null
+++ b/challenge-208/polettix/blog1.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2023/03/18/pwc208-duplicate-and-missing/
diff --git a/challenge-208/polettix/perl/ch-1.pl b/challenge-208/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..d72cf2020d
--- /dev/null
+++ b/challenge-208/polettix/perl/ch-1.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+
+my @list1;
+while (@ARGV) {
+ my $item = shift(@ARGV);
+ last if $item eq '/';
+ push @list1, $item;
+}
+my @m = minimum_index_sum(\@list1, \@ARGV);
+say "(@m)";
+
+sub minimum_index_sum ($list1, $list2) {
+ my %list2_index_for;
+ $list2_index_for{$list2->[$_]} //= $_ for 0 .. $list2->$#*;
+ my @result;
+ my $min_sum = scalar($list1->@*) + scalar($list2->@*);
+ for my $i1 (0 .. $list1->$#*) {
+ my $item = $list1->[$i1];
+ defined(my $i2 = $list2_index_for{$item}) or next;
+ my $this_sum = $i1 + $i2;
+ if ($this_sum < $min_sum) { # new winner, reset
+ @result = ($item);
+ $min_sum = $this_sum;
+ }
+ elsif ($this_sum == $min_sum) { # append
+ push @result, $item;
+ }
+ else {} # just skip this
+ }
+ return @result;
+}
diff --git a/challenge-208/polettix/perl/ch-2.pl b/challenge-208/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..dd4abfc909
--- /dev/null
+++ b/challenge-208/polettix/perl/ch-2.pl
@@ -0,0 +1,37 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+
+our $SHORT_CIRCUIT = $ENV{SHORT_CIRCUIT} // 1;
+if (my @dam = duplicate_and_missing(@ARGV)) {
+ local $" = ',';
+ say "(@dam)";
+}
+else {
+ say -1;
+}
+
+sub duplicate_and_missing (@list) {
+ my ($duplicate, $missing, @retval);
+ for my $i (1 .. $#list) {
+ if ($list[$i] == $list[$i - 1]) {
+ die "too many duplicates ($duplicate, $list[$i])\n"
+ if defined $duplicate;
+ push @retval, $duplicate = $list[$i];
+ }
+ elsif ($list[$i] == $list[$i - 1] + 2) {
+ my $miss = $list[$i] - 1;
+ die "too many missing ($missing, $miss)\n" if defined $missing;
+ push @retval, $missing = $miss;
+ }
+ elsif ($list[$i] != $list[$i - 1] + 1) {
+ die "unexpected gap\n";
+ }
+ else {} # just a simple increment
+ return @retval if @retval == 2 && our $SHORT_CIRCUIT;
+ }
+ return unless defined($duplicate);
+ push @retval, $list[-1] + 1 unless @retval == 2;
+ return @retval;
+}
diff --git a/challenge-208/polettix/raku/ch-1.raku b/challenge-208/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..dc3e96973a
--- /dev/null
+++ b/challenge-208/polettix/raku/ch-1.raku
@@ -0,0 +1,30 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (*@items) {
+ my @lists = [], [];
+ my $i = 0;
+ for @items -> $item {
+ if ($item eq '/') { $i = 1 }
+ else { @lists[$i].push: $item }
+ }
+ say minimum-index-sum(@lists[0], @lists[1]);
+}
+
+sub minimum-index-sum ($list1, $list2) {
+ my %list2-index-for = $list2.kv.reverse; # keeps minimum!
+ my @result;
+ my $min-sum = $list1.elems + $list2.elems; # beyond "possible"
+ for @$list1.kv -> $i1, $item {
+ defined(my $i2 = %list2-index-for{$item}) or next;
+ my $this-sum = $i1 + $i2;
+ if ($this-sum < $min-sum) { # new winner, reset
+ @result = $item,;
+ $min-sum = $this-sum;
+ }
+ elsif ($this-sum == $min-sum) { # append
+ @result.push: $item;
+ }
+ else {} # just skip this
+ }
+ return @result;
+}
diff --git a/challenge-208/polettix/raku/ch-2.raku b/challenge-208/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..f398c6bf79
--- /dev/null
+++ b/challenge-208/polettix/raku/ch-2.raku
@@ -0,0 +1,31 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (*@args) {
+ my @dam = duplicate-and-missing(@args, %*ENV<SHORT_CIRCUIT>);
+ put @dam ?? "({@dam.join(',')})" !! -1;
+}
+
+sub duplicate-and-missing (@list, $short-circuit is copy = Nil) {
+ $short-circuit //= True;
+ my ($duplicate, $missing, @retval);
+ for 1 ..^ @list -> $i {
+ if @list[$i] == @list[$i - 1] {
+ die "too many duplicates ($duplicate, {@list[$i]})\n"
+ if defined $duplicate;
+ @retval.push: $duplicate = @list[$i];
+ }
+ elsif (@list[$i] == @list[$i - 1] + 2) {
+ my $miss = @list[$i] - 1;
+ die "too many missing ($missing, $miss)\n" if defined $missing;
+ @retval.push: $missing = $miss;
+ }
+ elsif (@list[$i] != @list[$i - 1] + 1) {
+ die "unexpected gap\n";
+ }
+ else {} # just a simple increment
+ return @retval if @retval == 2 && $short-circuit;
+ }
+ return [] unless defined($duplicate);
+ @retval.push(@list[*-1] + 1) unless @retval == 2;
+ return @retval;
+}