aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-343/ryan-thompson/README.md8
-rw-r--r--challenge-343/ryan-thompson/blog.txt1
-rw-r--r--challenge-343/ryan-thompson/perl/ch-1.pl6
-rw-r--r--challenge-343/ryan-thompson/perl/ch-2.pl10
-rw-r--r--challenge-343/ryan-thompson/perl/ch-2a.pl51
-rw-r--r--challenge-343/ryan-thompson/perl/t/ch-1.t12
-rw-r--r--challenge-343/ryan-thompson/perl/t/ch-2.t29
7 files changed, 113 insertions, 4 deletions
diff --git a/challenge-343/ryan-thompson/README.md b/challenge-343/ryan-thompson/README.md
index ec7aeb0f5f..2d781de9ed 100644
--- a/challenge-343/ryan-thompson/README.md
+++ b/challenge-343/ryan-thompson/README.md
@@ -1,18 +1,18 @@
# Ryan Thompson
-## Week 342 Solutions
+## Week 343 Solutions
-### Task 1 › Balanced Strings
+### Task 1 › Zero Friend
* [Perl](perl/ch-1.pl)
-### Task 2 › Max Score
+### Task 2 › Champion Team
* [Perl](perl/ch-2.pl)
## Blog
- * [Perfectly Balanced and Pointlessly Optimized](https://ry.ca/2025/10/pwc-342-balanced-optimized/)
+ * [It's hard to make friends when you're a zero](https://ry.ca/2025/10/pwc-343-its-hard-to-make-friends/)
## Tests
diff --git a/challenge-343/ryan-thompson/blog.txt b/challenge-343/ryan-thompson/blog.txt
new file mode 100644
index 0000000000..3dad97d295
--- /dev/null
+++ b/challenge-343/ryan-thompson/blog.txt
@@ -0,0 +1 @@
+https://ry.ca/2025/10/pwc-343-its-hard-to-make-friends/
diff --git a/challenge-343/ryan-thompson/perl/ch-1.pl b/challenge-343/ryan-thompson/perl/ch-1.pl
new file mode 100644
index 0000000000..f41f26fd09
--- /dev/null
+++ b/challenge-343/ryan-thompson/perl/ch-1.pl
@@ -0,0 +1,6 @@
+#!/usr/bin/env perl
+
+use v5.38;
+use List::Util qw< min >;
+
+sub zero_friend { min map abs, @_ }
diff --git a/challenge-343/ryan-thompson/perl/ch-2.pl b/challenge-343/ryan-thompson/perl/ch-2.pl
new file mode 100644
index 0000000000..bb72c3008e
--- /dev/null
+++ b/challenge-343/ryan-thompson/perl/ch-2.pl
@@ -0,0 +1,10 @@
+#!/usr/bin/env perl
+
+use v5.38;
+use List::Util qw< sum max reduce >;
+
+sub best {
+ my ($bs,$bi,$s) = (0,0);
+ ($s = sum $_[$_]->@*) > $bs and ($bs,$bi)=($s,$_) for 0..$#_;
+ $bi;
+}
diff --git a/challenge-343/ryan-thompson/perl/ch-2a.pl b/challenge-343/ryan-thompson/perl/ch-2a.pl
new file mode 100644
index 0000000000..b1ed5b2d77
--- /dev/null
+++ b/challenge-343/ryan-thompson/perl/ch-2a.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+#
+# ch-2a.pl - Alternate solutions (see blog)
+
+use v5.38;
+use List::Util qw< sum max reduce >;
+
+sub reduce1 {
+ (reduce { $a->[1] > $b->[1] ? $a : $b }
+ map { [ $_ => sum @{$_[$_]} ] } keys @_)->[0];
+}
+
+sub reduce2 {
+ my @teams = map { sum @$_ } @_;
+ reduce { $teams[$a] > $teams[$b] ? $a : $b } keys @_;
+}
+
+sub hash_ {
+ my %vals = map { sum(@{$_[$_]}) => $_ } keys @_;
+ $vals{ max keys %vals }
+}
+
+sub loop {
+ my @best = (0,0);
+ for (keys @_) {
+ my $sum = sum $_[$_]->@*;
+ @best = ($sum, $_) if $sum > $best[0];
+ }
+ $best[1];
+}
+
+
+# Benchmark them if --bench is given
+if ($ARGV[0] and $ARGV[0] =~ /^--bench(mark)?$/) {
+ require './ch-2.pl';
+ use Benchmark qw< cmpthese >;
+
+ my @grid = ([0,0,0,0,0],
+ [1,0,0,0,0],
+ [1,1,0,1,1],
+ [1,1,0,0,0],
+ [1,1,0,1,0]);
+
+ cmpthese(-3, {
+ reduce1 => sub { reduce1(@grid) },
+ reduce2 => sub { reduce2(@grid) },
+ hash => sub { hash_(@grid) },
+ loop => sub { loop(@grid) },
+ best => sub { best(@grid) },
+ });
+}
diff --git a/challenge-343/ryan-thompson/perl/t/ch-1.t b/challenge-343/ryan-thompson/perl/t/ch-1.t
new file mode 100644
index 0000000000..ea3212b47f
--- /dev/null
+++ b/challenge-343/ryan-thompson/perl/t/ch-1.t
@@ -0,0 +1,12 @@
+use Test2::V0;
+
+require './ch-1.pl';
+
+is zero_friend(4,2,-1,3,-2), 1;
+is zero_friend(-5,5,-3,3,-1,1), 1;
+is zero_friend(7,-3,0,2,8), 0;
+is zero_friend(-2,-5,-1,-8), 1;
+is zero_friend(-2,2,-4,4,-1,1), 1;
+is zero_friend(2,-2,4,-4,1,-1), 1;
+
+done_testing;
diff --git a/challenge-343/ryan-thompson/perl/t/ch-2.t b/challenge-343/ryan-thompson/perl/t/ch-2.t
new file mode 100644
index 0000000000..1be8d09383
--- /dev/null
+++ b/challenge-343/ryan-thompson/perl/t/ch-2.t
@@ -0,0 +1,29 @@
+use Test2::V0;
+
+require './ch-2.pl';
+
+is best([0, 1, 1],
+ [0, 0, 1],
+ [0, 0, 0]), 0;
+
+is best([0, 1, 0, 0],
+ [0, 0, 0, 0],
+ [1, 1, 0, 0],
+ [1, 1, 1, 0]), 3;
+
+is best([0, 1, 0, 1],
+ [0, 0, 1, 1],
+ [1, 0, 0, 0],
+ [0, 0, 1, 0]), 0;
+
+is best([0, 1, 1],
+ [0, 0, 0],
+ [0, 1, 0]), 0;
+
+is best([0, 0, 0, 0, 0],
+ [1, 0, 0, 0, 0],
+ [1, 1, 0, 1, 1],
+ [1, 1, 0, 0, 0],
+ [1, 1, 0, 1, 0]), 2;
+
+done_testing;