#javascript #arrays #function #for-loop
#javascript #массивы #функция #for-цикл
Вопрос:
Если вы не знакомы с этой задачей, вот инструкции:
https://www.codewars.com/kata/54da539698b8a2ad76000228/train/javascript
Вы живете в городе Картезия, где все дороги выложены идеальной сеткой. Вы пришли на встречу на десять минут раньше назначенного времени, поэтому решили воспользоваться возможностью совершить короткую прогулку. Город предоставляет своим жителям приложение, генерирующее прогулки на их телефонах — каждый раз, когда вы нажимаете кнопку, оно отправляет вам массив однобуквенных строк, представляющих направления ходьбы (например. [‘n’, ‘s’, ‘w’, ‘e’]). Вы всегда проходите только один квартал в определенном направлении и знаете, что вам требуется одна минута, чтобы пересечь один городской квартал, поэтому создайте функцию, которая вернет значение 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»?
Комментарии:
1. Они не говорят, на какой поверхности лежит декартия, но если предположить, что это плоскость, нет необходимости манипулировать координатами, просто убедитесь, что строка имеет равные числа «n»s и «s»s и «e»s и «w» s соответственно.
Ответ №1:
Во-первых, массивы 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;
}
Во-вторых, person
и finalDestination
являются массивами, поэтому ===
означает равенство ссылок. То есть, person === finalDestination
вернет только true
, если обе переменные ссылаются на одно и то же местоположение в памяти. Вместо этого вам нужно сравнить отдельные значения массивов, например
if (person[0] === finalDestination[0] amp;amp;
person[1] === finalDestination[1]) {
return true;
}
else {
return false;
}
Или более кратко:
return person[0] === finalDestination[0] amp;amp;
person[1] === finalDestination[1];
Однако обратите внимание, что finalDestination
это никогда не меняется, так что вам вообще не нужна эта переменная. Вы могли бы просто заменить его на:
return person[0] === 0 amp;amp; person[1] === 0;
И последнее замечание о требованиях:
вернитесь,
true
если прогулка, которую вам предоставляет приложение, займет у вас ровно десять минут
Вы захотите добавить это в начало своей функции:
if (walk.length !== 10) return false;
И для более чистого кода убедитесь, что ваш for
цикл не завершается после конца walk
, заменив i <= 10
на i < 10
или i < walk.length
.
Комментарии:
1. Я вижу, что установление этих переменных —
north
,south
,east
иwest
— было в основном бессмысленным?2. @HappyHands31 В данном случае в них нет необходимости. Если вы хотите представить более сложное направление (например, диагональ или движение коня в шахматах), возможно, стоит реализовать что-то вроде векторной / матричный математики.
3. @HappyHands31 не совсем, я бы назвал это чистым кодом, и этот шаблон может продвинуть вас дальше, если он станет более сложным (больше направлений, диагоналей и т.д.)
4. Да, я все еще получал сообщение об ошибке, когда прогулка не заняла ровно десять минут. Спасибо, что обратились к этому, и за ваше замечание об изменении
<=
на<
— спасибо.
Ответ №2:
Вы не можете просто добавлять массивы. Если вы сделаете это, они будут преобразованы в строку, также вы не сохраните результат где-нибудь:
[0, 1] [0, 0]
// equals
"0,1" "0,0"
Вы должны суммировать их значение за значением:
person[0] = west[0];
person[1] = west[1];
Дополнительно сравниваем массивы по ссылке здесь:
if (person === finalDestination) {
будет иметь значение true только в том случае, если вы сделаете person = finalDestination
. Вероятно, вы захотите еще раз сравнить их значение за значением:
if(person[0] === finalDestination[0] amp;amp; person[1] === finalDestination[1])
Тем не менее, хотя это работает, есть более простые решения (подсказка: разделяй и властвуй: N / S и W / E), которые вы увидите, если решите эту Ката 🙂
И это проходит 6/9 тестов
Неправильные часы также дважды в день оказываются правильными. Если бы вы сделали:
return Math.random() > 0.5;
это также будет работать в среднем после 500 попыток.
Я хочу сказать: количество пройденных тестовых наборов на самом деле не является показателем того, насколько неверно ваше решение, а просто небольшой подсказкой для следующего ката.