diff options
| author | Abigail <abigail@abigail.be> | 2021-04-24 18:46:41 +0200 |
|---|---|---|
| committer | Abigail <abigail@abigail.be> | 2021-04-24 18:46:41 +0200 |
| commit | 078dca365480326018fc5482e7c465a9e77824c4 (patch) | |
| tree | 5a669486f214ddc2e94877db5622756b267a637c | |
| parent | 25e939a2a8539bdcf3890e18a7665cde7a2b67df (diff) | |
| download | perlweeklychallenge-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.js | 114 | ||||
| -rw-r--r-- | challenge-109/abigail/ruby/ch-2.rb | 48 |
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 |
