diff options
| author | Flavio Poletti <flavio@polettix.it> | 2023-03-20 07:00:40 +0100 |
|---|---|---|
| committer | Flavio Poletti <flavio@polettix.it> | 2023-03-20 07:00:40 +0100 |
| commit | 8c8741f38ea764d97845a8d4aacea241c98f5a53 (patch) | |
| tree | 4d82e30b4a3579730c299ed874b9344588e1cf27 | |
| parent | 5e012a49ddfb8c869bf159d533fe28fdff003e16 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-208/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-208/polettix/perl/ch-1.pl | 34 | ||||
| -rw-r--r-- | challenge-208/polettix/perl/ch-2.pl | 37 | ||||
| -rw-r--r-- | challenge-208/polettix/raku/ch-1.raku | 30 | ||||
| -rw-r--r-- | challenge-208/polettix/raku/ch-2.raku | 31 |
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; +} |
