From 687e35cda69c6db8454ad4860cdc9e1df7b39d75 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 1 May 2024 14:06:10 +0200 Subject: calculate engagements with ravine --- tools/engage.js | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 tools/engage.js (limited to 'tools') diff --git a/tools/engage.js b/tools/engage.js new file mode 100644 index 0000000..5b5ed90 --- /dev/null +++ b/tools/engage.js @@ -0,0 +1,167 @@ +"use strict" + +function array_insert(array, index, item) { + for (let i = array.length; i > index; --i) + array[i] = array[i - 1] + array[index] = item +} + +function set_add(set, item) { + let a = 0 + let b = set.length - 1 + while (a <= b) { + let m = (a + b) >> 1 + let x = set[m] + if (item < x) + b = m - 1 + else if (item > x) + a = m + 1 + else + return + } + array_insert(set, a, item) +} + +const A1 = 0, A2 = 1, A3 = 2 +const D1 = 3, D2 = 4, D3 = 5 + +const NAMES = [ + "A1", "A2", "A3", + "D1", "D2", "D3", +] + +function show_array(array) { + for (let row = 0; row < 6; row += 3) { + let s = [] + for (let col = 0; col < 3; ++col) { + if (array[row+col]) + s.push(NAMES[row+col].padEnd(3, ' ')) + else + s.push("-- ") + } + console.log(s.join(" ")) + } + console.log("") +} + +function verify(array, out) { + for (let i = 0; i < 6; ++i) { + if (array[i]) { + let okay = false + for (let eng of out) + if (eng.includes(i)) + okay = true + if (!okay) + return false + } + } + return true +} + +function make_engagement(array, choice) { + let out = [] + let a, b + + function engage(a, b) { + for (let eng of out) { + if (eng.includes(a)) { + set_add(eng, b) + return + } + if (eng.includes(b)) { + set_add(eng, a) + return + } + } + out.push([a,b]) + } + + // A1 vs D1 etc + if (array[A1] && array[D1]) engage(A1, D1) + if (array[A2] && array[D2]) engage(A2, D2) + if (array[A3] && array[D3]) engage(A3, D3) + + // A1 vs D2/D3 etc + if (array[A1] && !array[D1] && array[D2]) engage(A1, D2) + if (array[A1] && !array[D1] && !array[D2] && array[D3]) engage(A1, D3) + + if (array[A3] && !array[D3] && array[D2]) engage(A3, D2) + if (array[A3] && !array[D3] && !array[D2] && array[D1]) engage(A3, D1) + + if (array[D1] && !array[A1] && array[A2]) engage(D1, A2) + if (array[D1] && !array[A1] && !array[A2] && array[A3]) engage(D1, A3) + + if (array[D3] && !array[A3] && array[A2]) engage(D3, A2) + if (array[D3] && !array[A3] && !array[A2] && array[A1]) engage(D3, A1) + + // A2 vs D1/D3 + if (array[A2] && !array[D2]) { + if (array[D1] && !array[D3]) engage(A2, D1) + if (!array[D1] && array[D3]) engage(A2, D3) + if (choice) + if (array[D1] && array[D3]) engage(A2, choice === 1 ? D1 : D3) + } + + // D2 vs A1/D3 + if (array[D2] && !array[A2]) { + if (array[A1] && !array[A3]) engage(D2, A1) + if (!array[A1] && array[A3]) engage(D2, A3) + if (choice) + if (array[A1] && array[A3]) engage(D2, choice === 1 ? A1 : A3) + } + + if (verify(array, out)) { + console.log(out.map(eng => eng.map(x=>NAMES[x]).join("+")).join(" / ")) + return out + } + return null +} + +const ENGAGEMENTS = [] +const CHOICE = [] + +function run(bits, array) { + console.log("") + console.log("") + show_array(array) + console.log("") + let eng = make_engagement(array, 0) + ENGAGEMENTS[bits] = eng + if (!eng) { + let eng_a = make_engagement(array, 1) + console.log("or") + let eng_b = make_engagement(array, 2) + CHOICE.push([ bits, eng_a, eng_b ]) + } +} + +function runall() { + for (let x = 0; x < 64; ++x) { + if ((x & 7) && (x & 56)) + run(x, [ (x>>5)&1, (x>>4)&1, (x>>3)&1, (x>>2)&1, (x>>1)&1, (x>>0)&1 ]) + } +} + +console.log("") +console.log("") +console.log("") +runall() + +//run([1,1,0, 1,0,1]) + +//run([1,1,1, 1,1,0]) +//run([1,1,1, 0,1,0]) +//run([1,0,1, 0,1,0]) + +//run([1,0,1, 0,1,0]) +//run([0,1,1, 1,0,0]) +//run([1,0,0, 0,1,1]) +//run([1,1,0, 1,0,1]) +//run([1,1,1, 1,0,1]) + +console.log("
") + +console.log("
")
+console.log("const ENGAGEMENTS = " + JSON.stringify(ENGAGEMENTS))
+for (let [bits,a,b] of CHOICE)
+	console.log("const ENGAGEMENTS_" + bits + " = " + JSON.stringify([a,b]))
-- 
cgit v1.2.3