Fix stats and layout, implement automatic pausing/starting

This commit is contained in:
Reimar 2025-04-16 13:55:18 +02:00
parent d0c5959836
commit 5d85095ac1
Signed by: Reimar
GPG Key ID: 93549FA07F0AE268
5 changed files with 55 additions and 15 deletions

View File

@ -1,5 +1,4 @@
function myFunction(elmnt) { function myFunction(elmnt) {
console.log(elmnt.style.backgroundColor);
if (elmnt.style.backgroundColor == "white") { if (elmnt.style.backgroundColor == "white") {
elmnt.style.backgroundColor = "hsl(120, 100%, 75%)"; elmnt.style.backgroundColor = "hsl(120, 100%, 75%)";
} else { } else {
@ -60,7 +59,6 @@ function contains_digits(rows) {
return true; return true;
} }
function generate_rows_check() { function generate_rows_check() {
console.log(rows);
var rows = new Array(generate_row(), generate_row(), generate_row()); var rows = new Array(generate_row(), generate_row(), generate_row());
while (!contains_digits(rows)) { while (!contains_digits(rows)) {
var rows = new Array(generate_row(), generate_row(), generate_row()); var rows = new Array(generate_row(), generate_row(), generate_row());

View File

@ -47,17 +47,18 @@
<div id="numbers-container"> <div id="numbers-container">
<fieldset class="input-container"> <fieldset class="input-container">
<legend>Numbers</legend> <legend>Numbers</legend>
<input class="number-input" type="number" min="1" max="90"> <input class="number-input" type="number" min="1" max="90" autocomplete="off">
</fieldset> </fieldset>
</div> </div>
<div id="results"> <div id="results">
<button id="pause">Pause</button> <button id="pause">Start</button>
&emsp; &emsp;
<b> <b>
<span id="attempts">0</span> boards tried &emsp; <span id="attempts">0</span> boards tried &emsp;
(<span id="speed">0.00</span>/sec) (<span id="speed">0.00</span>/sec)
</b> </b>
<div id="result-list"></div>
</div> </div>
<div> <div>

53
main.js
View File

@ -1,14 +1,18 @@
let paused = false; let paused = false;
let autoStart = true;
let workers = []; let workers = [];
let totalTime = 0; let totalTime = 0;
let startedAt;
let totalAttempts = 0; let totalAttempts = 0;
let names = []; let names = [];
fetch("names.json").then(res => res.json()).then(json => names = json); fetch("names.json").then(res => res.json()).then(json => names = json);
function showStats() { function showStats() {
const time = totalTime + (Date.now() - startedAt);
document.getElementById("attempts").innerText = totalAttempts; document.getElementById("attempts").innerText = totalAttempts;
document.getElementById("speed").innerText = (totalAttempts / totalTime).toFixed(2); // TODO fix totalTime document.getElementById("speed").innerText = (totalAttempts / time).toFixed(2);
} }
function log(text, workerId) { function log(text, workerId) {
@ -36,7 +40,17 @@ function resetWorkers() {
function runWorkers() { function runWorkers() {
const numbers = [].map.call(document.getElementsByClassName("number-input"), input => input.valueAsNumber) const numbers = [].map.call(document.getElementsByClassName("number-input"), input => input.valueAsNumber)
.filter(value => !isNaN(value)); .filter(value => !isNaN(value));
const winType = document.querySelector("input[name=win-type]:checked").value;
if (numbers.length < 4) return;
if (paused && !autoStart) return;
setPaused(false);
startedAt = Date.now();
const selectedWinType = document.querySelector("input[name=win-type]:checked");
const winType = selectedWinType.value;
const winTypeLabel = selectedWinType.parentElement.innerText.trim();
resetWorkers(); resetWorkers();
@ -63,7 +77,6 @@ function runWorkers() {
if (!paused) worker.postMessage({ type: "run" }); if (!paused) worker.postMessage({ type: "run" });
break; break;
case "stats": case "stats":
totalTime += message.data.time;
totalAttempts += message.data.attempts; totalAttempts += message.data.attempts;
showStats(); showStats();
@ -71,6 +84,16 @@ function runWorkers() {
case "log": case "log":
log(message.data.text, message.data.id); log(message.data.text, message.data.id);
break; break;
case "winner":
document.getElementById("result-list").innerHTML +=
`<div>
<span class="winner">Winner:</span> <b>${message.data.name}</b>
<br>
<small>(${winTypeLabel} &mdash; ${numbers.join(", ")})</small>
</div>`;
setPaused(true);
autoStart = true;
case "terminate": case "terminate":
worker.terminate(); worker.terminate();
workers.splice(workers.indexOf(worker), 1); workers.splice(workers.indexOf(worker), 1);
@ -83,6 +106,21 @@ function runWorkers() {
} }
} }
function setPaused(value) {
paused = value;
for (const worker of workers) {
worker.postMessage({ type: paused ? "stop" : "run" });
}
document.getElementById("pause").innerText = paused ? "Start" : "Pause";
if (paused)
totalTime += (Date.now() - startedAt);
startedAt = Date.now();
}
document.getElementById("numbers-container").addEventListener("keydown", event => { document.getElementById("numbers-container").addEventListener("keydown", event => {
// Add new input field on enter // Add new input field on enter
if (event.key === "Enter") { if (event.key === "Enter") {
@ -136,13 +174,8 @@ document.getElementById("numbers-container").addEventListener("keydown", event =
}); });
document.getElementById("pause").addEventListener("click", event => { document.getElementById("pause").addEventListener("click", event => {
paused = !paused; setPaused(!paused);
autoStart = false;
for (const worker of workers) {
worker.postMessage({ type: paused ? "stop" : "run" });
}
event.target.innerText = paused ? "Start" : "Pause";
}); });
document.getElementById("workers").value = navigator.hardwareConcurrency ?? 1; document.getElementById("workers").value = navigator.hardwareConcurrency ?? 1;

View File

@ -43,6 +43,15 @@ main {
width: 400px; width: 400px;
} }
#result-list div {
margin-top: 1rem;
line-height: 1;
}
#result-list .winner {
color: #2E7D32;
}
#log { #log {
height: 200px; height: 200px;
width: 400px; width: 400px;

View File

@ -64,7 +64,6 @@ function guess() {
const wonRows = getRowsWon(board, numbers); const wonRows = getRowsWon(board, numbers);
if (hasWon(wonRows, winType)) { if (hasWon(wonRows, winType)) {
console.log(board, board.filter(row => hasWonRow(row, numbers)), numbers);
self.postMessage({ type: "winner", name }); self.postMessage({ type: "winner", name });
self.postMessage({ type: "log", text: `Found winner: ${name}`, id: workerId }); self.postMessage({ type: "log", text: `Found winner: ${name}`, id: workerId });
} }