以下是StackOverflowers的算術益智遊戲。我正在開發一款JS遊戲,它將允許某人輸入他們的名字,並根據他們輸入的內容生成另一個名字。有點像this。基本上每次有人輸入一個特定的字符串時,我想通過從列表中獲取項目來生成相同的其他字符串。將字母字符串轉換爲數字並遞歸求和,以使它們低於某個最大值
所以,我有字的陣列,在該示例
"nouns": [
"Nitwit",
"Cretin",
"Village Idiot"
// ..
]
編號20當用戶輸入他們的名字,我每個ASCII字母字符轉換爲一個數字。我將把所有得到的數字加起來,並用總數從我的數組中選擇一個單詞。
// Convert alpha chars to numerical equivalents
function str2num (mystr) {
mystr = mystr.toUpperCase();
var conv = [],
l = mystr.length,
regex = /^[A-Za-z]+$/;
for (var i = 0; i < l; i++) {
if (regex.test(mystr.charAt(i))) {
conv.push(mystr.charCodeAt(i) - 64);
}
}
var c = conv.length,
sum = 0;
for (var j = 0; j < c; j++) {
sum += conv[j];
}
return sumDigits(sum);
}
由於只有20字數組中的元素,我總是想總和小於20所以,如果它等於或大於20,我想再次加起來的數字。這就是我目前的做法。
// Recursively add digits of number together
// till the total is less than length of word list
function sumDigits (number) {
var listLength = adjectives.length;
var sum = number % listLength;
if (number > listLength) {
var remainder = Math.floor(number/10);
sum += sumDigits(remainder);
}
if (sum > listLength) {
sum = sumDigits(sum);
}
return sum;
}
當我有低於20的結果,我的nouns[sum]
值返回給用戶。這段代碼非常有用 - 總和總是低於允許的最大值。但結果並不是很隨意 - 看起來我在0到20範圍的低端得到了不成比例的總和。我不希望用戶從列表的開始處看到單詞。我可以對sumDigits進行任何更改,以確保結果的均勻分佈?或者這已經是正確的了? (我done this JSFiddle演示我在說什麼。)
對於每個名稱使用[bag-of-words模型](http://en.wikipedia.org/wiki/Bag-of-words_model),使用一包字母而不是單詞來說明情況。把他們的名字變成一個26個字母的向量,看看他們的名字最接近哪個名字。 –