104 lines
3.2 KiB
JavaScript
104 lines
3.2 KiB
JavaScript
|
import { awardPoints } from "./awardPoints.mjs"
|
||
|
|
||
|
function arraysEqual(a, b) {
|
||
|
if (a === b) return true;
|
||
|
if (a == null || b == null) return false;
|
||
|
if (a.length != b.length) return false;
|
||
|
|
||
|
for (let i = 0; i < a.length; ++i) {
|
||
|
if (a[i] !== b[i]) return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
function awardPossibilities(total=0, depth=1) {
|
||
|
if (depth == 1) {
|
||
|
if (awardPoints.includes(total)) {
|
||
|
return [[total]]
|
||
|
} else {
|
||
|
return []
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let possibilities = []
|
||
|
for (let p of awardPoints) {
|
||
|
if (p <= total) {
|
||
|
for (let subPossibility of awardPossibilities(total - p, depth - 1)) {
|
||
|
let v = [p].concat(subPossibility)
|
||
|
v.sort((a,b) => b-a)
|
||
|
possibilities.push(v)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
possibilities.sort((a,b) => b.reduce((a,b) => a*100+b) - a.reduce((a,b) => a*100+b))
|
||
|
let uniquePossibilities = []
|
||
|
for (let p of possibilities) {
|
||
|
if (uniquePossibilities.length == 0 || !arraysEqual(p, uniquePossibilities[uniquePossibilities.length - 1])) {
|
||
|
uniquePossibilities.push(p)
|
||
|
}
|
||
|
}
|
||
|
return uniquePossibilities
|
||
|
}
|
||
|
|
||
|
function speculate(calc) {
|
||
|
let points = calc.querySelector("[name=points]").value || 0
|
||
|
let adjudicators = calc.querySelector("[name=adjudicators]").value || 3
|
||
|
let results = calc.querySelector(".results tbody")
|
||
|
while (results.firstChild) {
|
||
|
results.removeChild(results.firstChild)
|
||
|
}
|
||
|
|
||
|
for (let warning of calc.querySelectorAll(".warning")) {
|
||
|
if (adjudicators >3) {
|
||
|
warning.classList.add("visible")
|
||
|
setTimeout(() => asyncSpeculate(calc, points, adjudicators), 0)
|
||
|
} else {
|
||
|
warning.classList.remove("visible")
|
||
|
asyncSpeculate(calc, points, adjudicators)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
async function asyncSpeculate(calc, points, adjudicators) {
|
||
|
let results = calc.querySelector(".results tbody")
|
||
|
let possibilites = awardPossibilities(points, adjudicators)
|
||
|
|
||
|
if (possibilites.length == 0) {
|
||
|
let row = results.appendChild(document.createElement("tr"))
|
||
|
let cell = row.appendChild(document.createElement("th"))
|
||
|
cell.textContent = "No possible combinations"
|
||
|
} else {
|
||
|
let row = results.appendChild(document.createElement("tr"))
|
||
|
for (let i = 1; i <= adjudicators; ++i) {
|
||
|
let cell = row.appendChild(document.createElement("th"))
|
||
|
cell.textContent = "Adj. " + i
|
||
|
}
|
||
|
for (let possibility of possibilites) {
|
||
|
let row = results.appendChild(document.createElement("tr"))
|
||
|
for (let p of possibility) {
|
||
|
let cell = row.appendChild(document.createElement("td"))
|
||
|
cell.textContent = p
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for (let warning of calc.querySelectorAll(".warning")) {
|
||
|
warning.classList.remove("visible")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function init() {
|
||
|
for (let calc of document.querySelectorAll(".speculator")) {
|
||
|
for (let input of calc.querySelectorAll("input")) {
|
||
|
input.addEventListener("input", () => speculate(calc))
|
||
|
}
|
||
|
speculate(calc)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (document.readyState === "loading") {
|
||
|
document.addEventListener("DOMContentLoaded", init)
|
||
|
} else {
|
||
|
init()
|
||
|
}
|
||
|
|