Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1eb2d0706
|
||
|
|
726d35aaea
|
+62
-32
@@ -40,10 +40,21 @@
|
|||||||
|
|
||||||
let best_words: Promise<EvaluateWordsResult> | null = $state(null);
|
let best_words: Promise<EvaluateWordsResult> | null = $state(null);
|
||||||
let best_words_progress: EvaluateWordsProgress | null = $state(null);
|
let best_words_progress: EvaluateWordsProgress | null = $state(null);
|
||||||
|
let solving: boolean = $state(false);
|
||||||
|
|
||||||
let w_lines: WordleLine[] = [];
|
let w_lines: WordleLine[] = $state([]);
|
||||||
let cursor = $state(0);
|
let cursor = $state(0);
|
||||||
|
|
||||||
|
async function toggleSolver() {
|
||||||
|
if (solving) {
|
||||||
|
await stopSolver();
|
||||||
|
} else {
|
||||||
|
best_words = solver_evaluate_words(5, (p) => {
|
||||||
|
best_words_progress = p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function reset() {
|
async function reset() {
|
||||||
await solver_reset(use_default_wordle_answers);
|
await solver_reset(use_default_wordle_answers);
|
||||||
|
|
||||||
@@ -73,6 +84,38 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function doGuess() {
|
||||||
|
const guess = guesses[guesses.length - 1];
|
||||||
|
|
||||||
|
if (guess.letters.join("").length != 5) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
infos_gained[infos_gained.length - 1] = solver_guess(
|
||||||
|
guess.letters,
|
||||||
|
guess.colors,
|
||||||
|
);
|
||||||
|
infos_gained.push(null);
|
||||||
|
solution_space = solver_solution_space();
|
||||||
|
|
||||||
|
cursor = 0;
|
||||||
|
|
||||||
|
guesses.push({
|
||||||
|
letters: ["", "", "", "", ""],
|
||||||
|
colors: [
|
||||||
|
Color.GREY,
|
||||||
|
Color.GREY,
|
||||||
|
Color.GREY,
|
||||||
|
Color.GREY,
|
||||||
|
Color.GREY,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
await tick();
|
||||||
|
|
||||||
|
w_lines[w_lines.length - 1].focus();
|
||||||
|
}
|
||||||
|
|
||||||
async function handleKey(event: KeyboardEvent) {
|
async function handleKey(event: KeyboardEvent) {
|
||||||
if (/^[a-zA-Z ]$/.test(event.key)) {
|
if (/^[a-zA-Z ]$/.test(event.key)) {
|
||||||
w_lines[guesses.length - 1].focus();
|
w_lines[guesses.length - 1].focus();
|
||||||
@@ -85,35 +128,7 @@
|
|||||||
} else if (event.key === "Escape") {
|
} else if (event.key === "Escape") {
|
||||||
await stopSolver();
|
await stopSolver();
|
||||||
} else if (event.key === "Enter") {
|
} else if (event.key === "Enter") {
|
||||||
const guess = guesses[guesses.length - 1];
|
await doGuess();
|
||||||
|
|
||||||
if (guess.letters.join("").length != 5) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
infos_gained[infos_gained.length - 1] = solver_guess(
|
|
||||||
guess.letters,
|
|
||||||
guess.colors,
|
|
||||||
);
|
|
||||||
infos_gained.push(null);
|
|
||||||
solution_space = solver_solution_space();
|
|
||||||
|
|
||||||
cursor = 0;
|
|
||||||
|
|
||||||
guesses.push({
|
|
||||||
letters: ["", "", "", "", ""],
|
|
||||||
colors: [
|
|
||||||
Color.GREY,
|
|
||||||
Color.GREY,
|
|
||||||
Color.GREY,
|
|
||||||
Color.GREY,
|
|
||||||
Color.GREY,
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
await tick();
|
|
||||||
|
|
||||||
w_lines[w_lines.length - 1].focus();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -168,6 +183,7 @@
|
|||||||
{#each guesses as g, i (g)}
|
{#each guesses as g, i (g)}
|
||||||
<WordleLine
|
<WordleLine
|
||||||
active={i === guesses.length - 1}
|
active={i === guesses.length - 1}
|
||||||
|
on_guess_pressed={i === guesses.length - 1 ? doGuess : null}
|
||||||
bind:this={w_lines[i]}
|
bind:this={w_lines[i]}
|
||||||
bind:cursor
|
bind:cursor
|
||||||
bind:letters={guesses[i].letters}
|
bind:letters={guesses[i].letters}
|
||||||
@@ -177,20 +193,34 @@
|
|||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="mt-4 text-sm text-zinc-500 mx-auto w-1/2">
|
<p class="mt-4 text-sm text-zinc-500 mx-auto w-3/4">
|
||||||
Type letters · ← → navigate · Space cycle color · Backspace delete ·
|
Type letters · ← → navigate · Space cycle color · Backspace delete ·
|
||||||
Enter apply · Shift+Enter solve · Escape abort solver · Ctrl+Esc
|
Enter apply · Shift+Enter solve · Escape abort solver · Ctrl+Esc
|
||||||
reset
|
reset
|
||||||
</p>
|
</p>
|
||||||
|
<button
|
||||||
|
tabindex="-1"
|
||||||
|
class="mt-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full"
|
||||||
|
onclick={(e) => {
|
||||||
|
e.currentTarget.blur();
|
||||||
|
toggleSolver();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{#if solving}
|
||||||
|
Cancel
|
||||||
|
{:else}
|
||||||
|
Solve
|
||||||
|
{/if}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{#if best_words}
|
{#if best_words}
|
||||||
<SolverOutput
|
<SolverOutput
|
||||||
data={best_words}
|
data={best_words}
|
||||||
progress={best_words_progress}
|
progress={best_words_progress}
|
||||||
insert_guess={(g) => {
|
insert_guess={(g) => {
|
||||||
console.log("CB");
|
|
||||||
guesses[guesses.length - 1].letters = g;
|
guesses[guesses.length - 1].letters = g;
|
||||||
}}
|
}}
|
||||||
|
bind:solving
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,12 +10,21 @@
|
|||||||
data,
|
data,
|
||||||
progress = null,
|
progress = null,
|
||||||
insert_guess = null,
|
insert_guess = null,
|
||||||
|
solving = $bindable(true),
|
||||||
}: {
|
}: {
|
||||||
data: Promise<EvaluateWordsResult>;
|
data: Promise<EvaluateWordsResult>;
|
||||||
progress: EvaluateWordsProgress | null;
|
progress: EvaluateWordsProgress | null;
|
||||||
insert_guess: ((word: string[]) => void) | null;
|
insert_guess: ((word: string[]) => void) | null;
|
||||||
|
solving: boolean;
|
||||||
} = $props();
|
} = $props();
|
||||||
|
|
||||||
|
$effect(() => {
|
||||||
|
solving = true;
|
||||||
|
data.finally(() => {
|
||||||
|
solving = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
function renderMath(txt: string | null) {
|
function renderMath(txt: string | null) {
|
||||||
return (element: HTMLElement) => {
|
return (element: HTMLElement) => {
|
||||||
if (txt) {
|
if (txt) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Color } from "wordle-solver";
|
import { Color } from "wordle-solver";
|
||||||
|
import type { GuessResult } from "../solver/types";
|
||||||
|
|
||||||
let {
|
let {
|
||||||
active = false,
|
active = false,
|
||||||
@@ -13,9 +14,17 @@
|
|||||||
Color.GREY,
|
Color.GREY,
|
||||||
]),
|
]),
|
||||||
info_gained = null,
|
info_gained = null,
|
||||||
|
on_guess_pressed = null,
|
||||||
|
}: {
|
||||||
|
active: boolean;
|
||||||
|
cursor: number;
|
||||||
|
letters: string[];
|
||||||
|
colors: Color[];
|
||||||
|
info_gained: Promise<GuessResult> | null;
|
||||||
|
on_guess_pressed: (() => void) | null;
|
||||||
} = $props();
|
} = $props();
|
||||||
|
|
||||||
let inputs: HTMLInputElement[] = [];
|
let inputs: HTMLInputElement[] = $state([]);
|
||||||
|
|
||||||
export function focus() {
|
export function focus() {
|
||||||
inputs[cursor].focus();
|
inputs[cursor].focus();
|
||||||
@@ -55,7 +64,7 @@
|
|||||||
<svelte:window onkeydown={handleKey} />
|
<svelte:window onkeydown={handleKey} />
|
||||||
|
|
||||||
<div class="flex justify-center gap-2">
|
<div class="flex justify-center gap-2">
|
||||||
{#each letters as letter, i}
|
{#each letters as _, i}
|
||||||
<input
|
<input
|
||||||
disabled={!active}
|
disabled={!active}
|
||||||
tabindex="-1"
|
tabindex="-1"
|
||||||
@@ -103,6 +112,7 @@
|
|||||||
{/each}
|
{/each}
|
||||||
<span
|
<span
|
||||||
class="w-16 text-sm text-zinc-500 self-center flex items-center justify-center"
|
class="w-16 text-sm text-zinc-500 self-center flex items-center justify-center"
|
||||||
|
onclick={info_gained === null ? on_guess_pressed : null}
|
||||||
>
|
>
|
||||||
{#if info_gained === null}
|
{#if info_gained === null}
|
||||||
↵
|
↵
|
||||||
|
|||||||
@@ -89,7 +89,6 @@ export async function solver_reset(wordle_answers: boolean): Promise<void> {
|
|||||||
solver_worker.terminate();
|
solver_worker.terminate();
|
||||||
|
|
||||||
await create_solver_worker();
|
await create_solver_worker();
|
||||||
console.log("Created: ans=" + wordle_answers);
|
|
||||||
|
|
||||||
pending.forEach((v, _) => {
|
pending.forEach((v, _) => {
|
||||||
v.reject("Solver was reset");
|
v.reject("Solver was reset");
|
||||||
@@ -126,8 +125,6 @@ function workerHandleMsg(event: MessageEvent<SolverResponse>) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Rcv msg: ", res.type + " " + res.id);
|
|
||||||
|
|
||||||
const pendingRequest = pending.get(res.id);
|
const pendingRequest = pending.get(res.id);
|
||||||
|
|
||||||
if (!pendingRequest) {
|
if (!pendingRequest) {
|
||||||
|
|||||||
Reference in New Issue
Block a user