From 8e3e74158d5d68493ec4bc6d7f60aa37d0449214 Mon Sep 17 00:00:00 2001 From: Abigail Date: Mon, 17 Jan 2022 21:11:03 +0100 Subject: Week 148, part 1: 15 languages --- challenge-148/abigail/awk/ch-1.awk | 19 +++++++++++ challenge-148/abigail/bash/ch-1.sh | 16 +++++++++ challenge-148/abigail/bc/ch-1.bc | 24 ++++++++++++++ challenge-148/abigail/c/ch-1.c | 24 ++++++++++++++ challenge-148/abigail/go/ch-1.go | 26 +++++++++++++++ challenge-148/abigail/java/ch-1.java | 24 ++++++++++++++ challenge-148/abigail/lua/ch-1.lua | 21 ++++++++++++ challenge-148/abigail/node/ch-1.js | 17 ++++++++++ challenge-148/abigail/pascal/ch-1.p | 26 +++++++++++++++ challenge-148/abigail/perl/ch-1.pl | 61 +++++++++++++++++++++++++++++++++++ challenge-148/abigail/python/ch-1.py | 19 +++++++++++ challenge-148/abigail/r/ch-1.r | 11 +++++++ challenge-148/abigail/ruby/ch-1.rb | 11 +++++++ challenge-148/abigail/scheme/ch-1.scm | 22 +++++++++++++ challenge-148/abigail/tcl/ch-1.tcl | 17 ++++++++++ 15 files changed, 338 insertions(+) create mode 100644 challenge-148/abigail/awk/ch-1.awk create mode 100644 challenge-148/abigail/bash/ch-1.sh create mode 100644 challenge-148/abigail/bc/ch-1.bc create mode 100644 challenge-148/abigail/c/ch-1.c create mode 100644 challenge-148/abigail/go/ch-1.go create mode 100644 challenge-148/abigail/java/ch-1.java create mode 100644 challenge-148/abigail/lua/ch-1.lua create mode 100644 challenge-148/abigail/node/ch-1.js create mode 100644 challenge-148/abigail/pascal/ch-1.p create mode 100644 challenge-148/abigail/perl/ch-1.pl create mode 100644 challenge-148/abigail/python/ch-1.py create mode 100644 challenge-148/abigail/r/ch-1.r create mode 100644 challenge-148/abigail/ruby/ch-1.rb create mode 100644 challenge-148/abigail/scheme/ch-1.scm create mode 100644 challenge-148/abigail/tcl/ch-1.tcl diff --git a/challenge-148/abigail/awk/ch-1.awk b/challenge-148/abigail/awk/ch-1.awk new file mode 100644 index 0000000000..547cd72064 --- /dev/null +++ b/challenge-148/abigail/awk/ch-1.awk @@ -0,0 +1,19 @@ +#!/usr/bin/awk + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: awk -f ch-1.awk +# + +BEGIN { + for (i = 0; i <= 100; i ++) { + if (! match (i, /^0$|[1789]|^2.|[35]$/)) { + printf ("%d ", i) + } + } + printf ("\n") +} + diff --git a/challenge-148/abigail/bash/ch-1.sh b/challenge-148/abigail/bash/ch-1.sh new file mode 100644 index 0000000000..8c2a94a75b --- /dev/null +++ b/challenge-148/abigail/bash/ch-1.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: bash ch-1.sh +# + +for ((i = 0; i <= 100; i ++)) +do if [[ !($i =~ ^0$|[1789]|^2.|[35]$) ]] + then printf "%d " $i + fi +done +echo diff --git a/challenge-148/abigail/bc/ch-1.bc b/challenge-148/abigail/bc/ch-1.bc new file mode 100644 index 0000000000..ae79ba0e77 --- /dev/null +++ b/challenge-148/abigail/bc/ch-1.bc @@ -0,0 +1,24 @@ +#!/usr/bin/bc + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: bc ch-1.bc +# + +for (i = 0; i <= 100; i ++) { + t = i / 10 + u = i % 10 + if (!(i == 0 || t == 1 || u == 1 || t == 7 || u == 7 \ + || t == 8 || u == 8 || t == 9 || u == 9 \ + || t == 2 || u == 3 || u == 5 || i == 100)) { + print i, " " + } +} + +" +" + +halt diff --git a/challenge-148/abigail/c/ch-1.c b/challenge-148/abigail/c/ch-1.c new file mode 100644 index 0000000000..231a5efade --- /dev/null +++ b/challenge-148/abigail/c/ch-1.c @@ -0,0 +1,24 @@ +# include +# include +# include + +/* + * See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 + */ + +/* + * Run as: cc -o ch-1.o ch-1.c; ./ch-1.o + */ + +int main (void) { + for (int i = 0; i <= 100; i ++) { + int u = i % 10; + int t = i / 10; + if (!(i == 0 || t == 1 || u == 1 || t == 7 || u == 7 + || t == 8 || u == 8 || t == 9 || u == 9 + || t == 2 || u == 3 || u == 5 || i == 100)) { + printf ("%d ", i); + } + } + printf ("\n"); +} diff --git a/challenge-148/abigail/go/ch-1.go b/challenge-148/abigail/go/ch-1.go new file mode 100644 index 0000000000..2fdce59eb8 --- /dev/null +++ b/challenge-148/abigail/go/ch-1.go @@ -0,0 +1,26 @@ +package main + +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +// + +// +// Run as: go run ch-1.go +// + +import ( + "fmt" +) + +func main () { + for i := 0; i <= 100; i ++ { + u := i % 10 + t := i / 10 + if !(i == 0 || t == 1 || u == 1 || t == 7 || u == 7 || + t == 8 || u == 8 || t == 9 || u == 9 || + t == 2 || u == 3 || u == 5 || i == 100) { + fmt . Printf ("%d ", i) + } + } + fmt . Printf ("\n") +} diff --git a/challenge-148/abigail/java/ch-1.java b/challenge-148/abigail/java/ch-1.java new file mode 100644 index 0000000000..4d9fb734e2 --- /dev/null +++ b/challenge-148/abigail/java/ch-1.java @@ -0,0 +1,24 @@ +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +// + +// +// Run as: ln ch-1.java ch1.java; javac ch1.java; java ch1 +// + +import java.util.*; + +public class ch1 { + public static void main (String [] args) { + for (int i = 0; i <= 100; i ++) { + int u = i % 10; + int t = i / 10; + if (!(i == 0 || t == 1 || u == 1 || t == 7 || u == 7 + || t == 8 || u == 8 || t == 9 || u == 9 + || t == 2 || u == 3 || u == 5 || i == 100)) { + System . out . printf ("%d ", i); + } + } + System . out . printf ("\n"); + } +} diff --git a/challenge-148/abigail/lua/ch-1.lua b/challenge-148/abigail/lua/ch-1.lua new file mode 100644 index 0000000000..246f1db062 --- /dev/null +++ b/challenge-148/abigail/lua/ch-1.lua @@ -0,0 +1,21 @@ +#!/opt/local/bin/lua + +-- +-- See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +-- + +-- +-- Run as: lua ch-1.lua +-- + +for i = 0, 100 do + local t = math . floor (i / 10) + local u = i % 10 + if not (i == 0 or t == 1 or u == 1 or t == 7 or u == 7 + or t == 8 or u == 8 or t == 9 or u == 9 + or t == 2 or u == 3 or u == 5 or i == 100) then + io . write (i, " ") + end +end + +io . write ("\n") diff --git a/challenge-148/abigail/node/ch-1.js b/challenge-148/abigail/node/ch-1.js new file mode 100644 index 0000000000..1c3ddca65f --- /dev/null +++ b/challenge-148/abigail/node/ch-1.js @@ -0,0 +1,17 @@ +#!/usr/local/bin/node + +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +// + +// +// Run as: node ch-1.js +// + + +console . log ( + Array . from (Array (101) . keys ()) + . filter (x => !(x . toString () . match (/^0$|[1789]|^2.|[35]$/))) + . join (" ") +) + diff --git a/challenge-148/abigail/pascal/ch-1.p b/challenge-148/abigail/pascal/ch-1.p new file mode 100644 index 0000000000..74d050e07c --- /dev/null +++ b/challenge-148/abigail/pascal/ch-1.p @@ -0,0 +1,26 @@ +Program XXX; + +(* *) +(* See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 *) +(* *) + +(* *) +(* Run as: fpc -och-1.out ch-1.p; ./ch-1.out *) +(* *) + +var + i, t, u: integer; + +begin + for i := 1 to 100 do begin + t := i div 10; + u := i mod 10; + if not ((i = 0) or (t = 1) or (u = 1) or (t = 7) or (u = 7) + or (t = 8) or (u = 8) or (t = 9) or (u = 9) + or (t = 2) or (u = 3) or (u = 5) or (i = 100)) + then begin + write (i, ' '); + end; + end; + writeln (''); +end. diff --git a/challenge-148/abigail/perl/ch-1.pl b/challenge-148/abigail/perl/ch-1.pl new file mode 100644 index 0000000000..7feaa42382 --- /dev/null +++ b/challenge-148/abigail/perl/ch-1.pl @@ -0,0 +1,61 @@ +#!/opt/perl/bin/perl + +use 5.032; + +use strict; +use warnings; +no warnings 'syntax'; + +use experimental 'signatures'; +use experimental 'lexical_subs'; + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: perl ch-1.pl +# + +# +# This is sequence A006933 in the OEIS +# + +# +# Number English Contains e +# 0 ZERO Y +# ?1 ONE Y +# ?2 TWO N +# ?3 THREE Y +# ?4 FOUR N +# ?5 FIVE Y +# ?6 SIX N +# ?7 SEVEN Y +# ?8 EIGHT Y +# ?9 NINE Y +# 10 TEN Y +# 11 ELEVEN Y +# 12 TWELVE Y +# 1? *TEEN Y +# 2? TWENTY* Y +# 3? THIRTY* N +# 4? FORTY* N +# 5? FIFTY* N +# 6? SIXTY* N +# 7? SEVENTY* Y +# 8? EIGHTY* Y +# 9? NINETY* Y +# 1? HUNDRED Y +# + +# +# So, in short, numbers containing an E when written in English +# are: - 0 +# - contains a 1, 7, 8 or 9 +# - ends with a 3, or 5 +# - starts with a 2, and is followed by another digit +# +# Any other numbers are eban. +# + +say join " " => grep {!/^0$ | [1789] | ^2. | [35]$/x} 0 .. 100; diff --git a/challenge-148/abigail/python/ch-1.py b/challenge-148/abigail/python/ch-1.py new file mode 100644 index 0000000000..f0d3591271 --- /dev/null +++ b/challenge-148/abigail/python/ch-1.py @@ -0,0 +1,19 @@ +#!/usr/local/bin/python3 + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: python ch-1.py +# + +import sys, re + +for i in range (101): + if not (i == 0 or re . search (r'[1789]', str (i)) + or re . search (r'^2.', str (i)) + or re . search (r'[35]$', str (i))): + sys . stdout . write (str (i) + " ") + +sys . stdout . write ("\n") diff --git a/challenge-148/abigail/r/ch-1.r b/challenge-148/abigail/r/ch-1.r new file mode 100644 index 0000000000..45684794ab --- /dev/null +++ b/challenge-148/abigail/r/ch-1.r @@ -0,0 +1,11 @@ +#!/usr/local/bin/Rscript + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: Rscript ch-1.r +# + +cat (grep ("^0$|[1789]|2.|[35]$", c (0:100), invert = TRUE, value = TRUE), "\n") diff --git a/challenge-148/abigail/ruby/ch-1.rb b/challenge-148/abigail/ruby/ch-1.rb new file mode 100644 index 0000000000..745041a7b8 --- /dev/null +++ b/challenge-148/abigail/ruby/ch-1.rb @@ -0,0 +1,11 @@ +#!/usr/bin/ruby + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: ruby ch-1.rb +# + +puts ((0 .. 100) . reject {|n| n . to_s =~ /^0$|[1789]|^2.|[35]$/} . join (" ")) diff --git a/challenge-148/abigail/scheme/ch-1.scm b/challenge-148/abigail/scheme/ch-1.scm new file mode 100644 index 0000000000..db6fb840a6 --- /dev/null +++ b/challenge-148/abigail/scheme/ch-1.scm @@ -0,0 +1,22 @@ +#!/usr/local/bin/guile +!# + +;;; +;;; See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +;;; + +;;; +;;; Run as: guile --no-auto-compile ch-1.scm +;;; + +(use-modules (ice-9 regex)) +(use-modules (ice-9 format)) + +(define pat "^0$|[1789]|^2.|[35]$") + +(do ((i 0 (1+ i))) + ((> i 100)) + (if (not (string-match pat (number->string i))) + (format #t "~d " i))) + +(newline) diff --git a/challenge-148/abigail/tcl/ch-1.tcl b/challenge-148/abigail/tcl/ch-1.tcl new file mode 100644 index 0000000000..a4d6a4bd13 --- /dev/null +++ b/challenge-148/abigail/tcl/ch-1.tcl @@ -0,0 +1,17 @@ +#!/usr/local/opt/tcl-tk/bin/tclsh + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: tclsh ch-1.tcl +# + +for {set i 0} {$i <= 100} {incr i} { + if {![regexp {^0$|[1789]|^2.|[35]$} $i]} { + puts -nonewline "${i} " + } +} + +puts "" -- cgit From 97df40e00e206c00439d356c7156559034f46a68 Mon Sep 17 00:00:00 2001 From: Abigail Date: Mon, 17 Jan 2022 21:11:32 +0100 Subject: Week 147, test cases --- challenge-148/abigail/t/ctest.ini | 8 ++++++++ challenge-148/abigail/t/input-1-1 | 1 + challenge-148/abigail/t/input-2-1 | 1 + challenge-148/abigail/t/output-1-1.exp | 1 + 4 files changed, 11 insertions(+) create mode 100644 challenge-148/abigail/t/ctest.ini create mode 100644 challenge-148/abigail/t/input-1-1 create mode 100644 challenge-148/abigail/t/input-2-1 create mode 100644 challenge-148/abigail/t/output-1-1.exp diff --git a/challenge-148/abigail/t/ctest.ini b/challenge-148/abigail/t/ctest.ini new file mode 100644 index 0000000000..bfef483d85 --- /dev/null +++ b/challenge-148/abigail/t/ctest.ini @@ -0,0 +1,8 @@ +# +# Configuration file for running tests, using ctest. +# See https://github.com/Abigail/Misc/blob/master/ctest +# + +[names] +1-1 = Fixed Output +2-1 = Fixed Output diff --git a/challenge-148/abigail/t/input-1-1 b/challenge-148/abigail/t/input-1-1 new file mode 100644 index 0000000000..8d1c8b69c3 --- /dev/null +++ b/challenge-148/abigail/t/input-1-1 @@ -0,0 +1 @@ + diff --git a/challenge-148/abigail/t/input-2-1 b/challenge-148/abigail/t/input-2-1 new file mode 100644 index 0000000000..8d1c8b69c3 --- /dev/null +++ b/challenge-148/abigail/t/input-2-1 @@ -0,0 +1 @@ + diff --git a/challenge-148/abigail/t/output-1-1.exp b/challenge-148/abigail/t/output-1-1.exp new file mode 100644 index 0000000000..b58d3cefa3 --- /dev/null +++ b/challenge-148/abigail/t/output-1-1.exp @@ -0,0 +1 @@ +2 4 6 30 32 34 36 40 42 44 46 50 52 54 56 60 62 64 66 -- cgit From 9a94bb5aafe258c41d5dd25045e4de79476aa2b3 Mon Sep 17 00:00:00 2001 From: Abigail Date: Fri, 21 Jan 2022 18:10:51 +0100 Subject: Week 148: Perl solution --- challenge-148/abigail/perl/ch-2.pl | 142 +++++++++++++++++++++++++++++++++ challenge-148/abigail/t/output-2-1.exp | 5 ++ 2 files changed, 147 insertions(+) create mode 100644 challenge-148/abigail/perl/ch-2.pl create mode 100644 challenge-148/abigail/t/output-2-1.exp diff --git a/challenge-148/abigail/perl/ch-2.pl b/challenge-148/abigail/perl/ch-2.pl new file mode 100644 index 0000000000..a63742b3a6 --- /dev/null +++ b/challenge-148/abigail/perl/ch-2.pl @@ -0,0 +1,142 @@ +#!/opt/perl/bin/perl + +use 5.032; + +use strict; +use warnings; +no warnings 'syntax'; + +use experimental 'signatures'; +use experimental 'lexical_subs'; + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: perl ch-2.pl +# + +# +# Cardona Triplets are also subject of Project Euler, task 251 +# + +# +# While the challenge defines what a Cardano Triplet is, it doesn't +# define how to order them. Given triplets t1 = (a1, b1, c1) and +# t2 = (a2, b2, b3), how do we determine t1 <=> t2? +# +# Order them on (a1 + b1 + c1) <=> (a2 + b2 + c2)? +# Order them on a1 <=> a2 || b1 <=> b2? +# Order them on min (a1, b1, c1) <=> min (a2, b2, c2) (with ties +# broken on the second smallest number)? +# Some other order? +# +# We will pick the first one. +# + +# +# With some manipulation, it can be show that +# +# cbrt (a + b * sqrt (c)) + cbrt (a - b * sqrt (c)) == 1 <=> +# +# 8 * a^3 + 15 * a^2 + 6 * a - 27 * b^2 * c == 1 +# +# Take this modulo 3, and we get: +# +# 8 * a^3 + 15 * a^2 + 6 * a - 27 * b^2 * c === 1 mod 3, +# +# which, since 15, 6 and 27 are multiples of 3, and 8 === 2 mod 3, +# reduces to: +# +# 2 * a^3 === 1 mod 3 <=> (multiply boths sides with 2): +# +# 4 * a^3 === 2 mod 3 => +# +# a === 2 mod 3 +# +# So, we can generate the a's with 3 * k + 2, k >= 0. +# +# 27 * b^2 * c == 8 * a^3 + 15 * a^2 + 6 * a - 1 +# == 8 * (3 * k + 2)^3 + 15 * (3 * k + 2) ^ 2 + 6 * (3 * k + 2) - 1 +# == 216 * k^3 + 432 * k^2 + 288 * k + 64 +# + 135 * k^2 + 180 * k + 60 +# + 18 * k + 12 - 1 +# == 216 * k^3 + 567 * k^2 + 486 * k + 135 +# == 27 * (k + 1) ^ 2 * (8 * k + 5) <=> +# +# b^2 * c == (k + 1) ^ 2 * (8 * k + 5) +# +# Now, b = (k + 1), c = (8 * k + 5) gives a triple for a = 3 * k + 2, +# but that is not the only solution for a given a. +# +# *Each* divisor d1 of k + 1 (including 1 and k + 1) is a valid solution +# for b. Furthermore, for each divisor of d2 of 8 * k + 5, if d2 is a square +# sqrt (d2) is a solution for b. Finally, each product d1 * sqrt (d2) +# is a solution for b. +# +# If we know k and b, we can calculate c as: +# +# c = (k + 1)^2 * (8 * k + 5) / b^2 +# + +# +# So, how many k do we have to try? We start generating triples. +# As soon as we have 5 of them, we find the sum of the 5th triple. +# We then continue until 3 * k + 2 exceeds this sum. +# + +use Math::Prime::Util qw [divisors]; +use List::Util qw [sum max]; + +my @out; + +my $COUNT = 5; + +my $max; + +for (my $k = 0; !$max || 3 * $k + 2 <= $max; $k ++) { + my $A = 3 * $k + 2; + my $f1 = $k + 1; + my $f2 = 8 * $k + 5; + + my %seen; + # + # Divisors of (k + 1) + # + my @d1 = divisors ($f1); + + # + # Squares of divisors of (8k + 5), which are integers. + # + my @d2 = grep {$_ == int ($_)} map {sqrt $_} divisors ($f2); + + # + # Calculate all the solutions for b and c (for this k) + # + foreach my $d1 (@d1) { + foreach my $d2 (@d2) { + $seen {$d1 * $d2} = ($f1) ** 2 * $f2 / ($d1 * $d1 * $d2 * $d2); + } + } + + # + # Add solutions to @out + # + push @out => map {[$A, $_, $seen {$_}]} keys %seen; + + # + # Find the stopping requirement. + # + if (!$max && @out >= $COUNT) { + @out = sort {sum (@$a) <=> sum (@$b)} @out; + $max = sum @{$out [$COUNT - 1]}; + } +} + + +@out = sort {sum (@$a) <=> sum (@$b)} @out; + +say "@$_" for @out [0 .. $COUNT - 1]; + +__END__ diff --git a/challenge-148/abigail/t/output-2-1.exp b/challenge-148/abigail/t/output-2-1.exp new file mode 100644 index 0000000000..5091953f6d --- /dev/null +++ b/challenge-148/abigail/t/output-2-1.exp @@ -0,0 +1,5 @@ +2 1 5 +5 2 13 +8 3 21 +17 18 5 +11 4 29 -- cgit From 48dd880935791025ec68f869b9975b13d1e03a5c Mon Sep 17 00:00:00 2001 From: Abigail Date: Fri, 21 Jan 2022 19:58:25 +0100 Subject: Week 148, part 2: AWK & bc solutions --- challenge-148/abigail/awk/ch-2.awk | 108 +++++++++++++++++++++++++++++++++++ challenge-148/abigail/bc/ch-2.bc | 114 +++++++++++++++++++++++++++++++++++++ challenge-148/abigail/t/ctest.ini | 3 + 3 files changed, 225 insertions(+) create mode 100644 challenge-148/abigail/awk/ch-2.awk create mode 100644 challenge-148/abigail/bc/ch-2.bc diff --git a/challenge-148/abigail/awk/ch-2.awk b/challenge-148/abigail/awk/ch-2.awk new file mode 100644 index 0000000000..58753e2615 --- /dev/null +++ b/challenge-148/abigail/awk/ch-2.awk @@ -0,0 +1,108 @@ +#!/usr/bin/awk + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: awk -f ch-2.awk +# + + +BEGIN { + COUNT = 5 + # + # Initialize out with high values. + # [1, 2, 3] will be values of the triples, [4] will be the sum + # + for (i = 1; i <= COUNT; i ++) { + out [i, 4] = 0 + for (j = 1; j <= 3; j ++) { + out [i, j] = 999999 + out [i, 4] += out [i, j] + } + } + + max_index = 1 # Index of largest sum + + k = 0 + while (3 * k + 2 <= out [max_index, 4]) { + a = 3 * k + 2 + f1 = k + 1 + f2 = 8 * k + 5 + + d1c = 0 + d2c = 0 + + # + # Find divisors of f1 + # + for (i = 1; i * i <= f1; i ++) { + if (f1 % i == 0) { + d1c = d1c + 1 + d1 [d1c] = i + if (i != f1 / i) { + d1c = d1c + 1 + d1 [d1c] = f1 / i + } + } + } + + # + # Find divisors for f2, which are squares + # + for (i = 1; i * i <= f2; i ++) { + if (f2 % i == 0) { + s1 = sqrt (i) + s2 = sqrt (f2 / i) + if (s1 == int (s1)) { + d2c = d2c + 1 + d2 [d2c] = s1 + } + if (s2 == int (s2) && s1 != s2) { + d2c = d2c + 1 + d2 [d2c] = s2 + } + } + } + + delete seen + + for (i = 1; i <= d1c; i ++) { + for (j = 1; j <= d2c; j ++) { + b = d1 [i] * d2 [j] + if (!(b in seen)) { + c = f1 * f1 * f2 / (b * b) + if (a + b + c < out [max_index, 4]) { + out [max_index, 1] = a + out [max_index, 2] = b + out [max_index, 3] = c + out [max_index, 4] = a + b + c + } + # + # Find the new max_index + # + max_index = 1 + max_sum = out [max_index, 4] + for (l = 2; l <= COUNT; l ++) { + if (out [l, 4] > max_sum) { + max_sum = out [l, 4] + max_index = l + } + } + seen [b] = 1 + } + } + } + k ++ + } + + # + # Print the array + # + for (i = 1; i <= COUNT; i ++) { + printf ("%d %d %d\n", out [i, 1], out [i, 2], out [i, 3]) + } +} + + diff --git a/challenge-148/abigail/bc/ch-2.bc b/challenge-148/abigail/bc/ch-2.bc new file mode 100644 index 0000000000..787b5ad28d --- /dev/null +++ b/challenge-148/abigail/bc/ch-2.bc @@ -0,0 +1,114 @@ +#!/usr/bin/bc + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: bc ch-2.bc +# + +count = 5 +for (i = 1; i <= count; i ++) { + out_a [i] = 999999 + out_b [i] = 999999 + out_c [i] = 999999 + out_sum [i] = out_a [i] + out_b [i] + out_c [i] +} + +max_index = 1 + +k = 0 + +while (3 * k + 2 <= out_sum [max_index]) { + a = 3 * k + 2 + f1 = k + 1 + f2 = 8 * k + 5 + + d1c = 0 + d2c = 0 + + # + # Find divisors of f1 + # + for (i = 1; i * i <= f1; i ++) { + if (f1 % i == 0) { + d1c = d1c + 1 + d1 [d1c] = i + if (i != f1 / i) { + d1c = d1c + 1 + d1 [d1c] = f1 / i + } + } + } + + # + # Find divisors of f2 which are squares + # + for (i = 1; i * i <= f2; i ++) { + if (f2 % i == 0) { + s1 = sqrt (i) + s2 = sqrt (f2 / i) + if (s1 * s1 == i) { + d2c = d2c + 1 + d2 [d2c] = s1 + } + if (s2 * s2 == f2 / i && s1 != s2) { + d2c = d2c + 1 + d2 [d2c] = s2 + } + } + } + + seen_c = 0 + + for (i = 1; i <= d1c; i ++) { + for (j = 1; j <= d2c; j ++) { + b = d1 [i] * d2 [j] + # + # Check if b is in seen + # + in_seen = 0 + for (m = 0; m < seen_c; m ++) { + if (seen [m] == b) { + in_seen = 1 + } + } + + if (in_seen == 0) { + c = f1 * f1 * f2 / (b * b) + if (a + b + c < out_sum [max_index]) { + out_a [max_index] = a + out_b [max_index] = b + out_c [max_index] = c + out_sum [max_index] = a + b + c + } + # + # Find the new max_index + # + max_index = 1 + max_sum = out_sum [max_index] + for (l = 2; l <= count; l ++) { + if (out_sum [l] > max_sum) { + max_sum = out_sum [l] + max_index = l + } + } + seen [seen_c] = 1 + seen_c = seen_c + 1 + } + } + } + k = k + 1 +} + +# +# Print the array +# +for (i = 1; i <= count; i ++) { + print out_a [i], " ", out_b [i], " ", out_c [i], " +" +} + + +halt diff --git a/challenge-148/abigail/t/ctest.ini b/challenge-148/abigail/t/ctest.ini index bfef483d85..5724371e18 100644 --- a/challenge-148/abigail/t/ctest.ini +++ b/challenge-148/abigail/t/ctest.ini @@ -6,3 +6,6 @@ [names] 1-1 = Fixed Output 2-1 = Fixed Output + +[2-1] +sort = a -- cgit From d19ae43e862cc67373983d1044d5ceb67d04f103 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 01:25:56 +0100 Subject: Week 148, part 2: C solution --- challenge-148/abigail/c/ch-2.c | 145 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 challenge-148/abigail/c/ch-2.c diff --git a/challenge-148/abigail/c/ch-2.c b/challenge-148/abigail/c/ch-2.c new file mode 100644 index 0000000000..63e2db46e1 --- /dev/null +++ b/challenge-148/abigail/c/ch-2.c @@ -0,0 +1,145 @@ +# include +# include +# include +# include +# include + +/* + * See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 + */ + +/* + * Run as: cc -o ch-2.o ch-2.c; ./ch-2.o + */ + +# define COUNT 5 +# define A 0 +# define B 1 +# define C 2 +# define SUM 3 +/* Overkill, but this will do */ +# define MAX_DIVISOR 100 + +int main (void) { + int ** out; + int k = 0; + + if ((out = (int **) malloc (COUNT * sizeof (int *))) == NULL) { + perror ("Malloc failed"); + return (1); + } + for (size_t i = 0; i < COUNT; i ++) { + if ((out [i] = (int *) malloc (SUM * sizeof (int))) == NULL) { + perror ("Malloc failed"); + return (1); + } + out [i] [A] = 999999; + out [i] [B] = 999999; + out [i] [C] = 999999; + out [i] [SUM] = out [i] [A] + out [i] [B] + out [i] [C]; + } + + size_t max_index = 0; + + + while (3 * k + 2 <= out [max_index] [SUM]) { + int a = 3 * k + 2; + int f1 = k + 1; + int f2 = 8 * k + 5; + + int * d1; + int * d2; + + if ((d1 = (int *) malloc (MAX_DIVISOR * sizeof (int))) == NULL) { + perror ("Malloc failed"); + return (1); + } + if ((d2 = (int *) malloc (MAX_DIVISOR * sizeof (int))) == NULL) { + perror ("Malloc failed"); + return (1); + } + + size_t d1c = 0; + size_t d2c = 0; + + /* + * Get the divisors for f1 + */ + for (int i = 1; i * i <= f1; i ++) { + if (f1 % i == 0) { + d1 [d1c ++] = i; + if (i != f1 / i) { + d1 [d1c ++] = f1 / i; + } + } + } + + /* + * Get the square divisors of f2 + */ + for (int i = 1; i * i <= f2; i ++) { + if (f2 % i == 0) { + int s1 = (int) sqrt (i); + int s2 = (int) sqrt (f2 / i); + if (s1 * s1 == i) { + d2 [d2c ++] = s1; + } + if (s2 * s2 == f2 / i && s2 != s1) { + d2 [d2c ++] = s2; + } + } + } + + for (size_t i = 0; i < d1c; i ++) { + for (size_t j = 0; j < d2c; j ++) { + int b = d1 [i] * d2 [j]; + int c = f1 * f1 * f2 / (b * b); + if (a + b + c < out [max_index] [SUM]) { + /* + * Avoid duplicates + */ + bool seen = false; + for (size_t i = 0; i < COUNT; i ++) { + if (out [i] [A] == a && out [i] [B] == b) { + seen = true; + break; + } + } + if (seen) { + break; + } + + out [max_index] [A] = a; + out [max_index] [B] = b; + out [max_index] [C] = c; + out [max_index] [SUM] = a + b + c; + + /* + * Find the next max index + */ + max_index = 0; + int max_sum = out [max_index] [SUM]; + for (size_t l = 1; l < COUNT; l ++) { + if (out [l] [SUM] > max_sum) { + max_sum = out [l] [SUM]; + max_index = l; + } + } + } + } + } + free (d1); + free (d2); + k ++; + } + + /* + * Print the array + */ + for (size_t i = 0; i < COUNT; i ++) { + printf ("%d %d %d\n", out [i] [A], out [i] [B], out [i] [C]); + free (out [i]); + } + + free (out); +} -- cgit From 24aca66317a7d95ccc2bbece07d3ad931698be0a Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 02:33:23 +0100 Subject: Week 148, part 2: Go solution --- challenge-148/abigail/go/ch-2.go | 122 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 challenge-148/abigail/go/ch-2.go diff --git a/challenge-148/abigail/go/ch-2.go b/challenge-148/abigail/go/ch-2.go new file mode 100644 index 0000000000..fd06cdadbd --- /dev/null +++ b/challenge-148/abigail/go/ch-2.go @@ -0,0 +1,122 @@ +package main + +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +// + +// +// Run as: go run ch-2.go +// + +import ( + "fmt" + "math" +) + +func main () { + const COUNT int = 5 + const A int = 0 + const B int = 1 + const C int = 2 + const SUM int = 3 + + out := [COUNT] [4] int {} + for i := 0; i < COUNT; i ++ { + out [i] [A] = 999999 + out [i] [B] = 999999 + out [i] [C] = 999999 + out [i] [SUM] = out [i] [A] + out [i] [B] + out [i] [C] + } + + max_index := 0 + + for k := 0; 3 * k + 2 <= out [max_index] [SUM]; k ++ { + a := 3 * k + 2 + f1 := k + 1 + f2 := 8 * k + 5 + + var d1 [] int + var d2 [] int + + // + // Get the divisors of f1 + // + for i := 1; i * i <= f1; i ++ { + if f1 % i == 0 { + d1 = append (d1, i) + if (i != f1 / i) { + d1 = append (d1, f1 / i) + } + } + } + + // + // Get the divisors of f2 (or rather, their square roots, + // if the square roots are integers) + // + + for i := 1; i * i <= f2; i ++ { + if (f2 % i == 0) { + s1 := int (math . Sqrt (float64 (i))) + s2 := int (math . Sqrt (float64 (f2 / i))) + if s1 * s1 == i { + d2 = append (d2, s1) + } + if s2 * s2 == f2 / i && s2 != s1 { + d2 = append (d2, s2) + } + } + } + + for _, d1v := range (d1) { + for _, d2v := range (d2) { + b := d1v * d2v + c := f1 * f1 * f2 / (b * b) + + if a + b + c < out [max_index] [SUM] { + // + // Avoid duplicates + // + seen := false + for i := 0; i < COUNT; i ++ { + if out [i] [A] == a && out [i] [B] == b { + seen = true + break + } + } + + if seen { + break + } + + // + // Update with better value + // + out [max_index] [A] = a + out [max_index] [B] = b + out [max_index] [C] = c + out [max_index] [SUM] = a + b + c + + // + // Find the next max index + // + max_index = 0 + max_sum := out [max_index] [SUM] + for l := 1; l < COUNT; l ++ { + if out [l] [SUM] > max_sum { + max_sum = out [l] [SUM] + max_index = l + } + } + } + } + } + } + + // + // Print the results + // + for i := 0; i < COUNT; i ++ { + fmt . Printf ("%d %d %d\n", out [i] [A], out [i] [B], out [i] [C]) + } +} -- cgit From 16ec1136a4482a64375accad41ebd2e391544bed Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 19:05:49 +0100 Subject: Week 148, part 2: Update AWK, bc and Perl solutions --- challenge-148/abigail/awk/ch-2.awk | 35 ++++++++++-------- challenge-148/abigail/bc/ch-2.bc | 39 ++++++++------------ challenge-148/abigail/perl/ch-2.pl | 74 ++++++++++++++++++++++++-------------- 3 files changed, 82 insertions(+), 66 deletions(-) diff --git a/challenge-148/abigail/awk/ch-2.awk b/challenge-148/abigail/awk/ch-2.awk index 58753e2615..7bbedf00a9 100644 --- a/challenge-148/abigail/awk/ch-2.awk +++ b/challenge-148/abigail/awk/ch-2.awk @@ -25,8 +25,7 @@ BEGIN { max_index = 1 # Index of largest sum - k = 0 - while (3 * k + 2 <= out [max_index, 4]) { + for (k = 0; 3 * k + 2 <= out [max_index, 4]; k ++) { a = 3 * k + 2 f1 = k + 1 f2 = 8 * k + 5 @@ -66,19 +65,29 @@ BEGIN { } } - delete seen - for (i = 1; i <= d1c; i ++) { for (j = 1; j <= d2c; j ++) { b = d1 [i] * d2 [j] - if (!(b in seen)) { - c = f1 * f1 * f2 / (b * b) - if (a + b + c < out [max_index, 4]) { - out [max_index, 1] = a - out [max_index, 2] = b - out [max_index, 3] = c - out [max_index, 4] = a + b + c + c = f1 * f1 * f2 / (b * b) + if (a + b + c < out [max_index, 4]) { + # + # Skip duplicates + # + seen = 0 + for (m = 1; m <= COUNT; m ++) { + if (out [m, 1] == a && out [m, 2] == b) { + seen = 1 + } } + if (seen) { + break + } + + out [max_index, 1] = a + out [max_index, 2] = b + out [max_index, 3] = c + out [max_index, 4] = a + b + c + # # Find the new max_index # @@ -90,11 +99,9 @@ BEGIN { max_index = l } } - seen [b] = 1 } } } - k ++ } # @@ -104,5 +111,3 @@ BEGIN { printf ("%d %d %d\n", out [i, 1], out [i, 2], out [i, 3]) } } - - diff --git a/challenge-148/abigail/bc/ch-2.bc b/challenge-148/abigail/bc/ch-2.bc index 787b5ad28d..cb9280ebb2 100644 --- a/challenge-148/abigail/bc/ch-2.bc +++ b/challenge-148/abigail/bc/ch-2.bc @@ -18,9 +18,7 @@ for (i = 1; i <= count; i ++) { max_index = 1 -k = 0 - -while (3 * k + 2 <= out_sum [max_index]) { +for (k = 0; 3 * k + 2 <= out_sum [max_index]; k ++) { a = 3 * k + 2 f1 = k + 1 f2 = 8 * k + 5 @@ -60,29 +58,25 @@ while (3 * k + 2 <= out_sum [max_index]) { } } - seen_c = 0 - for (i = 1; i <= d1c; i ++) { for (j = 1; j <= d2c; j ++) { b = d1 [i] * d2 [j] - # - # Check if b is in seen - # - in_seen = 0 - for (m = 0; m < seen_c; m ++) { - if (seen [m] == b) { - in_seen = 1 + c = f1 * f1 * f2 / (b * b) + if (a + b + c < out_sum [max_index]) { + seen = 0 + for (m = 1; m <= count; m ++) { + if (out_a [m] == a && out_b [m] == b) { + seen = 1 + } } - } - - if (in_seen == 0) { - c = f1 * f1 * f2 / (b * b) - if (a + b + c < out_sum [max_index]) { - out_a [max_index] = a - out_b [max_index] = b - out_c [max_index] = c - out_sum [max_index] = a + b + c + if (seen == 1) { + break } + + out_a [max_index] = a + out_b [max_index] = b + out_c [max_index] = c + out_sum [max_index] = a + b + c # # Find the new max_index # @@ -94,12 +88,9 @@ while (3 * k + 2 <= out_sum [max_index]) { max_index = l } } - seen [seen_c] = 1 - seen_c = seen_c + 1 } } } - k = k + 1 } # diff --git a/challenge-148/abigail/perl/ch-2.pl b/challenge-148/abigail/perl/ch-2.pl index a63742b3a6..00fc86d439 100644 --- a/challenge-148/abigail/perl/ch-2.pl +++ b/challenge-148/abigail/perl/ch-2.pl @@ -29,7 +29,8 @@ use experimental 'lexical_subs'; # Order them on (a1 + b1 + c1) <=> (a2 + b2 + c2)? # Order them on a1 <=> a2 || b1 <=> b2? # Order them on min (a1, b1, c1) <=> min (a2, b2, c2) (with ties -# broken on the second smallest number)? +# broken on the second smallest number)? (Since for each possible +# a, there is a solution with b = 1, this may be boring). # Some other order? # # We will pick the first one. @@ -81,26 +82,33 @@ use experimental 'lexical_subs'; # # -# So, how many k do we have to try? We start generating triples. -# As soon as we have 5 of them, we find the sum of the 5th triple. -# We then continue until 3 * k + 2 exceeds this sum. +# To know when we can stop generating triples, we keep the 5 best +# triples so far, updating them each time we find a better triple. +# Once 3 * k + 2 (= a) exceeds the sum of the fifth triple, we know +# we cannot find better. # use Math::Prime::Util qw [divisors]; use List::Util qw [sum max]; -my @out; - my $COUNT = 5; +my $A = 0; +my $B = 1; +my $C = 2; +my $SUM = 3; +my @out; +foreach my $i (0 .. $COUNT - 1) { + $out [$i] = [(999999) x 3]; + $out [$i] [$SUM] = sum @{$out [$i]}; +} -my $max; +my $max_index = 0; -for (my $k = 0; !$max || 3 * $k + 2 <= $max; $k ++) { - my $A = 3 * $k + 2; +for (my $k = 0; 3 * $k + 2 <= $out [$max_index] [$SUM]; $k ++) { + my $a = 3 * $k + 2; my $f1 = $k + 1; my $f2 = 8 * $k + 5; - my %seen; # # Divisors of (k + 1) # @@ -115,28 +123,40 @@ for (my $k = 0; !$max || 3 * $k + 2 <= $max; $k ++) { # Calculate all the solutions for b and c (for this k) # foreach my $d1 (@d1) { + D2: foreach my $d2 (@d2) { - $seen {$d1 * $d2} = ($f1) ** 2 * $f2 / ($d1 * $d1 * $d2 * $d2); + my $b = $d1 * $d2; + my $c = $f1 * $f1 * $f2 / ($b * $b); + if ($a + $b + $c < $out [$max_index] [$SUM]) { + # + # Avoid duplicate entries + # + foreach my $info (@out) { + next D2 if $$info [$A] == $a && $$info [$B] == $b; + } + + # + # Put triple in the output structure + # + $out [$max_index] = [$a, $b, $c, $a + $b + $c]; + + # + # Find the index of the new highest value + # + $max_index = 0; + my $max_sum = $out [$max_index] [$SUM]; + for (my $i = 1; $i < $COUNT; $i ++) { + if ($out [$i] [$SUM] > $max_sum) { + $max_index = $i; + $max_sum = $out [$i] [$SUM]; + } + } + } } } - - # - # Add solutions to @out - # - push @out => map {[$A, $_, $seen {$_}]} keys %seen; - - # - # Find the stopping requirement. - # - if (!$max && @out >= $COUNT) { - @out = sort {sum (@$a) <=> sum (@$b)} @out; - $max = sum @{$out [$COUNT - 1]}; - } } -@out = sort {sum (@$a) <=> sum (@$b)} @out; - -say "@$_" for @out [0 .. $COUNT - 1]; +say "@$_[$A, $B, $C]" for @out; __END__ -- cgit From d740a02f3781a8a2d3367ddf90a62a2c8be085d5 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 19:52:29 +0100 Subject: Week 148, part 2: Java solution --- challenge-148/abigail/java/ch-2.java | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 challenge-148/abigail/java/ch-2.java diff --git a/challenge-148/abigail/java/ch-2.java b/challenge-148/abigail/java/ch-2.java new file mode 100644 index 0000000000..84186c9359 --- /dev/null +++ b/challenge-148/abigail/java/ch-2.java @@ -0,0 +1,105 @@ +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +// + +// +// Run as: ln ch-2.java ch2.java; javac ch2.java; java ch2 +// + +import java.util.*; + +public class ch2 { + public static void main (String [] args) { + int COUNT = 5; + int A = 0; + int B = 1; + int C = 2; + int SUM = 3; + + int [] [] out = new int [COUNT] [4]; + for (int i = 0; i < COUNT; i ++) { + out [i] [A] = 999999; + out [i] [B] = 999999; + out [i] [C] = 999999; + out [i] [SUM] = out [i] [A] + out [i] [B] + out [i] [C]; + } + + int max_index = 0; + + for (int k = 0; 3 * k + 2 <= out [max_index] [SUM]; k ++) { + int a = 3 * k + 2; + int f1 = k + 1; + int f2 = 8 * k + 5; + + // + // Find the divisors of f1 + // + ArrayList d1 = new ArrayList (); + for (int i = 1; i * i <= f1; i ++) { + if (f1 % i == 0) { + d1 . add (i); + if (f1 / i != i) { + d1 . add (f1 / i); + } + } + } + + // + // Find square divisors of f2 + // + ArrayList d2 = new ArrayList (); + for (int i = 1; i * i <= f2; i ++) { + if (f2 % i == 0) { + int s1 = (int) Math . sqrt (i); + int s2 = (int) Math . sqrt (f2 / i); + if (s1 * s1 == i) { + d2 . add (s1); + } + if (s2 * s2 == f2 / i && s1 != s2) { + d2 . add (s2); + } + } + } + + for (int i = 0; i < d1 . size (); i ++) { + for (int j = 0; j < d2. size (); j ++) { + int b = d1 . get (i) * d2 . get (j); + int c = f1 * f1 * f2 / (b * b); + if (a + b + c < out [max_index] [SUM]) { + boolean seen = false; + for (int m = 0; m < COUNT; m ++) { + if (out [m] [A] == a && out [m] [B] == b) { + seen = true; + } + } + if (seen) { + break; + } + + out [max_index] [A] = a; + out [max_index] [B] = b; + out [max_index] [C] = c; + out [max_index] [SUM] = a + b + c; + + max_index = 0; + int max_sum = out [max_index] [SUM]; + for (int l = 1; l < COUNT; l ++) { + if (out [l] [SUM] > max_sum) { + max_index = l; + max_sum = out [l] [SUM]; + } + } + } + } + } + } + + // + // Print the results + // + for (int i = 0; i < COUNT; i ++) { + System . out . printf ("%d %d %d\n", out [i] [A], out [i] [B], + out [i] [C]); + } + } +} -- cgit From c0a1ddc5341c431716a712e6566dee87f22618a4 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 20:27:24 +0100 Subject: Week 148, part 2: Lua solution --- challenge-148/abigail/lua/ch-2.lua | 109 +++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 challenge-148/abigail/lua/ch-2.lua diff --git a/challenge-148/abigail/lua/ch-2.lua b/challenge-148/abigail/lua/ch-2.lua new file mode 100644 index 0000000000..a03897d859 --- /dev/null +++ b/challenge-148/abigail/lua/ch-2.lua @@ -0,0 +1,109 @@ +#!/opt/local/bin/lua + +-- +-- See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +-- + +-- +-- Run as: lua ch-2.lua +-- + +local COUNT = 5 +local A = 0 +local B = 1 +local C = 2 +local SUM = 3 +local out = {} +for i = 1, COUNT do + out [i] = {} + out [i] [A] = 999999 + out [i] [B] = 999999 + out [i] [C] = 999999 + out [i] [SUM] = out [i] [A] + out [i] [B] + out [i] [C] +end + +local k = 0 +local max_index = 1 + +while 3 * k + 2 <= out [max_index] [SUM] do + local a = 3 * k + 2 + local f1 = k + 1 + local f2 = 8 * k + 5 + + -- + -- Find divisors of f1 + -- + local d1 = {} + local i = 0 + while i * i <= f1 do + if f1 % i == 0 then + d1 [#d1 + 1] = i + if f1 / i ~= i then + d1 [#d1 + 1] = f1 / i + end + end + i = i + 1 + end + + local d2 = {} + i = 0 + while i * i <= f2 do + if f2 % i == 0 then + local s1 = math . floor (math . sqrt (i)) + local s2 = math . floor (math . sqrt (f2 / i)) + if s1 * s1 == i then + d2 [#d2 + 1] = s1 + end + if s2 * s2 == f2 / i and s1 ~= s2 then + d2 [#d2 + 1] = s2 + end + end + i = i + 1 + end + + local d1v + local d2v + + for _, d1v in ipairs (d1) do + for _, d2v in ipairs (d2) do + local b = d1v * d2v + local c = f1 * f1 * f2 / (b * b) + if (a + b + c) < out [max_index] [SUM] then + local i + for i = 1, COUNT do + if out [i] [A] == a and out [i] [B] == b then + goto end_loop + end + end + + out [max_index] [A] = a + out [max_index] [B] = b + out [max_index] [C] = c + out [max_index] [SUM] = a + b + c + + -- + -- Find new max_index + -- + + max_index = 1 + local max_sum = out [max_index] [SUM] + + local l + for l = 2, COUNT do + if max_sum < out [l] [SUM] then + max_index = l + max_sum = out [l] [SUM] + end + end + end + ::end_loop:: + end + end + + k = k + 1 +end + +for i = 1, COUNT do + print (out [i] [A] .. " " .. out [i] [B] .. " " .. out [i] [C]) +end + -- cgit From d117981c9ef4874e03ff7548b922a76c34528592 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 20:30:04 +0100 Subject: Week 148, part 2: adjust Perl comment --- challenge-148/abigail/perl/ch-2.pl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/challenge-148/abigail/perl/ch-2.pl b/challenge-148/abigail/perl/ch-2.pl index 00fc86d439..929818748a 100644 --- a/challenge-148/abigail/perl/ch-2.pl +++ b/challenge-148/abigail/perl/ch-2.pl @@ -88,6 +88,11 @@ use experimental 'lexical_subs'; # we cannot find better. # +# +# Note that while we generate and print the first 5 triplets, we +# will NOT print them in order. This is not a requirement. +# + use Math::Prime::Util qw [divisors]; use List::Util qw [sum max]; -- cgit From 332261fd786252cfbcfc0d250ebb01e1a5b0c1ed Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 22:46:33 +0100 Subject: Week 148, part 2: Node.js solution --- challenge-148/abigail/node/ch-2.js | 101 +++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 challenge-148/abigail/node/ch-2.js diff --git a/challenge-148/abigail/node/ch-2.js b/challenge-148/abigail/node/ch-2.js new file mode 100644 index 0000000000..e4de579767 --- /dev/null +++ b/challenge-148/abigail/node/ch-2.js @@ -0,0 +1,101 @@ +#!/usr/local/bin/node + +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +// + +// +// Run as: node ch-2.js +// + + +let COUNT = 5 +let A = 0 +let B = 1 +let C = 2 +let SUM = 3 +let out = [] +for (let i = 0; i < COUNT; i ++) { + out . push ([999999, 999999, 999999, 999999 * 3]) +} + +let max_index = 0 + +for (let k = 0; 3 * k + 2 <= out [max_index] [SUM]; k ++) { + let a = 3 * k + 2 + let f1 = k + 1 + let f2 = 8 * k + 5 + + // + // Find divisors of f1 + // + let d1 = [] + for (let i = 1; i * i <= f1; i ++) { + if (f1 % i == 0) { + d1 . push (i) + if (i != f1 / i) { + d1 . push (f1 / i) + } + } + } + + // + // Find square divisors of f2 + // + let d2 = [] + for (let i = 1; i * i <= f2; i ++) { + if (f2 % i == 0) { + let s1 = Math . floor (Math . sqrt (i)) + let s2 = Math . floor (Math . sqrt (f2 / i)) + if (s1 * s1 == i) { + d2 . push (s1) + } + if (s2 * s2 == f2 / i && s1 != s2) { + d2 . push (s2) + } + } + } + + for (let i = 0; i < d1 . length; i ++) { + for (let j = 0; j < d2 . length; j ++) { + let b = d1 [i] * d2 [j] + let c = f1 * f1 * f2 / (b * b) + if (a + b + c < out [max_index] [SUM]) { + let seen = false + for (let l = 0; l < COUNT; l ++) { + if (out [l] [A] == a && out [l] [B] == b) { + seen = true + } + } + if (seen) { + break + } + + out [max_index] [A] = a + out [max_index] [B] = b + out [max_index] [C] = c + out [max_index] [SUM] = a + b + c + + // + // Find new max_index + // + + max_index = 0 + let max_sum = out [max_index] [SUM] + for (let m = 1; m < COUNT; m ++) { + if (max_sum < out [m] [SUM]) { + max_index = m + max_sum = out [m] [SUM] + } + } + } + } + } +} + +const printf = require ('printf') + +for (let i = 0; i < COUNT; i ++) { + printf (process . stdout, + "%d %d %d\n", out [i] [A], out [i] [B], out [i] [C]) +} -- cgit From 81279df84fe4c79c7189ea34068e1e27b4ffcd7e Mon Sep 17 00:00:00 2001 From: Abigail Date: Sat, 22 Jan 2022 23:24:53 +0100 Subject: Week 148, part 2: Pascal solution --- challenge-148/abigail/pascal/ch-2.p | 121 ++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 challenge-148/abigail/pascal/ch-2.p diff --git a/challenge-148/abigail/pascal/ch-2.p b/challenge-148/abigail/pascal/ch-2.p new file mode 100644 index 0000000000..0909bb8660 --- /dev/null +++ b/challenge-148/abigail/pascal/ch-2.p @@ -0,0 +1,121 @@ +Program ch2; + +(* *) +(* See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 *) +(* *) + +(* *) +(* Run as: fpc -och-2.out ch-2.p; ./ch-2.out *) +(* *) + +const + COUNT = 5; + Ai = 0; + Bi = 1; + Ci = 2; + SUMi = 3; + +var + out: array [0 .. (COUNT - 1), Ai .. SUMi] of longword; + d1, d2: array of longword; + i, j, k, l, a, b, c, f1, f2, s1, s2: longword; + max_index: integer; + max_sum: longword; + seen: boolean; + +begin + for i := 0 to COUNT - 1 do begin + out [i, Ai] := 999999; + out [i, Bi] := 999999; + out [i, Ci] := 999999; + out [i, SUMi] := out [i, Ai] + out [i, Bi] + out [i, Ci]; + end; + + max_index := 0; + + k := 0; + while 3 * k + 2 <= out [max_index, SUMi] do begin + a := 3 * k + 2; + f1 := k + 1; + f2 := 8 * k + 5; + + setlength (d1, 0); + setlength (d2, 0); + + (* *) + (* Find divisors of f1 *) + (* *) + i := 1; + while i * i <= f1 do begin + if f1 mod i = 0 then begin + setlength (d1, 1 + length (d1)); + d1 [length (d1) - 1] := i; + if i <> (f1 div i) then begin + setlength (d1, 1 + length (d1)); + d1 [length (d1) - 1] := f1 div i; + end; + end; + inc (i); + end; + + (* *) + (* Find square divisors of f2 *) + (* *) + i := 1; + while i * i <= f2 do begin + if f2 mod i = 0 then begin + s1 := round (sqrt (i)); + s2 := round (sqrt (f2 div i)); + + if s1 * s1 = i then begin + setlength (d2, 1 + length (d2)); + d2 [length (d2) - 1] := s1; + end; + + if s2 * s2 = f2 div i then begin + setlength (d2, 1 + length (d2)); + d2 [length (d2) - 1] := s2; + end; + end; + inc (i); + end; + + for i := 0 to length (d1) - 1 do begin + for j := 0 to length (d2) -1 do begin + b := d1 [i] * d2 [j]; + c := f1 * f1 * f2 div (b * b); + if a + b + c < out [max_index, SUMi] then begin + seen := false; + for l := 0 to COUNT - 1 do begin + if (out [l, Ai] = a) and (out [l, Bi] = b) then begin + seen := true; + end; + end; + if seen then begin + break; + end; + + out [max_index, Ai] := a; + out [max_index, Bi] := b; + out [max_index, Ci] := c; + out [max_index, SUMi] := a + b + c; + + max_index := 0; + max_sum := out [max_index, SUMi]; + + for l := 1 to COUNT - 1 do begin + if max_sum < out [l, SUMi] then begin + max_index := l; + max_sum := out [l, SUMi]; + end; + end; + end; + end; + end; + inc (k); + end; + + for i := 0 to COUNT - 1 do begin + writeln (out [i, Ai], ' ', out [i, Bi], ' ', out [i, Ci]); + end; +end. -- cgit From eaba548a0b2e083112048955222a190a382b7a12 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sun, 23 Jan 2022 13:49:04 +0100 Subject: Week 148, part 2: Python solution --- challenge-148/abigail/python/ch-2.py | 80 ++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 challenge-148/abigail/python/ch-2.py diff --git a/challenge-148/abigail/python/ch-2.py b/challenge-148/abigail/python/ch-2.py new file mode 100644 index 0000000000..e867dbb0f8 --- /dev/null +++ b/challenge-148/abigail/python/ch-2.py @@ -0,0 +1,80 @@ +#!/usr/local/bin/python3 + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: python ch-2.py +# + +import math + +COUNT = 5 +A = 0 +B = 1 +C = 2 +SUM = 3 +out = [] +for i in range (COUNT): + out . append ([999999, 999999, 999999, 999999 * 3]) + +max_index = 0 +k = 0 + + +while 3 * k + 2 < out [max_index] [SUM]: + a = 3 * k + 2 + f1 = k + 1 + f2 = 8 * k + 5 + + d1 = [] + for i in range (1, f1 + 1): + if i * i > f1: + break + if f1 % i == 0: + d1 . append (i) + if i != f1 // i: + d1 . append (f1 // i) + + + d2 = [] + for i in range (1, f2 + 1): + if i * i > f2: + break + if f2 % i == 0: + s1 = math . isqrt (i) + s2 = math . isqrt (f2 // i) + if s1 * s1 == i: + d2 . append (s1) + if s2 * s2 == f2 // i and s1 != s2: + d2 . append (s2) + + for d1v in d1: + for d2v in d2: + b = d1v * d2v + c = f1 * f1 * f2 // (b * b) + + if a + b + c < out [max_index] [SUM]: + seen = False + for i in range (COUNT): + if out [i] [A] == a and out [i] [B] == b: + seen = true + break + if seen: + break + + out [max_index] = [a, b, c, a + b + c] + + max_index = 0 + max_sum = out [max_index] [SUM] + for i in range (1, COUNT): + if max_sum < out [i] [SUM]: + max_sum = out [i] [SUM] + max_index = i + + k = k + 1 + + +for i in range (COUNT): + print (out [i] [A], out [i] [B], out [i] [C]) -- cgit From 13af2d474b88031642215c3bbb35585c8f7020d7 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sun, 23 Jan 2022 14:32:20 +0100 Subject: Week 148, part 2: R solution --- challenge-148/abigail/r/ch-2.r | 95 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 challenge-148/abigail/r/ch-2.r diff --git a/challenge-148/abigail/r/ch-2.r b/challenge-148/abigail/r/ch-2.r new file mode 100644 index 0000000000..6fe97a5511 --- /dev/null +++ b/challenge-148/abigail/r/ch-2.r @@ -0,0 +1,95 @@ +#!/usr/local/bin/Rscript + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: Rscript ch-2.r +# + +COUNT <- 5 +A <- 1 +B <- 2 +C <- 3 +SUM <- 4 +out <- list () +for (i in 1 : COUNT) { + out [[i]] = c (999999, 999999, 999999, 3 * 999999) +} + +max_index <- 1 +k <- 0 + +while (3 * k + 2 < out [[max_index]] [[SUM]]) { + a <- 3 * k + 2 + f1 <- k + 1 + f2 <- 8 * k + 5 + + d1 <- c () + for (i in 1 : f1) { + if (i * i > f1) { + break + } + if (f1 %% i == 0) { + d1 <- c (d1, i) + if (i != f1 / i) { + d1 <- c (d1, f1 / i) + } + } + } + + + d2 <- c () + for (i in 1 : f2) { + if (i * i > f2) { + break + } + if (f2 %% i == 0) { + s1 <- floor (sqrt (i)) + s2 <- floor (sqrt (f2 / i)) + if (s1 * s1 == i) { + d2 <- c (d2, s1) + } + if (s2 * s2 == f2 / i && s1 != s2) { + d2 <- c (d2, s2) + } + } + } + + for (d1v in d1) { + for (d2v in d2) { + b <- d1v * d2v + c <- f1 * f1 * f2 / (b * b) + if (a + b + c < out [[max_index]] [[SUM]]) { + seen <- FALSE + for (i in 1 : COUNT) { + if (out [[i]] [[A]] == a && out [[i]] [[B]] == b) { + seen <- TRUE + } + } + if (seen) { + break + } + + out [[max_index]] = c (a, b, c, a + b + c) + + max_index <- 1 + max_sum <- out [[max_index]] [[SUM]] + + for (i in 2 : COUNT) { + if (max_sum < out [[i]] [[SUM]]) { + max_sum <- out [[i]] [[SUM]] + max_index <- i + } + } + } + } + } + + k <- k + 1 +} + +for (i in 1 : COUNT) { + cat (out [[i]] [[A]], out [[i]] [[B]], out [[i]] [[C]], "\n") +} -- cgit From 577e48ca0393ab9c4c9f96d3872867262ec994e9 Mon Sep 17 00:00:00 2001 From: Abigail Date: Sun, 23 Jan 2022 17:48:33 +0100 Subject: Week 148, part 2: Ruby solution --- challenge-148/abigail/ruby/ch-2.rb | 95 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 challenge-148/abigail/ruby/ch-2.rb diff --git a/challenge-148/abigail/ruby/ch-2.rb b/challenge-148/abigail/ruby/ch-2.rb new file mode 100644 index 0000000000..860f1ff1b7 --- /dev/null +++ b/challenge-148/abigail/ruby/ch-2.rb @@ -0,0 +1,95 @@ +#!/usr/bin/ruby + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148 +# + +# +# Run as: ruby ch-2.rb +# + +count = 5 +out = [] +a_i = 0 +b_i = 1 +c_i = 2 +sum_i = 3 +for i in 0 .. count - 1 do + out . push ([999999, 999999, 999999, 999999 * 3]) +end + +max_index = 0 +k = 0 + +while 3 * k + 2 < out [max_index] [sum_i] do + a = 3 * k + 2 + f1 = k + 1 + f2 = 8 * k + 5 + + d1 = [] + for i in 1 .. f1 do + if i * i > f1 then + next + end + if f1 % i == 0 then + d1 . push (i) + if i != f1 / i then + d1 . push (f1 / i) + end + end + end + + d2 = [] + for i in 1 .. f2 do + if i * i > f2 then + next + end + if f2 % i == 0 then + s1 = Math . sqrt(i) . floor() + s2 = Math . sqrt(f2 / i) . floor() + if s1 * s1 == i then + d2 . push (s1) + end + if (s2 * s2 == f2 / i) && s1 != s2 then + d2 . push (s2) + end + end + end + + d1 . each do |d1v| + d2 . each do |d2v| + b = d1v * d2v + c = f1 * f1 * f2 / (b * b) + if a + b + c < out [max_index] [sum_i] then + seen = false + out . each do |entry| + if entry [a_i] == a && entry [b_i] == b then + seen = true + end + end + if seen then + next + end + + out [max_index] = [a, b, c, a + b + c] + + max_index = 0 + max_sum = out [max_index] [sum_i] + for i in 1 .. count - 1 do + if max_sum < out [i] [sum_i] then + max_index = i + max_sum = out [i] [sum_i] + end + end + end + end