Есть ли у кого-нибудь код, который получает из строки допустим 'qwerty' следующую 'qwertz', а из строки 'qwertz' - 'qwerva'. Инкрементированую строку, если это можно назвать так.
Могу предложить простой алгоритм, который делает то же самое, но в алфавите 0-9a-z
.
Мы просто представляем слово, как число в 36ричной системе счисления:
function next(word, increment = 1) {
return (parseInt(word, 36)+increment).toString(36);
}
// Всё, что ниже, только для демонстрации, ответом является функция next
const input = document.querySelector('input');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const startBtn = document.getElementById('startBtn');
const stopBtn = document.getElementById('stopBtn');
prevBtn.addEventListener('click', () => input.value = next(input.value, -1));
nextBtn.addEventListener('click', () => input.value = next(input.value));
{
let h;
startBtn.addEventListener('click', () => {
h&&clearInterval(h);
h = setInterval(() => input.value = next(input.value), 120);
});
stopBtn.addEventListener('click', () => h&&clearInterval(h));
}
<button id=prevBtn><<</button>
<input value="qwertx">
<button id=nextBtn>>></button>
<br>
<button id=startBtn>Start</button>
<button id=stopBtn>Stop</button>
С другим алфавитом(включая, например русские буквы или исключая цифры), придётся то же самое делать вручную.
function inc(s) {
return s.replace(/(^|.)(z*)$/, (m, c, t) => String.fromCharCode(c.charCodeAt(0) + 1 || "a".charCodeAt(0)) + "a".repeat(t.length))
}
for (var s of ["", "q", "z", "aa", "az", "zz", "ffff", "dzzzz", "zzzzzz", "qwzzerzzty"]) {
console.log(s + "\n" + inc(s))
}
.as-console-wrapper.as-console-wrapper { max-height: 100vh }
Сделал для русского, не идеально т.к. буква ё
"в пролёте" и цифры я не обрабатывал
console.log("привет -> ", next("привет", "ая"))
console.log("ПЕТЯ -> ", next("ПЕТЯ", "ая"))
function next(w, c) {
w = w.split('');
for (let i = w.length - 1; i > -1; i--) {
if (w[i] === c[1]) {
w[i] = c[0]
} else if (w[i] === c[1].toUpperCase()) {
w[i] = c[0].toUpperCase()
} else {
w[i] = String.fromCharCode(w[i].charCodeAt(0) + 1);
break;
}
}
return w.join('');
}
Если представить строку как число в 26 (без цифр) ричной системе счисления то всё что нужно это воспользоваться алгоритмом суммирования таких чисел (прибавление 1 в нашем случае).
Допустим есть строка qwerty
- в 26 ричной системе это 16 22 4 17 19 24
Эти цифры получились отнимаением от каждого символа числа 97 (код символа a
что в 26 ричной системе получается 0, а последний символ это z
это 25, отсюда и получаем 26 ричную систему)
Решение на С++ (ссори но переводить в js думаю не составит труда)
#include <iostream>
#include <string>
#define BASE 26
void incStr(std::string& s) {
size_t size = s.size();
int sum = 0;
int carry = 0;
sum = s[size-1] - 97 + 1;
carry = sum / BASE;
sum -= carry*BASE;
s[size-1] = sum + 97;
if (carry == 0) return; // прибавление к нулям вовсе необязательно поэтому можно здесь остановится и с экономить на этих лишних итерациях
for (int i = size-2; i > -1; --i) {
sum = s[i] -97 + carry;
carry = sum/BASE;
sum -= carry*BASE;
s[i] = sum + 97;
}
}
int main()
{
std::string s = "qwerty";
for (int i = 0; i < 52; ++i) {
std::cout << s << '\n';
incStr(s);
}
return 0;
}
p.s. Этот ответ это скорее как детальное пояснение ответа от @vp_arth, которое поможет разобраться глубже
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В текстовом файле находится размеченный тегами текстНо эти теги разорваны, например:
Есть код <img src="">, вместо изображения нужно как-то вставить код JS: