This commit is contained in:
@@ -1,149 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { shuffle } from "radash";
|
|
||||||
import { FormEvent, useState, useRef, useCallback, useEffect } from "react";
|
|
||||||
|
|
||||||
export default function Sim(): React.JSX.Element {
|
|
||||||
const [outputs, setOutputs] = useState<
|
|
||||||
{ runs: number; tickets: number; totalWin: number }[]
|
|
||||||
>([]);
|
|
||||||
|
|
||||||
const workerRef = useRef<Worker>();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
workerRef.current = new Worker(
|
|
||||||
new URL("../workers/sim.ts", import.meta.url)
|
|
||||||
);
|
|
||||||
workerRef.current.onmessage = (event) =>
|
|
||||||
console.log(`WebWorker Response => ${JSON.stringify(event.data)}`);
|
|
||||||
return () => {
|
|
||||||
workerRef.current?.terminate();
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
function runCalc(opts: {
|
|
||||||
prizes: number[];
|
|
||||||
fee: number;
|
|
||||||
ticketsAlreadySold: number;
|
|
||||||
ticketsTotal: number;
|
|
||||||
}): void {
|
|
||||||
const totalPrizePool = opts.prizes.reduce((total, prize) => {
|
|
||||||
return total + prize;
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
const ticketsToBuy = 1;
|
|
||||||
|
|
||||||
const ret =
|
|
||||||
(totalPrizePool - opts.fee * ticketsToBuy) / ticketsAlreadySold +
|
|
||||||
ticketsToBuy;
|
|
||||||
const worth = ret > opts.fee;
|
|
||||||
return worth;
|
|
||||||
}
|
|
||||||
|
|
||||||
const runSim = (
|
|
||||||
runs: number,
|
|
||||||
tickets: number
|
|
||||||
): Promise<{ runs: number; tickets: number; totalWin: number }> => {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
const allWinnings = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < runs; i++) {
|
|
||||||
let winnings = 0;
|
|
||||||
|
|
||||||
const soldTickets = shuffle(
|
|
||||||
Array.from({ length: tickets }).map((_, index) => index)
|
|
||||||
);
|
|
||||||
const prizes = shuffle([500, 350, 150]);
|
|
||||||
|
|
||||||
while (prizes.length > 0) {
|
|
||||||
const drawnTicket = soldTickets.pop();
|
|
||||||
if (drawnTicket) {
|
|
||||||
const thisWin = prizes.pop() ?? 0;
|
|
||||||
if (drawnTicket < tickets) {
|
|
||||||
winnings += thisWin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
allWinnings.push(winnings);
|
|
||||||
}
|
|
||||||
const totalWin = allWinnings.reduce((total, win) => {
|
|
||||||
return total + win;
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
resolve({
|
|
||||||
runs,
|
|
||||||
tickets,
|
|
||||||
totalWin,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function onSubmit(event: FormEvent<HTMLFormElement>): void {
|
|
||||||
event.preventDefault();
|
|
||||||
const formData = new FormData(event.currentTarget);
|
|
||||||
const opts = {
|
|
||||||
prizes: formData.get("prizes"),
|
|
||||||
prizes: formData.get("fee"),
|
|
||||||
prizes: formData.get("ticketsAlreadySold"),
|
|
||||||
prizes: formData.get("ticketsTotal"),
|
|
||||||
};
|
|
||||||
const wrapper = async (): Promise<void> => {
|
|
||||||
if ((runs ?? 0) > 0 && (tickets ?? 0) > 0) {
|
|
||||||
workerRef.current?.postMessage(opts);
|
|
||||||
//const output = await runSim(runs, tickets);
|
|
||||||
//setOutputs([...outputs, output]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
void wrapper();
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<form className="dark:text-white" onSubmit={onSubmit}>
|
|
||||||
<label>Prizes</label>
|
|
||||||
<br />
|
|
||||||
<input className="text-black" type="text" name="prizes" />
|
|
||||||
<br />
|
|
||||||
<label>Fee</label>
|
|
||||||
<br />
|
|
||||||
<input className="text-black" type="text" name="fee" />
|
|
||||||
<br />
|
|
||||||
<label>Tickets sold</label>
|
|
||||||
<br />
|
|
||||||
<input className="text-black" type="text" name="ticketsAlreadySold" />
|
|
||||||
<br />
|
|
||||||
<label>Tickets total</label>
|
|
||||||
<br />
|
|
||||||
<input className="text-black" type="text" name="ticketsTotal" />
|
|
||||||
<br />
|
|
||||||
<button className="p-2 dark:bg-dracula-bg-lighter rounded-sm" type="submit">
|
|
||||||
Run
|
|
||||||
</button>
|
|
||||||
<br />
|
|
||||||
</form>
|
|
||||||
<br />
|
|
||||||
{outputs.length ? (
|
|
||||||
<table className={"dark:text-white"}>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Runs</th>
|
|
||||||
<th>Tickets</th>
|
|
||||||
<th>Winnings</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{outputs.map((output, index) => {
|
|
||||||
return (
|
|
||||||
<tr key={index}>
|
|
||||||
<td>{output.runs}</td>
|
|
||||||
<td>{output.tickets}</td>
|
|
||||||
<td>{output.totalWin}</td>
|
|
||||||
</tr>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
) : null}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user