@WebNerd
It's time to hunt

Не могу понять в чем проблема в коде, где ошибка?

Задача на которой завис

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

const isValidWalk = (walk) => {
  // Если пусть длиннее или меньше 10 ходов, то вернуть false
  if (walk.length > 10 || walk.length < 10) return false;
  // Объект с путями, где North - South, East - West - прямо противоположны друг другу. 
  // То есть, шаг вперед и назад, в лево и право, грубо говоря. 
  const path = {
    'n': 's',
    'e': 'w',
    's': 'n',
    'w': 'e',
  };
  // Prev=arr, item=нынешний элемент массива.
  return !walk.reduce((prev,item) => {
    // Проверяем, есть ли в массиве прямо-противоположный шаг нынешнему элементу.
    // Если да, то вырезаем этот элемент из массива, то есть, грубо говоря, возвращаемся к начальной точки.
    // Если нет, то пушим нынешний шаг в массива.
    if (prev.includes(path[item])) {
      prev.splice(prev.indexOf(path[item], 1));
    } else {
      prev.push(item);
    }
    // Возвращаем массив.
    // .length - если массив пустой, то выведет ноль, где ! знак перед всей функцией
    // вернет true, т.к мы вернулись на начальную точку, иначе false, т.к остались где то.
    return prev;
  }, []).length;
};


console.log(isValidWalk(['n','n','n','s','n','s','n','s','n','s']));


В codewars половина тестов выполняется, другая нет. То есть, я даже не могу понять, в чем проблема, т.к не могу
элементарно проверить. Так вот, в чем здесь проблема? И как можно было бы лучше может переписать код?
  • Вопрос задан
  • 189 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
С редьюсом перемудрили, кажется:
«если есть антоним текущему шагу, то удаляем антоним» – эт зачем нам?
Текущий шаг "E", удаляем найденный "W". Но для чего? Их надо парами удалять, тогда уж. А так текущий шаг "E" остаётся в массиве и создаёт дисбаланс.

Вроде всё просто: надо посчитать пары и убедиться что число E равно числу W, а число N равно числу S. Всего-то.

P.s. строку можно упростить:
- if (walk.length > 10 || walk.length < 10) return false;
+ if (walk.length !== 10) return false;

spoiler
const isValidWalk = walk => {
  if (walk.length !== 10) return false;
  const counts = walk.reduce((acc, c) => (acc[c]++, acc), { w: 0, n: 0, e: 0, s: 0 });
  return counts.e === counts.w && counts.n === counts.s;
};
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
prev.splice(prev.indexOf(path[item], 1));

у тебя единица заехала в скобки indexOf, это зря она так
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Попробуйте так:
const isValidWalk = (directions) => {
  if(directions.length !== 10) {
    return false;
  }
  
  const path = directions
    .reduce((acc, direction) => {
      acc[direction] = (acc[direction] || 0) + 1
      return { ...acc };
    }, {});
  return path['s'] === path['n'] && path['w'] === path['e'];
};

Здесь идет подсчет противоположных направлений, и если они равны, то значит будет возвращение в начальную точку
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы