JavaScript - Прогулка за десять минут - Как правильно получить доступ к элементам массива - PullRequest
3 голосов
/ 26 марта 2019

Если вы не знакомы с этим испытанием, вот инструкции:

https://www.codewars.com/kata/54da539698b8a2ad76000228/train/javascript

Вы живете в городе Картезия, где все дороги расположены видеальная сетка.Вы приехали на десять минут раньше, чем на прием, поэтому решили воспользоваться возможностью, чтобы прогуляться.Город предоставляет своим гражданам приложение Walk Generating на своих телефонах - каждый раз, когда вы нажимаете кнопку, он отправляет вам массив однобуквенных строк, представляющих направления для ходьбы (например, ['n', 's', 'w','е']).Вы всегда идете только по одному блоку в направлении, и вы знаете, что вам понадобится одна минута, чтобы пройти через один городской квартал, поэтому создайте функцию, которая будет возвращать true, если прогулка, которую дает приложение, займет у вас ровно десять минут (вы нехочу быть рано или поздно!) и, конечно, вернет вас к исходной точке.В противном случае верните false.

Пока я пробовал:

function isValidWalk(walk) {

  //initiate person starting point
  let person = [0, 0]
  //establish what the ending point must be
  let finalDestination = [0, 0]

  let north = [0, 1]
  let east = [1, 0]
  let south = [0, -1]
  let west = [-1, 0]

  //as long as the length of the array is 10 or less, continue walk
  for (let i = 0; i <= 10; i++) {
    //if the letter in the array is "n", move north
    if (walk[i] === "n") {
      person + north;
    }
    //if the letter in the array is "e", move east
    if (walk[i] === "e") {
      person + east;
    }
    //if the letter in the array is "s", move south
    if (walk[i] === "s") {
      person + south;
    }
    //if the letter in the array is "w", move west
    if (walk[i] === "w") {
      person + west;
    }
  }

  if (person === finalDestination) {
    return true;
  }
  else {
    return false;
  }

}

И это проходит 6/9 тестов, но не возвращает true для правильной прогулки,

Как вы видите, я пытался сказать, что функция isValidWalk должна возвращать true, если местоположение person равно переменной finalDestination в конце их обхода.

Я знаю, что, возможно, есть другие способы решения этой проблемы, но я хотел бы продолжить следовать логике, которую я установил, если это возможно.

Мне интересно, проблема в том, что я неправильно обращаюсь к элементам в массиве?Т.е. walk[i] правильно ли получает здесь элементы массива?

    if (walk[i] === "n") {
      person + north;
    }

Это то, что должно перемещать person по этой воображаемой сетке, но, очевидно, он ничего не делает.Какой другой синтаксис я должен попытаться получить доступ к элементам в массиве и проверить, равны ли они «n», «e», «s» и «w»?

Ответы [ 2 ]

4 голосов
/ 26 марта 2019

Во-первых, массивы JavaScript не работают как математические матрицы. array1 + array2 не добавит отдельные значения в эти массивы вместе. Вместо этого вам придется увеличивать / уменьшать значения внутри ваших массивов:

if (walk[i] === "n") {
  person[0]++;
}
if (walk[i] === "e") {
  person[1]++;
}
if (walk[i] === "s") {
  person[0]--;
}
if (walk[i] === "w") {
  person[1]--;
}

Или более кратко:

switch(walk[i]) {
  case "n": person[0]++; break;
  case "e": person[1]++; break;
  case "s": person[0]--; break;
  case "w": person[1]--; break;
}

Second, person и finalDestination являются массивами, поэтому === означает reference равенство. То есть person === finalDestination вернет true, только если обе переменные ссылаются на одно и то же место в памяти. Вместо этого вам нужно сравнить отдельные значения массивов, например,

if (person[0] === finalDestination[0] &&
    person[1] === finalDestination[1]) {
  return true;
}
else {
  return false;
}

Или более кратко:

return person[0] === finalDestination[0] &&
       person[1] === finalDestination[1];

Тем не менее, обратите внимание, что finalDestination никогда не меняется, поэтому вам даже не нужна эта переменная вообще. Вы можете просто заменить его на:

return person[0] === 0 && person[1] === 0;

Последний пункт о требованиях:

возврат true если прогулка по приложению займет у вас ровно десять минут

Вы хотите добавить это в начало вашей функции:

if (walk.length !== 10) return false;

И для более чистого кода, убедитесь, что ваш for -петл не проходит после конца walk, заменив i <= 10 на i < 10 или i < walk.length.

2 голосов
/ 26 марта 2019

Вы не можете просто добавлять массивы.Если вы сделаете это, они будут преобразованы в строку, и вы не сохраните результат где-либо:

[0, 1] + [0, 0]
// equals
"0,1" + "0,0"

Вы должны добавить их значение по значению:

person[0] += west[0];
person[1] += west[1];

Кроме того, сравнение массивов по ссылке здесь:

 if (person === finalDestination) {

будет истинно, только если вы сделаете person = finalDestination.Вы, вероятно, захотите сравнить их значение по значению еще раз:

 if(person[0] === finalDestination[0] && person[1] ===  finalDestination[1])

Тем не менее, хотя это работает, существуют более простые решения (подсказка: разделяй и властвуй: N / S и W / E), которые выПосмотрю, решил ли ты, что Ката:)

И это проходит 6/9 тестов

Неправильные часы тоже правильные дважды в день.Если вы сделаете:

 return Math.random() > 0.5;

, это также сработает в среднем после 500 попыток.

Моя точка зрения: количество пройденных тестовых примеров на самом деле не показатель того, насколько неправильнымВаше решение, как небольшой совет для следующего ката.

...