diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-04-21 03:17:24 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-21 03:17:24 +0100 |
| commit | 39c3ac8c65f6fa3d0a86e5af47727eec086e162a (patch) | |
| tree | dcf4b98ce7b81891e16890b8f2038ac5f88da996 | |
| parent | 1e5b01b2442702e3883de56994fc3d81e188be72 (diff) | |
| parent | 8c47bd0020101f64614229cbae7ea991720a6199 (diff) | |
| download | perlweeklychallenge-club-39c3ac8c65f6fa3d0a86e5af47727eec086e162a.tar.gz perlweeklychallenge-club-39c3ac8c65f6fa3d0a86e5af47727eec086e162a.tar.bz2 perlweeklychallenge-club-39c3ac8c65f6fa3d0a86e5af47727eec086e162a.zip | |
Merge pull request #3935 from stuart-little/stuart-little_109_node
1st commit on 109_node
| -rwxr-xr-x | challenge-109/stuart-little/node/ch-1.js | 5 | ||||
| -rwxr-xr-x | challenge-109/stuart-little/node/ch-2.js | 72 |
2 files changed, 77 insertions, 0 deletions
diff --git a/challenge-109/stuart-little/node/ch-1.js b/challenge-109/stuart-little/node/ch-1.js new file mode 100755 index 0000000000..4473ce70c0 --- /dev/null +++ b/challenge-109/stuart-little/node/ch-1.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +// run <script> + +console.log("0, 0, 0, 2, 0, 5, 0, 6, 3, 7, 0, 15, 0, 9, 8, 14, 0, 20, 0, 21"); diff --git a/challenge-109/stuart-little/node/ch-2.js b/challenge-109/stuart-little/node/ch-2.js new file mode 100755 index 0000000000..52af5408a8 --- /dev/null +++ b/challenge-109/stuart-little/node/ch-2.js @@ -0,0 +1,72 @@ +#!/usr/bin/env node + +// run <script> <space-separated numbers> + +/* +Heap's algorithm for generating permutations + +Refs: + +[0] https://stackoverflow.com/a/37580979/11064961 +[1] https://en.m.wikipedia.org/wiki/Heap's_algorithm +*/ + +function permute(arr) { + let length = arr.length, + result = [arr.slice()], + c = new Array(length).fill(0), + i = 1, k, p; + + while (i < length) { + if (c[i] < i) { + k = i % 2 && c[i]; + p = arr[i]; + arr[i] = arr[k]; + arr[k] = p; + ++c[i]; + i = 1; + result.push(arr.slice()); + } else { + c[i] = 0; + ++i; + } + } + return result; +} + +Array.prototype.sum = function () { + return this.reduce((acc,val) => acc + val, 0) +} + +function checkAllSumsEqNr(nr,ar,bl) { + if (ar.length <= 3) { + return (nr == ar.sum()) && bl + }; + return checkAllSumsEqNr( + nr, + ar.slice(2), + (nr == ar.slice(0,3).sum()) && bl + ) +}; + +function allSumsEq(ar) { + if (ar.length <= 2) { + return true; + }; + return checkAllSumsEqNr( + ar.slice(0,2).sum(), + ar.slice(1), + true + ) +}; + +function pprnt(ar) { + const sm = ar.slice(0,2).sum(); + const lettersId = ar.map((v,i) => `${String.fromCharCode(97+i)} = ${ar[i]}`).join(", "); + return `\nSolution: ${lettersId}\nSum: ${sm}`; +} + +const inpt = process.argv.slice(2).map(x => parseInt(x,10)); +const sols = permute([...inpt]).filter(allSumsEq); + +console.log((sols.length == 0) ? ("No solution.") : (sols.map(pprnt).join("\n"))); |
