Предложение, которое читается одинаково в обоих направлениях (слева направо и наоборот), при этом игнорируя регистр, пробелы и знаки препинания
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 шт):
Алгоритм очень прост:
- Оставляем в строке только буквы и цифры
- Делим строку посимвольно
- Разворачиваем
- Проходимся по получившемуся массиву и смотрим совпадает ли каждый символ в нижнем регистре с символом в строке
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-ой и последний элемент в строке
- Получаем очищенную от всего лишнего строку в нижнем регистре.
- Посимвольно сравниваем первую половину строки со второй половиной.
Код не самый компактный, но эффективный:
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("Семиногий пятирук играет в гольф")
);
Функция будет называться 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));