aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-076/walt-mankowski/perl/ch-1.pl62
1 files changed, 62 insertions, 0 deletions
diff --git a/challenge-076/walt-mankowski/perl/ch-1.pl b/challenge-076/walt-mankowski/perl/ch-1.pl
index bd19d3acfb..d4c8673a2d 100644
--- a/challenge-076/walt-mankowski/perl/ch-1.pl
+++ b/challenge-076/walt-mankowski/perl/ch-1.pl
@@ -3,6 +3,7 @@ use strict;
use warnings;
use feature qw(:5.32);
use experimental qw(signatures);
+use List::Util qw(sum);
# TASK #1 › Prime Sum
# Submitted by: Mohammad S Anwar
@@ -36,5 +37,66 @@ sub primes_upto($n) {
return grep {$is_prime[$_]} 2..$n;
}
+sub value($c, $cnt) {
+ my $sum = 0;
+ for my $i (0..$#$c) {
+ $sum += $c->[$i] * $cnt->[$i];
+ }
+ return $sum;
+}
+
+sub sums($s, @c) {
+ my @solutions;
+
+ my @cnt = map {0} 0..$#c;
+ while (1) {
+ my $val = value(\@c, \@cnt);
+ if ($val >= $s) {
+ if ($val == $s) {
+ my @tmp = @cnt;
+ push @solutions, \@tmp;
+ }
+
+ # rotate "odometer"
+ $cnt[-1] = 0;
+ my $i = -2;
+ $cnt[$i]++;
+ while ($i >= -@c && value(\@c, \@cnt) > $s) {
+ $cnt[$i] = 0;
+ $i--;
+ $cnt[$i]++ if $i >= -@c;
+ }
+ last if $i < -@c;
+ } else {
+ $cnt[-1]++;
+ }
+ }
+ return @solutions;
+}
+
my $n = shift @ARGV;
my @primes = primes_upto($n);
+my @solutions = sums($n, @primes);
+say "primes: @primes";
+
+# find indices of best solution
+my $min = 1e300;
+my @best;
+for my $i (0..$#solutions) {
+ my $sum = sum $solutions[$i]->@*;
+ if ($sum < $min) {
+ $min = $sum;
+ @best = ($i);
+ } elsif ($sum == $min) {
+ push @best, $i;
+ }
+}
+
+# print out the solutions
+for my $i (@best) {
+ my @p;
+ for my $j (0..$#primes) {
+ push @p, ($primes[$j]) x $solutions[$i][$j] if $solutions[$i][$j];
+ }
+ say join " + ", @p;
+}