aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2021-04-24 18:46:41 +0200
committerAbigail <abigail@abigail.be>2021-04-24 18:46:41 +0200
commit078dca365480326018fc5482e7c465a9e77824c4 (patch)
tree5a669486f214ddc2e94877db5622756b267a637c
parent25e939a2a8539bdcf3890e18a7665cde7a2b67df (diff)
downloadperlweeklychallenge-club-078dca365480326018fc5482e7c465a9e77824c4.tar.gz
perlweeklychallenge-club-078dca365480326018fc5482e7c465a9e77824c4.tar.bz2
perlweeklychallenge-club-078dca365480326018fc5482e7c465a9e77824c4.zip
Node.js and Ruby solutions for week 109, part 2
-rw-r--r--challenge-109/abigail/node/ch-2.js114
-rw-r--r--challenge-109/abigail/ruby/ch-2.rb48
2 files changed, 162 insertions, 0 deletions
diff --git a/challenge-109/abigail/node/ch-2.js b/challenge-109/abigail/node/ch-2.js
new file mode 100644
index 0000000000..bce08dfbc7
--- /dev/null
+++ b/challenge-109/abigail/node/ch-2.js
@@ -0,0 +1,114 @@
+#!/usr/local/bin/node
+
+//
+// See ../README.md
+//
+
+//
+// Run as: node ch-2.js < input-file
+//
+
+let SIZE = 7
+let printf = require ('printf')
+
+require ('readline')
+. createInterface ({input: process . stdin})
+. on ('line', _ => main (_ . split (/\s+/) . map (_ => +_)))
+;
+
+
+function main (numbers) {
+ //
+ // First, we create a datastructure to collect all the
+ // differences between two numbers, with the restriction
+ // that the difference is present in numbers
+ //
+ let differences = {}
+ numbers . forEach (n => differences [n] = [])
+
+ numbers . forEach ((x, x_i) => {
+ numbers . forEach ((y, y_i) => {
+ if (x_i != y_i) {
+ let diff = x - y
+ if (differences [diff]) {
+ differences [diff] . push ([x_i, y_i])
+ }
+ }
+ })
+ })
+
+ //
+ // For each number d in numbers, with index d_i, find all pairs
+ // of distinct numbers, all with index other than d_i, where the
+ // differences of each pair is d.
+ //
+ numbers . forEach ((d, d_i) => {
+ let diffs = differences [d]
+ for (let x = 0; x < diffs . length; x ++) {
+ //
+ // Ignore any difference involving d_i
+ //
+ if (diffs [x] [0] == d_i || diffs [x] [1] == d_i) {
+ continue
+ }
+ for (let y = x + 1; y < diffs . length; y ++) {
+ //
+ // Second diff should not involve d_i, and all its
+ // elemenst should be different from the first diff
+ //
+ if (diffs [y] [0] == d_i || diffs [y] [1] == d_i ||
+ diffs [x] [0] == diffs [y] [0] ||
+ diffs [x] [0] == diffs [y] [1] ||
+ diffs [x] [1] == diffs [y] [0] ||
+ diffs [x] [1] == diffs [y] [1]) {
+ continue
+ }
+ //
+ // W.l.o.g we can now assume diff [x] gives us a_i and c_i,
+ // and diff [y] gives use g_i and e_i
+ //
+ let [a_i, c_i] = diffs [x]
+ let [g_i, e_i] = diffs [y]
+
+ //
+ // Find the two possibilities for b_i and f_i
+ //
+ for (let b_i = 0; b_i < numbers . length; b_i ++) {
+ if (b_i == a_i || b_i == c_i || b_i == d_i ||
+ b_i == e_i || b_i == g_i) {
+ continue
+ }
+ for (let f_i = 0; f_i < numbers . length; f_i ++) {
+ if (f_i == a_i || f_i == b_i || f_i == c_i ||
+ f_i == d_i || f_i == e_i || f_i == g_i) {
+ continue
+ }
+ //
+ // Do we have a winner?
+ //
+ let target = numbers [a_i] + numbers [b_i]
+ if (target == numbers [b_i] + numbers [c_i] +
+ numbers [d_i] &&
+ target == numbers [d_i] + numbers [e_i] +
+ numbers [f_i] &&
+ target == numbers [f_i] + numbers [g_i]) {
+ //
+ // Print the results, and the reverse
+ //
+ printf (process . stdout, "%d %d %d %d %d %d %d\n",
+ numbers [a_i], numbers [b_i],
+ numbers [c_i], numbers [d_i],
+ numbers [e_i], numbers [f_i],
+ numbers [g_i])
+ printf (process . stdout, "%d %d %d %d %d %d %d\n",
+ numbers [g_i], numbers [f_i],
+ numbers [e_i], numbers [d_i],
+ numbers [c_i], numbers [b_i],
+ numbers [a_i])
+ }
+ }
+ }
+ }
+ }
+ })
+}
diff --git a/challenge-109/abigail/ruby/ch-2.rb b/challenge-109/abigail/ruby/ch-2.rb
new file mode 100644
index 0000000000..faaa7b8489
--- /dev/null
+++ b/challenge-109/abigail/ruby/ch-2.rb
@@ -0,0 +1,48 @@
+#!/usr/bin/ruby
+
+#
+# See ../README.md
+#
+
+#
+# Run as: ruby ch-2.rb < input-file
+#
+
+SIZE = 7
+
+#
+# Brute force all possibilities, with early returns.
+#
+ARGF . each_line do |_|
+ numbers = (_ . split) . map {|_| _ . to_i}
+
+ numbers . each_with_index do |a, a_i|
+ numbers . each_with_index do |b, b_i|
+ next if a_i == b_i
+ target = a + b
+ numbers . each_with_index do |c, c_i|
+ next if a_i == c_i || b_i == c_i
+ numbers . each_with_index do |d, d_i|
+ next if a_i == d_i || b_i == d_i || c_i == d_i
+ next if target != b + c + d
+ numbers . each_with_index do |e, e_i|
+ next if a_i == e_i || b_i == e_i || c_i == e_i ||
+ d_i == e_i
+ numbers . each_with_index do |f, f_i|
+ next if a_i == f_i || b_i == f_i || c_i == f_i ||
+ d_i == f_i || e_i == f_i
+ next if target != d + e + f
+ numbers . each_with_index do |g, g_i|
+ next if a_i == g_i || b_i == g_i ||
+ c_i == g_i || d_i == g_i ||
+ e_i == g_i || f_i == g_i
+ next if target != f + g
+ puts "#{a} #{b} #{c} #{d} #{e} #{f} #{g}"
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end