Как поменять буквы местами?
Дана функция с аргументом(ТЕКСТ), надо в каждом слове Вторую букву поменять местами с последней буквой.
Я разбил текст на массив из слов, но как поменять буквы местами?
Мой код:
function encryptThis(text) {
let textSplit = text.split(" ")
return textSplit.map( el => el.replace(el[1], el.at(-1) ) )
}
Ответы (3 шт):
Поменять местами вторую букву с последней в каждом слове можно так:
function encryptThis(text) {
return text.split(" ").map(el => {
const elArr = el.split(''); // получаем массив букв
[elArr[1], elArr[elArr.length - 1]] = [elArr[elArr.length - 1],elArr[1]];
return elArr.join(''); // Получаем строку
});
}
console.log(encryptThis('Привет как дела'));
Разбиваем строку на массив, получаем массив строк
Далее каждое слово разбиваем по буквам в массив
Меняем элементы местами
Собираем буквы в слова(массив в строку превращаем)
Через slice()
- вырезаем нужные куски слов и склеиваем в нужном порядке
const encryptThis = text => text.split(" ").map(el => el.slice(0, 1) + el.slice(-1) + el.slice(2, -1) + el.slice(1, 2))
console.log(encryptThis('Привет как дела'))
- Разбиваем текст на слова
- Разбиваем слова на буквы
- В каждом слове меняем 2-ой и последний элементы местами
- Объеденеям обратно буквы в слова
- Объеденяем обратно слова в текст
const encryptText = text => {
const textSplitter = ' ';
const wordSplitter = '';
const words = text.split(textSplitter);
const enycryptedWords = words.map(word => {
const lettersOfWord = word.split(wordSplitter);
const lastIndex = word.length - 1;
const buf = lettersOfWord[1];
lettersOfWord[1] = lettersOfWord[lastIndex];
lettersOfWord[lastIndex] = buf;
return lettersOfWord.join(wordSplitter);
});
const enycryptedText = enycryptedWords.join(textSplitter);
return enycryptedText;
}
const input = document.querySelector('input');
const resultContainer = document.querySelector('.result');
input.addEventListener('input', e => {
resultContainer.textContent = encryptText(e.target.value);
})
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
input,
.result {
font-size: 2rem;
}
<input type="text" />
<div class="result"></div>
По сути своей моё решение не отличается от предыдущих, просто расписан чуть более подробно. Но тут я бы предложил небольшое улучшение: разбить логику шифрования текста и шифрования слова. Так код будет проще тестировать если вдруг понадобится:
const encryptWord = word => {
const wordSplitter = '';
const lettersOfWord = word.split(wordSplitter);
const lastIndex = word.length - 1;
const buf = lettersOfWord[1];
lettersOfWord[1] = lettersOfWord[lastIndex];
lettersOfWord[lastIndex] = buf;
return lettersOfWord.join(wordSplitter);
}
const encryptText = text => {
const textSplitter = ' ';
const words = text.split(textSplitter);
const enycryptedWords = words.map(encryptWord);
const enycryptedText = enycryptedWords.join(textSplitter);
return enycryptedText;
}
const input = document.querySelector('input');
const resultContainer = document.querySelector('.result');
input.addEventListener('input', e => {
resultContainer.textContent = encryptText(e.target.value);
})
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
input,
.result {
font-size: 2rem;
}
<input type="text" />
<div class="result"></div>
Звучит, всё хорошо, но лишь до тех пор пока мы можем делить предложение на слова используя пробел как разделитель. Попробуйте в input
вставить знаки препинания, многоточия после слов или же что-то из этого списка кроме пробела. Вы увидете как программа начинает сразу работать неожиданно
Чтобы этого избежать я предлагаю другой метод с использованием replaceAll, у которого как второй аргумент может быть функция, которая на вход будет получать все нахождения (и не только):
- Теперь мы не разделяем текст, а ищем в нём слова, которые состоят только из букв (
\p{L}
) и имеют длину 3 и больше ({3,}
) - Шаги для шифроания слова остались такими же (как видите разбитие большой функции на более мелкие имеет смысл):
const encryptWord = word => {
const wordSplitter = '';
const lettersOfWord = word.split(wordSplitter);
const lastIndex = word.length - 1;
const buf = lettersOfWord[1];
lettersOfWord[1] = lettersOfWord[lastIndex];
lettersOfWord[lastIndex] = buf;
return lettersOfWord.join(wordSplitter);
}
const encryptText = text => text.replaceAll(/\p{L}{3,}/gu, encryptWord);
const input = document.querySelector('input');
const resultContainer = document.querySelector('.result');
input.addEventListener('input', e => {
resultContainer.textContent = encryptText(e.target.value);
})
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
input,
.result {
font-size: 2rem;
}
<input type="text" />
<div class="result"></div>
P.S. Для лучшего понимания регулярного выражения, который я использую, рекомендую следующие статьи: