Предложение, которое читается одинаково в обоих направлениях (слева направо и наоборот), при этом игнорируя регистр, пробелы и знаки препинания

function isWerewolf(target) {
  let direct = '';
  let reverced = '';

  for(let i = 0; i < target.length; i++ ){
    let add = target.replace(/[^a-zа-яё]/gi, '');
      direct += add;
      reverced += add;

      let direct1 = direct.toLowerCase();
      let reverced1 = reverced.toLocaleLowerCase();  

      if(direct1 === reverced1){
        return true
      }else{
        return false
      }
  }
}

Не пойму как мне добавлять текущий элемент в reversed в конец строки, так что бы он стазу стал перевёртышем. А потом уже проводить сравнение.


Ответы (3 шт):

Автор решения: EzioMercer

Алгоритм очень прост:

  1. Оставляем в строке только буквы и цифры
  2. Делим строку посимвольно
  3. Разворачиваем
  4. Проходимся по получившемуся массиву и смотрим совпадает ли каждый символ в нижнем регистре с символом в строке

const isWerewolf = (str) => {
  const newStr = str.replace(/[^\wа-яё]+/gi, '').toLowerCase();
  
  return newStr.split('').reverse().every((x, i) => x === newStr[i]);
}

console.log(isWerewolf('abBA'));
console.log(isWerewolf('abBAc'));
console.log(isWerewolf('abcdeffedcba!'));
console.log(isWerewolf('абвгдеё ЁЕДГВБА!'));

P.S. Надо понимать что в развёрнутом массиве 0-ой элемент - это послдений элемент в строке, 1-ый - это предпоследний элемент и т.д. Потому, когда мы сравниваем 0-ой элменет в развёрнутом массиве с 0-ым элементом в строке, мы сравниваем 0-ой и последний элемент в строке

→ Ссылка
Автор решения: Laukhin Andrey
  1. Получаем очищенную от всего лишнего строку в нижнем регистре.
  2. Посимвольно сравниваем первую половину строки со второй половиной.

Код не самый компактный, но эффективный:

const isPalindrome = (str) => {
  const cleaned = str.replace(/[^a-zа-яё]/gi, '').toLowerCase();
  let i = ~~(cleaned.length / 2);

  while (--i > 0) {
    if (cleaned[i] !== cleaned[cleaned.length - i - 1]) return false;
  }

  return true;
}

console.log(
  isPalindrome("Он — верба, но / Она — бревно"),
  isPalindrome("Семиногий пятирук играет в гольф")
);

→ Ссылка
Автор решения: Stanislav Volodarskiy

Функция будет называться isPalindrome, извините. Сперва опустим строке регистр. Затем выделим числа (\d) и буквы любых алфавитов на любых языках (\p{L}). То что осталось соберём в первую строку. Массив перевернём и соберём во вторую строку. Строки сравним:

const isPalindrome = s => {
    const arr = s.toLowerCase().match(/[\d\p{L}]/gu);
    const s1 = arr.join('');
    arr.reverse();
    const s2 = arr.join('');
    return s1 === s2;
};

[
    'abBA',
    'abBAc',
    'abcdeffedcba!',
    'абвгдеё ЁЕДГВБА!',
    "Он — верба, но / Она — бревно",
    "Семиногий пятирук играет в гольф",
    "А роза упала на лапу Азора.",
    "12321",
    "123"
].forEach(s => console.log(isPalindrome(s), s));

→ Ссылка