Implement worker names, batch sizes, correctly detect when won

This commit is contained in:
Reimar 2025-04-16 13:22:22 +02:00
parent f117b4348c
commit d0c5959836
Signed by: Reimar
GPG Key ID: 93549FA07F0AE268
4 changed files with 69 additions and 36 deletions

View File

@ -31,12 +31,21 @@
<fieldset class="input-container"> <fieldset class="input-container">
<legend>Workers</legend> <legend>Workers</legend>
<input id="workers" type="number" min="1" value="1">
<label>
Amount:
<input id="workers" type="number" min="1" value="1" style="width: 70px;">
</label>
<label>
Batch size:
<input id="batch-size" type="number" min="1" value="1000" style="width: 100px;">
</label>
</fieldset> </fieldset>
</div> </div>
<div> <div id="numbers-container">
<fieldset id="numbers-container" 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">
</fieldset> </fieldset>
@ -51,10 +60,12 @@
</b> </b>
</div> </div>
<div>
<fieldset> <fieldset>
<legend>Log</legend> <legend>Log</legend>
<div id="log"></div> <div id="log"></div>
</fieldset> </fieldset>
</div>
</main> </main>
</body> </body>
</html> </html>

16
main.js
View File

@ -2,10 +2,13 @@ let paused = false;
let workers = []; let workers = [];
let totalTime = 0; let totalTime = 0;
let totalAttempts = 0; let totalAttempts = 0;
let names = [];
fetch("names.json").then(res => res.json()).then(json => names = json);
function showStats() { function showStats() {
document.getElementById("attempts").innerText = totalAttempts; document.getElementById("attempts").innerText = totalAttempts;
document.getElementById("speed").innerText = (totalAttempts / totalTime).toFixed(2); document.getElementById("speed").innerText = (totalAttempts / totalTime).toFixed(2); // TODO fix totalTime
} }
function log(text, workerId) { function log(text, workerId) {
@ -38,12 +41,21 @@ function runWorkers() {
resetWorkers(); resetWorkers();
const amount = document.getElementById("workers").valueAsNumber; const amount = document.getElementById("workers").valueAsNumber;
const batchSize = document.getElementById("batch-size").valueAsNumber;
log(`Creating ${amount} workers`); log(`Creating ${amount} workers`);
log(`* Win type: ${winType}`); log(`* Win type: ${winType}`);
log(`* Numbers: ${numbers.join(", ")}`); log(`* Numbers: ${numbers.join(", ")}`);
const usedNames = [];
for (let i = 0; i < amount; i++) { for (let i = 0; i < amount; i++) {
let name;
do
name = names[Math.floor(Math.random() * names.length)];
while (usedNames.includes(name));
usedNames.push(name);
const worker = new Worker("worker.js"); const worker = new Worker("worker.js");
worker.addEventListener("message", message => { worker.addEventListener("message", message => {
switch (message.data.type) { switch (message.data.type) {
@ -66,7 +78,7 @@ function runWorkers() {
} }
}); });
worker.postMessage({ type: "init", id: i + 1, numbers, winType }); worker.postMessage({ type: "init", id: i + 1, numbers, winType, name, batchSize });
workers.push(worker); workers.push(worker);
} }
} }

View File

@ -18,11 +18,26 @@ main {
.input-container { .input-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex-wrap: wrap;
gap: 0.5rem; gap: 0.5rem;
background-color: #EEE; background-color: #EEE;
margin: 0.5rem; margin: 0.5rem;
} }
#numbers-container .input-container {
max-height: 800px;
display: flex;
flex-direction: row;
}
#numbers-container input {
flex-basis: calc(50% - 4px);
}
#numbers-container {
width: 400px;
}
#results { #results {
margin-top: 1rem; margin-top: 1rem;
width: 400px; width: 400px;

View File

@ -2,10 +2,12 @@ importScripts("seedrandom.js");
importScripts("generator.js"); importScripts("generator.js");
let workerId; let workerId;
let workerName;
let winType; let winType;
let numbers; let numbers;
let batchSize;
let currentInput = ""; let nameIndex = 0;
let attempts = 0; let attempts = 0;
let startedAt; let startedAt;
@ -33,25 +35,8 @@ function getBoard(name) {
return board; return board;
} }
function generateNextInput(input) {
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
if (input.length === 0)
return alphabet[0];
for (let i = input.length - 1; i >= 0; i--) {
const index = alphabet.indexOf(input[i]);
if (index < alphabet.length - 1) {
return input.substring(0, i) + alphabet[index + 1] + alphabet[0].repeat(input.length - i - 1);
}
}
return alphabet[0] + input;
}
function hasWonRow(row, numbers) { function hasWonRow(row, numbers) {
return numbers.every(number => row.includes(number)); return row.every(number => numbers.includes(number));
} }
function getRowsWon(board, numbers) { function getRowsWon(board, numbers) {
@ -70,16 +55,19 @@ function hasWon(wonRows, winType) {
} }
function guess() { function guess() {
currentInput = generateNextInput(currentInput); for (let i = 0; i < 100; i++) {
const name = workerName + nameIndex++;
attempts++; attempts++;
const board = getBoard(currentInput); const board = getBoard(name);
const wonRows = getRowsWon(board, numbers); const wonRows = getRowsWon(board, numbers);
if (hasWon(wonRows, winType)) { if (hasWon(wonRows, winType)) {
self.postMessage({ type: "winner", name: currentInput }); console.log(board, board.filter(row => hasWonRow(row, numbers)), numbers);
self.postMessage({ type: "log", text: `Found winner: ${currentInput}`, id: workerId }); self.postMessage({ type: "winner", name });
self.postMessage({ type: "log", text: `Found winner: ${name}`, id: workerId });
}
} }
} }
@ -105,9 +93,14 @@ function run() {
} }
function stop() { function stop() {
if (!statsInterval && !guessInterval) return;
clearInterval(statsInterval); clearInterval(statsInterval);
clearInterval(guessInterval); clearInterval(guessInterval);
statsInterval = null;
guessInterval = null;
sendStats(); sendStats();
self.postMessage({ type: "log", text: "Stopping worker", id: workerId }); self.postMessage({ type: "log", text: "Stopping worker", id: workerId });
@ -117,8 +110,10 @@ self.onmessage = message => {
switch (message.data.type) { switch (message.data.type) {
case "init": case "init":
workerId = message.data.id; workerId = message.data.id;
workerName = message.data.name;
winType = message.data.winType; winType = message.data.winType;
numbers = message.data.numbers; numbers = message.data.numbers;
batchSize = message.data.batchSize;
self.postMessage({ type: "ready" }); self.postMessage({ type: "ready" });
break; break;
case "run": case "run":