diff options
| author | David Ferrone <zapwai@gmail.com> | 2025-01-27 11:10:12 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-27 11:10:12 -0500 |
| commit | e7101148e684751594b892cec61b55bb444b21df (patch) | |
| tree | 1f7df18d892f308c1a8cfa46452832039cfb9d80 | |
| parent | 906bb690f8e1d091ac358c4ac77818bf879144c8 (diff) | |
| download | perlweeklychallenge-club-e7101148e684751594b892cec61b55bb444b21df.tar.gz perlweeklychallenge-club-e7101148e684751594b892cec61b55bb444b21df.tar.bz2 perlweeklychallenge-club-e7101148e684751594b892cec61b55bb444b21df.zip | |
Week 306
| -rw-r--r-- | challenge-306/zapwai/perl/ch-1.pl | 39 | ||||
| -rw-r--r-- | challenge-306/zapwai/perl/ch-2.pl | 63 |
2 files changed, 102 insertions, 0 deletions
diff --git a/challenge-306/zapwai/perl/ch-1.pl b/challenge-306/zapwai/perl/ch-1.pl new file mode 100644 index 0000000000..dbfcb3622b --- /dev/null +++ b/challenge-306/zapwai/perl/ch-1.pl @@ -0,0 +1,39 @@ +use v5.38; +sub proc(@ints) { + say "Input: \@ints = @ints"; + my $total = 0; + for my $o (1 .. @ints) { + next if ($o % 2 == 0); + my $last = @ints - $o; + for my $shift (0 .. $last) { + my $sum = 0; + my $n = $o; + for my $i (1 .. $n) { + $sum += $ints[$shift + $i - 1]; + } + $total += $sum; + } + } + # Read incorrectly the first time. + # Here is all subsets of odd length. + # for my $num (0 .. 2**@ints - 1) { + # my $form = "%0" . @ints . "b"; + # my $x = sprintf($form, $num); + # my $count = 0; + # my @dig = split "", $x; + # for my $i (@dig) { + # $count++ if ($i == 1); + # } + # next unless ($count % 2 == 1); + # my $sum = 0; + # for (0 .. $#dig) { + # $sum += $ints[$_] if ($dig[$_] == 1); + # $total += $sum; + # } + say "Output: $total"; +} + +my @ints = (2,5,3,6,4); +proc(@ints); +@ints = (1,3); +proc(@ints); diff --git a/challenge-306/zapwai/perl/ch-2.pl b/challenge-306/zapwai/perl/ch-2.pl new file mode 100644 index 0000000000..26ea7fd2ca --- /dev/null +++ b/challenge-306/zapwai/perl/ch-2.pl @@ -0,0 +1,63 @@ +use v5.38; +use List::Util qw( max ); + +sub drop2($ind1, $ind2, @l) { + if ($ind1 > $ind2) { + splice @l, $ind1, 1; + splice @l, $ind2, 1; + } else { + splice @l, $ind2, 1; + splice @l, $ind1, 1; + } + + return @l; +} + +sub churn(@l) { + my $max1 = max(@l); + my $max2 = 0; + my ($ind1, $ind2) = (0, 0); + my $found = 0; + for my $i (0 .. $#l) { + if ($found) { + if ($max2 < $l[$i]) { + $max2 = $l[$i]; + $ind2 = $i; + } + } else { + if ($l[$i] == $max1) { + $found = 1; + $ind1 = $i; + next; + } else { + if ($max2 < $l[$i]) { + $max2 = $l[$i]; + $ind2 = $i; + } + } + } + } + $found = 0; + if ($max1 == $max2) { + @l = drop2($ind1, $ind2, @l); + } else { + my $newval = $max1 - $max2; + @l = drop2($ind1, $ind2, @l); + push @l, $newval; + } + return @l; +} + +sub proc(@ints) { + say "Input: \@ints = @ints"; + do { + @ints = churn(@ints); + } while (@ints > 1); + print "Output: "; + say $ints[0] // 0; +} + +my @ints = (3, 8, 5, 2, 9, 2); +proc(@ints); +@ints = (3, 2, 5); +proc(@ints); |
