|
|
|
@ -1,5 +1,12 @@
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
|
|
|
|
|
function getRandomInt(max) {
|
|
|
|
|
return Math.floor(Math.random() * Math.floor(max));
|
|
|
|
|
}
|
|
|
|
|
function getRandomLetter() {
|
|
|
|
|
return (10 + getRandomInt(26)).toString(36);
|
|
|
|
|
}
|
|
|
|
|
const LetterGuessResult = Object.freeze({
|
|
|
|
|
MATCH: Symbol("match"),
|
|
|
|
|
UNUSED: Symbol("unused"),
|
|
|
|
@ -16,10 +23,36 @@ class Mastermind {
|
|
|
|
|
constructor(word, availableLetters) {
|
|
|
|
|
this.word = word;
|
|
|
|
|
this.numLetters = word.length;
|
|
|
|
|
this.availableLetters = availableLetters.sort();
|
|
|
|
|
|
|
|
|
|
this.availableLetters = word.split('');
|
|
|
|
|
for (var i = 0; i < availableLetters.length; i++) {
|
|
|
|
|
this.availableLetters = this.availableLetters
|
|
|
|
|
.concat(availableLetters[i].split(''));
|
|
|
|
|
}
|
|
|
|
|
this.availableLetters = [...new Set(this.availableLetters)].sort();
|
|
|
|
|
|
|
|
|
|
this.guesses = new Array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static generateRandom() {
|
|
|
|
|
var regExp = new RegExp('^[a-z]{4,7}$');
|
|
|
|
|
var word;
|
|
|
|
|
do {
|
|
|
|
|
word = topWords[1000+getRandomInt(30000)].word;
|
|
|
|
|
} while (!regExp.test(word) || !isValidWord(word));
|
|
|
|
|
|
|
|
|
|
var availableLetters = new Set(word.split(''));
|
|
|
|
|
for (var i = 0; i < 10; i++) {
|
|
|
|
|
var newLetter;
|
|
|
|
|
do {
|
|
|
|
|
newLetter = getRandomLetter();
|
|
|
|
|
} while (availableLetters.has(newLetter));
|
|
|
|
|
availableLetters.add(newLetter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Mastermind(word, [...availableLetters]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
isValidGuess(guess) {
|
|
|
|
|
var availableLetters = this.availableLetters;
|
|
|
|
|
return guess.length == this.numLetters
|
|
|
|
|