Как я могу получить все возможные строки в печатном ASCII (например, 0x20
() до
0x7E
(~
)) с использованием генератора? Он должен выводить (если постоянно .next()
с .next()
):
!
"
#
$
...
~
!
"
#
$
и так далее. Как я могу это сделать?
var gen = function * (){
var counter = 0x20;
while(true) yield String.fromCharCode(++counter);
};
работает до 94 попыток (~
). Как я могу заставить это работать после этого?
Вот удар в него. Как определено в комментариях выше, речь идет о представлении каждого номера базы 94 и добавлении 32 и печати соответствующих символов ASCII. Это то, что делает функция char
ниже. Функция генератора numbers
выполняет итерацию от 0 до бесконечности, а функция str
integer делит указанное число на 94 рекурсивно, объединяя остатки в виде символов (для char()
) для создания строки.
function* numbers() {
for (let i = 0;; i++) {
yield str(i);
}
}
function str(i) {
if (i === 0) {
return '';
}
return str(Math.floor(i / 94)) + char(i % 94);
}
function char(i) {
return String.fromCharCode(i+32);
}
const gen = numbers();
setInterval(() => console.log(gen.next().value), 50);
Если вы предпочитаете одну функцию, она может выглядеть так:
function* numbers() {
for (let i = 0;; i++) {
let d = i;
let s = '';
while (d > 0) {
let r = d % 94;
d = Math.floor(d / 94);
s = String.fromCharCode(r+32) + s;
}
yield s;
}
}
const gen = numbers();
setInterval(() => console.log(gen.next().value), 50);
Я предлагаю рекурсивное генераторное решение:
// Generate chars:
function* chars(from, to) {
while (from <= to) yield String.fromCharCode(from++);
}
// Generate words from chars:
function* words(from, to) {
yield* chars(from, to);
for (let word of words(from, to)) {
for (let char of chars(from, to)) {
yield word + char;
}
}
}
// Example:
let w = words(0x20, 0x7E);
setInterval(() => console.log(w.next().value), 50);
32
на код символа начального символа, а на94
- разницу между начальным и конечным символами для другого набора символов.