Зацикливание строки слов, возврат слова с наивысшей оценкой в ​​соответствии со значением символа в объекте - JavaScript - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь выяснить, как решить этот ката на CodeWars.

Функция high получает строку и возвращает слово с наибольшим «счетом», согласно которому присутствуют буквы в слове. Буквы получают оценку в зависимости от их положения в алфавите. Итак a = 1 point, b = 2 points, c = 3 points и т. Д.

Я думаю, что имеет смысл создать объект, в котором всем буквам алфавита присвоено значение:

Если буква в слове появляется в alphabetScore, это слово получит свои «точки» и перейдет к следующей букве в слове, увеличив общее количество точек слова.

У меня есть:

function high(string) {

  let words = string.split(" ");
  let wordScore = 0;

  const alphabetScore = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    j: 10,
    k: 11,
    l: 12,
    m: 13,
    n: 14,
    o: 15,
    p: 16,
    q: 17,
    r: 18,
    s: 19,
    t: 20,
    u: 21,
    v: 22,
    w: 23,
    x: 24,
    y: 25,
    z: 26
  }

  let word = words[i];
  let wordCount = 0;

  //loop through all words in the string

  for (let i = 0; i < words.length; i++) {

    let word = words[i];

    //loop through all characters in each word

    for (let j = 0; j < word.length; j++) {

      let value = alphabetScore[j];

      wordCount += alphabetScore[value];

    }
  }
  return wordCount;
}

console.log(high("man i need a taxi up to ubud"));

И это возвращает ошибку, говорящую

я не определен

в let word = words[i] - как еще тогда я определю слово?

Если возможно решить эту ката с моей существующей логикой (используя for-loop), пожалуйста, сделайте это.

РЕДАКТИРОВАТЬ : изменено wordCount = alphabetScore.value++; на wordCount += alphabetScore[value];

РЕДАКТИРОВАТЬ 2 : теперь возвращается NaN

РЕДАКТИРОВАТЬ 3 : последняя попытка:

function myScore(input) {
    let key = ["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"
    ];
    let bestWord = "";
    let bestScore = 0;
    let words = input.split(" ");
    for (let i = 0; i < words.length; i++) {
      let score = 0;
      let word = words[i];
      for (let j = 0; j < word.length; j++) {
        let char = word[j];
        score += (key.indexOf(char) + 1);
      }
      if (score > bestScore) {
        bestScore = score;
        bestWord = word;
      }
    }
    return bestWord;
  }

ReferenceError: высокая не определена в Test.describe ._

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

успешно запущено на CodeWars

let key = ["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"
];

function wordScore(word) {
  let score = 0;
  for (let j = 0; j < word.length; j++) {
    let char = word[j];
    score += (key.indexOf(char) + 1);
  }
  return score;
}

function high(x) {
  let bestWord = "";
  let bestScore = 0;
  words = x.split(" ");
  for (let i = 0; i < words.length; i++) {
    let word = words[i];
    let score = wordScore(word);
    if (score > bestScore) {
      bestScore = score;
      bestWord = word;
    }
  }
  return bestWord;
}

console.log(high("man i need a taxi up to ubud"));
2 голосов
/ 05 апреля 2019

NaN означает «не число». Обычно это признак того, что вы пытались сделать арифметику с нулем или чем-то в какой-то момент.

В этом случае ваш alphabetScore - это хэш-карта букв, но вы ищете цифровые клавиши let value = alphabetScore[j];: которые вернут undefined и undefined + 0 == NaN. Вместо этого вам нужно сказать let value = alphabetScore[word[j]] - получить букву слова, а не индекс.

Чтобы сделать то, что предложил Джонас, создайте две новые переменные, где ваш первый let word = words[i] - и избавьтесь от этого - let highScore = 0; let highScoreWord = "";, чтобы удерживать самую высокую из найденных вами. Переместите let wordCount = 0; также внутри цикла. Теперь для каждого слова вы получите слово и сбросите счет.

Наконец, после внутреннего цикла, скажем, if (wordCount > highScore) { highScore = wordCount; highScoreWord = word; }. Так что, если он выше вашего текущего максимума, сохраните его; в противном случае просто игнорируйте это.

Тогда return highScoreWord и ты должен быть золотым!

...