crack = {
if (!target.match(/^[a-z]+$/))
throw new Error("Target string must be just lowercase letters.");
let guessed = "";
for (let char = 0; char < target.length; char++) {
const candidates = letters.map(l => ({
char: l,
str: guessed + l,
padded: (guessed + l).padEnd(target.length, " "),
time: 0
}));
for (let i = 0; i < 40000; i++) {
for (let candidate of candidates) {
let s = performance.now();
let equalities = 0;
for (let j = 0; j < 2000; j++) {
if (target == candidate.padded) equalities++;
}
candidate.time += performance.now() - s;
}
if (i % 100 == 0) {
yield html`<pre>
char=${char} i=${i}
Candidates:
${candidates
.sort((a, b) => b.time - a.time)
.map(c => `${c.str}=${c.time.toFixed(1)}`)
.join(", ")}</pre>`;
}
}
guessed += candidates.sort((a, b) => b.time - a.time)[0].char;
}
yield `DONE ${guessed}`;
}