diff options
| author | Abigail <abigail@abigail.freedom.nl> | 2022-01-21 19:58:25 +0100 |
|---|---|---|
| committer | Abigail <abigail@abigail.freedom.nl> | 2022-01-21 19:58:25 +0100 |
| commit | 48dd880935791025ec68f869b9975b13d1e03a5c (patch) | |
| tree | 359d1d2558a21e40756ff5ee59209c6dc1448d76 | |
| parent | 9a94bb5aafe258c41d5dd25045e4de79476aa2b3 (diff) | |
| download | perlweeklychallenge-club-48dd880935791025ec68f869b9975b13d1e03a5c.tar.gz perlweeklychallenge-club-48dd880935791025ec68f869b9975b13d1e03a5c.tar.bz2 perlweeklychallenge-club-48dd880935791025ec68f869b9975b13d1e03a5c.zip | |
Week 148, part 2: AWK & bc solutions
| -rw-r--r-- | challenge-148/abigail/awk/ch-2.awk | 108 | ||||
| -rw-r--r-- | challenge-148/abigail/bc/ch-2.bc | 114 | ||||
| -rw-r--r-- | challenge-148/abigail/t/ctest.ini | 3 |
3 files changed, 225 insertions, 0 deletions
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
|
