Implement finding winner

This commit is contained in:
Reimar 2025-04-12 15:09:50 +02:00
parent 6f358ec977
commit f117b4348c
Signed by: Reimar
GPG Key ID: 93549FA07F0AE268
3 changed files with 60 additions and 24 deletions

View File

@ -24,7 +24,7 @@
</label> </label>
<label> <label>
<input type="radio" name="win-type" value="full"> <input type="radio" name="win-type" value="full-board">
Full board Full board
</label> </label>
</fieldset> </fieldset>
@ -38,7 +38,7 @@
<div> <div>
<fieldset id="numbers-container" class="input-container"> <fieldset id="numbers-container" class="input-container">
<legend>Numbers</legend> <legend>Numbers</legend>
<input type="number" min="1" max="90"> <input class="number-input" type="number" min="1" max="90">
</fieldset> </fieldset>
</div> </div>
@ -46,8 +46,8 @@
<button id="pause">Pause</button> <button id="pause">Pause</button>
&emsp; &emsp;
<b> <b>
<span id="attempts">--</span> plates tried &emsp; <span id="attempts">0</span> boards tried &emsp;
(<span id="speed">--</span>/sec) (<span id="speed">0.00</span>/sec)
</b> </b>
</div> </div>

View File

@ -31,11 +31,17 @@ function resetWorkers() {
} }
function runWorkers() { 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;
resetWorkers(); resetWorkers();
const amount = document.getElementById("workers").valueAsNumber; const amount = document.getElementById("workers").valueAsNumber;
log(`Creating ${amount} workers`); log(`Creating ${amount} workers`);
log(`* Win type: ${winType}`);
log(`* Numbers: ${numbers.join(", ")}`);
for (let i = 0; i < amount; i++) { for (let i = 0; i < amount; i++) {
const worker = new Worker("worker.js"); const worker = new Worker("worker.js");
@ -60,7 +66,7 @@ function runWorkers() {
} }
}); });
worker.postMessage({ type: "init", id: i + 1 }); worker.postMessage({ type: "init", id: i + 1, numbers, winType });
workers.push(worker); workers.push(worker);
} }
} }
@ -70,6 +76,7 @@ document.getElementById("numbers-container").addEventListener("keydown", event =
if (event.key === "Enter") { if (event.key === "Enter") {
const input = document.createElement("input"); const input = document.createElement("input");
input.type = "number"; input.type = "number";
input.className = "number-input";
input.min = 1; input.min = 1;
input.max = 90; input.max = 90;

View File

@ -1,9 +1,10 @@
importScripts("seedrandom.js"); importScripts("seedrandom.js");
importScripts("generator.js"); importScripts("generator.js");
console.log("worker");
let workerId; let workerId;
let winType;
let numbers;
let currentInput = ""; let currentInput = "";
let attempts = 0; let attempts = 0;
let startedAt; let startedAt;
@ -11,7 +12,7 @@ let startedAt;
let statsInterval; let statsInterval;
let guessInterval; let guessInterval;
function getNumbers(name) { function getBoard(name) {
Math.seedrandom(name); Math.seedrandom(name);
let numbers = []; let numbers = [];
@ -21,27 +22,15 @@ function getNumbers(name) {
} }
const activatedCols = generate_rows_check(); const activatedCols = generate_rows_check();
const activatedNumbers = []; const board = [[], [], []];
for (let row = 0; row < 3; row++) { for (let row = 0; row < 3; row++) {
for (const col of activatedCols[row]) { for (const col of activatedCols[row]) {
activatedNumbers.push(numbers[(col - 1) * 3 + row]); board[row].push(numbers[(col - 1) * 3 + row]);
} }
} }
return activatedNumbers; return board;
}
function sendStats() {
if (!startedAt) return;
self.postMessage({ type: "stats", attempts, time: Date.now() - startedAt });
resetStats();
}
function resetStats() {
attempts = 0;
startedAt = Date.now();
} }
function generateNextInput(input) { function generateNextInput(input) {
@ -61,11 +50,49 @@ function generateNextInput(input) {
return alphabet[0] + input; return alphabet[0] + input;
} }
function hasWonRow(row, numbers) {
return numbers.every(number => row.includes(number));
}
function getRowsWon(board, numbers) {
return board.filter(row => hasWonRow(row, numbers)).length;
}
function hasWon(wonRows, winType) {
switch (winType) {
case "row":
return wonRows >= 1;
case "two-rows":
return wonRows >= 2;
case "full-board":
return wonRows >= 3;
}
}
function guess() { function guess() {
currentInput = generateNextInput(currentInput); currentInput = generateNextInput(currentInput);
attempts++; attempts++;
// TODO const board = getBoard(currentInput);
const wonRows = getRowsWon(board, numbers);
if (hasWon(wonRows, winType)) {
self.postMessage({ type: "winner", name: currentInput });
self.postMessage({ type: "log", text: `Found winner: ${currentInput}`, id: workerId });
}
}
function sendStats() {
if (!startedAt) return;
self.postMessage({ type: "stats", attempts, time: Date.now() - startedAt });
resetStats();
}
function resetStats() {
attempts = 0;
startedAt = Date.now();
} }
function run() { function run() {
@ -90,6 +117,8 @@ self.onmessage = message => {
switch (message.data.type) { switch (message.data.type) {
case "init": case "init":
workerId = message.data.id; workerId = message.data.id;
winType = message.data.winType;
numbers = message.data.numbers;
self.postMessage({ type: "ready" }); self.postMessage({ type: "ready" });
break; break;
case "run": case "run":