Вычисление оценки scrabble для слова

#javascript

#javascript

Вопрос:

 letter = prompt("Enter a word please");
letter = letter.toUpperCase();

// define letters and respective scores
alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z']
alphabetScore = [1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10]

// start sum
sum=0

for (i=0; i<alphabet.length; i  )
{
switch(letter) 
        {
        case (alphabet[i]): sum =alphabetScore[i]; break;
        default: sum=sum 0;
        }
}   
alert (sum);
 

Я пытаюсь создать программу, которая вычисляет оценку Scrabble для слова. Но каждый раз, когда я набираю слово, оно возвращает 0. Почему это происходит? Извините за непрерывные сообщения JS — я новичок в языке и выполняю дополнительные практические задания, чтобы повысить свои знания языка. В этом случае я экспериментировал с оператором switch в цикле for .

Комментарии:

1. Вы делаете sum = sum 0; , я не знаю Javascript, поэтому я не знаю, что default: означает, но я не вижу никакого другого увеличения суммы.

2. Я бы хотел, чтобы JS перебирал заданное слово, и в зависимости от алфавита он должен добавлять число к общему количеству, чтобы получить результат. Например: ABB должен дать оценку 7!

3. switch Оператор, содержащий только единицу case и a default , точно такой же, как if / else — Я понимаю, что вы экспериментируете, но это действительно ужасный шаблон для использования.

Ответ №1:

Попробуйте смоделировать связь между буквой и ее значением Scrabble point в виде ассоциативного массива, а не в виде двух параллельных массивов:

 var word = prompt("Enter a word please");
word = word.toUpperCase();

scores = { 'A' : 1, 'B' : 3, 'C' : 3, /* ... */ 'Z' : 10 };

var sum = 0;
for (var i = 0; i < word.length;   i) {
    sum  = scores[word.charAt(i)] || 0;
}

alert(sum);
 

Комментарии:

1. В Javascript нет ассоциативного массива. То, что вы описываете, называется объектом 🙂

2. Вы, вероятно, знаете, что вычисление фактического балла scrablle требует учета двух других вещей: специальных плиток доски (двойное слово / двойная буква и т. Д.) И Вычисления дополнительного балла за созданные перекрестные слова

3. Я действительно . Не похоже, что OP беспокоился об этом.

Ответ №2:

Это неподходящий способ использования switch.

switch обычно используется для замены нескольких последовательных if ... else if ... else if ... else . Все очень просто. В вашем случае вам просто нужен один if оператор внутри цикла. И вам действительно нужен двойной цикл.

 for each letter in the word
  for each letter in the alphabet
    if they match
      increment score
 

Удачи.

Ответ №3:

Вы могли бы избежать перебора всего алфавита для каждой буквы в слове, определив оценки в виде объекта (он же ассоциативный массив). Кроме того, ваша переменная «letter» на самом деле представляет собой целое слово, поэтому вам нужно будет перебирать буквы по отдельности. Следующее объединяет эти две идеи:

 var word = prompt("Enter a word please");
word = word.toUpperCase();

var alphabet = {
    A: 1,
    B: 3,
    C: 3,
    D: 2,
    E: 1,
    F: 4,
    G: 2,
    H: 4,
    I: 1,
    J: 8,
    K: 5,
    L: 1,
    M: 3,
    N: 1,
    O: 1,
    P: 3,
    Q: 10,
    R: 1,
    S: 1,
    T: 1,
    U: 1,
    V: 4,
    W: 4,
    X: 8,
    Y: 4,
    Z: 10
}

var letter, i, sum = 0;
for (i = 0; i < word.length; i  ) {
    letter = word[i];
    sum  = alphabet[letter];
}
alert(sum);
 

Ответ №4:

Может быть, внимательнее посмотрите на строку

 switch(letter) 
 

Да?

Комментарии:

1. или, лучше, for (i=0; i<alphabet.length; i )

2. Я что-то перепутал?

Ответ №5:

Вы обрабатываете все слово так, как будто это одна буква, и пытаетесь найти, где она находится в алфавите. Поскольку его вообще нет в алфавите, вы получаете ноль. Вместо этого вам нужно перебирать буквы слова.

Ответ №6:

 sum = 0;
for(var i=0,l=letter.length;i<l;i  )
    sum  = alphabetScore[alphabet.indexOf(letter[i])] 
 

Ответ №7:

 let word = prompt("Enter a word please");

const scrabble = {
  a: 1, b: 3, c:3, d: 2, e: 1, f: 4, g: 2, h:4, i:1, j: 8,
  k: 5, l: 1, m: 3, n: 1, o: 1, p: 3, q: 10, r: 1, s: 1, t: 1,
  u: 1, v: 4, w: 4, x: 8, y: 4, z: 10
};

const sum = [...word].reduce((accu, letter) => { return accu   scrabble[letter.toLowerCase()]; }, 0);

alert(sum);