homepage/content/blog/2022-10-10-CLRG-Scoring-Art.../speculator.mjs

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()
}