Я создал этот код для создания опечаток во всех словах на странице. Код смешивает буквы внутри слова, однако оставляет первый и последний символы. Но как мне игнорировать знаки препинания, такие как "." "(" "," ")" действует как первый и/или последний символ?
for (var i = 0; i < words.length; i++) {
var word = words[i];
var letters = word.split("");
var first = letters[0];
var last = letters[letters.length - 1];
for (var j = 1; j < letters.length - 1; j++) {
var letter = letters[j];
var index = Math.floor(Math.random() * (letters.length - 2)) + 1;
var temp = letters[index];
letters[index] = letter;
letters[j] = temp;
}
letters[0] = first;
letters[letters.length - 1] = last;
scrambled += letters.join("") + " ";
}
document.body.innerText = scrambled;
Я попытался ответить на ваши вопросы здесь, используя очень общий код и циклы for, поскольку это похоже на задание. Я избегал es6, кроме как использовать let вместо var, так как глобальные переменные часто могут приводить к незаметным ошибкам.
Одна общая оптимизация заключается в том, что любое слово, состоящее из 3 букв или менее, не будет смешиваться, поэтому вы можете кодировать с учетом этого предположения и избежать ненужной обработки. Более интересная версия этого может допускать опечатки в словах из 2 или 3 букв.
Вообще говоря, ваша первая проблема заключается в том, что вы предполагаете, что позиции 1-й буквы и последней буквы в слове являются константами. Я добавил 2 простые функции для предоставления индекса 1-го или последнего «не пунктуационного» символа. Эти функции очень похожи, просты и не являются DRY, но опять же, я просто хотел предоставить простые примеры на основе циклов.
Теперь, когда вы знаете 1-й и последний непунктуационные индексы в массиве для одного слова, вы можете использовать более сложную функцию случайных чисел, которая будет индексировать только буквы в допустимом диапазоне, таким образом полностью избегая символов 1-го и последнего слова. Эта функция (getRandomInt) была дословно скопирована со страницы Mozilla Math.random(). Часто бывает полезно прочитать подобную страницу для часто используемых фрагментов и примеров.
// javascript
let words = document.getElementById("original").innerText.split(" ")
const punctuation = [',', ';', '.', '"', "'"]
function getFirstLetterPosition(letters) {
let pos = 0;
for (let i = 0; i < letters.length; i++) {
pos = i
let isPunctuation = false
for (let a = 0; a < punctuation.length; a++) {
if (letters[i] == punctuation[a]) {
console.info(`letter: ${letters[i]} punct: ${punctuation[a]}`)
isPunctuation = true
}
}
if (!isPunctuation) {
break;
}
}
return pos
}
function getLastLetterPosition(letters) {
pos = letters.length - 1;
for (let i = letters.length -1; i > 0; i--) {
let pos = i
let isPunctuation = false
for (let a = 0; a < punctuation.length; a++) {
if (letters[i] == punctuation[a]) {
isPunctuation = true
}
}
if (!isPunctuation) {
break;
}
}
return pos
}
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive
}
let scrambled = ""
for (let i = 0; i < words.length; i++) {
let word = words[i]
let letters = word.split("")
if (letters.length > 3) {
let firstPos = getFirstLetterPosition(letters)
let lastPos = getLastLetterPosition(letters)
console.info("Before:" + letters)
for (let j = firstPos + 1; j < lastPos - 1; j++) {
let letter = letters[j]
let index = getRandomInt(firstPos + 1, lastPos - 1)
let temp = letters[index]
letters[index] = letter
letters[j] = temp
}
console.info("After:" + letters)
}
scrambled += letters.join("") + " ";
}
document.getElementById("typos").innerText = scrambled
<!doctype html>
<html>
<head>
<title></title>
<link rel = "stylesheet" href = "index.css">
</head>
<body>
<p id = "original">I "Consulted". The Dictonary, Boy. Calling nothing end fertile for venture way boy. Esteem spirit temper too say adieus who direct esteem. It esteems luckily mr or picture placing drawing no. Apartments frequently or motionless on reasonable projecting expression. Way mrs end gave tall walk fact bed.
Inhabit hearing perhaps on ye do no. It maids decay as there he. Smallest on suitable disposed do although blessing he juvenile in. Society or if excited forbade. Here name off yet she long sold easy whom. Differed oh cheerful procured pleasure securing suitable in. Hold rich on an he oh fine. Chapter ability shyness article welcome be do on service.
Cause dried no solid no an small so still widen. Ten weather evident smiling bed against she examine its. Rendered far opinions two yet moderate sex striking. Sufficient motionless compliment by stimulated assistance at. Convinced resolving extensive agreeable in it on as remainder. Cordially say affection met who propriety him. Are man she towards private weather pleased. In more part he lose need so want rank no. At bringing or he sensible pleasure. Prevent he parlors do waiting be females an message society.</p>
<p id = "typos"></p>
<script src = "index.js"></script>
</body>
</html>
Отвечает ли это на ваш вопрос? Генератор опечаток Javascript