From 5d85095ac13e0acc59fb736de2b9338b8c4c7dd0 Mon Sep 17 00:00:00 2001 From: Reimar Date: Wed, 16 Apr 2025 13:55:18 +0200 Subject: [PATCH] Fix stats and layout, implement automatic pausing/starting --- generator.js | 2 -- index.html | 5 +++-- main.js | 53 ++++++++++++++++++++++++++++++++++++++++++---------- style.css | 9 +++++++++ worker.js | 1 - 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/generator.js b/generator.js index 3616abf..be99cc5 100644 --- a/generator.js +++ b/generator.js @@ -1,5 +1,4 @@ function myFunction(elmnt) { - console.log(elmnt.style.backgroundColor); if (elmnt.style.backgroundColor == "white") { elmnt.style.backgroundColor = "hsl(120, 100%, 75%)"; } else { @@ -60,7 +59,6 @@ function contains_digits(rows) { return true; } function generate_rows_check() { - console.log(rows); var rows = new Array(generate_row(), generate_row(), generate_row()); while (!contains_digits(rows)) { var rows = new Array(generate_row(), generate_row(), generate_row()); diff --git a/index.html b/index.html index dacbb87..c7277d6 100644 --- a/index.html +++ b/index.html @@ -47,17 +47,18 @@
Numbers - +
- + 0 boards tried   (0.00/sec) +
diff --git a/main.js b/main.js index 6825fed..e8a7363 100644 --- a/main.js +++ b/main.js @@ -1,14 +1,18 @@ let paused = false; +let autoStart = true; let workers = []; let totalTime = 0; +let startedAt; let totalAttempts = 0; let names = []; fetch("names.json").then(res => res.json()).then(json => names = json); function showStats() { + const time = totalTime + (Date.now() - startedAt); + 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) { @@ -36,7 +40,17 @@ function resetWorkers() { function runWorkers() { const numbers = [].map.call(document.getElementsByClassName("number-input"), input => input.valueAsNumber) .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(); @@ -63,7 +77,6 @@ function runWorkers() { if (!paused) worker.postMessage({ type: "run" }); break; case "stats": - totalTime += message.data.time; totalAttempts += message.data.attempts; showStats(); @@ -71,6 +84,16 @@ function runWorkers() { case "log": log(message.data.text, message.data.id); break; + case "winner": + document.getElementById("result-list").innerHTML += + `
+ Winner: ${message.data.name} +
+ (${winTypeLabel} — ${numbers.join(", ")}) +
`; + + setPaused(true); + autoStart = true; case "terminate": worker.terminate(); 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 => { // Add new input field on enter if (event.key === "Enter") { @@ -136,13 +174,8 @@ document.getElementById("numbers-container").addEventListener("keydown", event = }); document.getElementById("pause").addEventListener("click", event => { - paused = !paused; - - for (const worker of workers) { - worker.postMessage({ type: paused ? "stop" : "run" }); - } - - event.target.innerText = paused ? "Start" : "Pause"; + setPaused(!paused); + autoStart = false; }); document.getElementById("workers").value = navigator.hardwareConcurrency ?? 1; diff --git a/style.css b/style.css index ba19d3b..8018d48 100644 --- a/style.css +++ b/style.css @@ -43,6 +43,15 @@ main { width: 400px; } +#result-list div { + margin-top: 1rem; + line-height: 1; +} + +#result-list .winner { + color: #2E7D32; +} + #log { height: 200px; width: 400px; diff --git a/worker.js b/worker.js index ee4a58d..1317388 100644 --- a/worker.js +++ b/worker.js @@ -64,7 +64,6 @@ function guess() { const wonRows = getRowsWon(board, numbers); if (hasWon(wonRows, winType)) { - console.log(board, board.filter(row => hasWonRow(row, numbers)), numbers); self.postMessage({ type: "winner", name }); self.postMessage({ type: "log", text: `Found winner: ${name}`, id: workerId }); }