aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.freedom.nl>2022-01-21 19:58:25 +0100
committerAbigail <abigail@abigail.freedom.nl>2022-01-21 19:58:25 +0100
commit48dd880935791025ec68f869b9975b13d1e03a5c (patch)
tree359d1d2558a21e40756ff5ee59209c6dc1448d76
parent9a94bb5aafe258c41d5dd25045e4de79476aa2b3 (diff)
downloadperlweeklychallenge-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.awk108
-rw-r--r--challenge-148/abigail/bc/ch-2.bc114
-rw-r--r--challenge-148/abigail/t/ctest.ini3
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