Получить все возможные строки в печатном ASCII

1

Как я могу получить все возможные строки в печатном ASCII (например, 0x20 () до 0x7E (~)) с использованием генератора? Он должен выводить (если постоянно .next() с .next()):

 
!
"
#
$

...

~
  
 !
 "
 #
 $

и так далее. Как я могу это сделать?

var gen = function * (){
    var counter = 0x20;
    while(true) yield String.fromCharCode(++counter);
};

работает до 94 попыток (~). Как я могу заставить это работать после этого?

Теги:
ecmascript-6
generator

2 ответа

3
Лучший ответ

Вот удар в него. Как определено в комментариях выше, речь идет о представлении каждого номера базы 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);
  • 0
    Спасибо! В какой момент ограничения целочисленного переполнения / числа с плавающей запятой приводят к тому, что это перестает работать?
  • 0
    Примечание для будущих посетителей: вы можете заменить 32 на код символа начального символа, а на 94 - разницу между начальным и конечным символами для другого набора символов.
Показать ещё 1 комментарий
1

Я предлагаю рекурсивное генераторное решение:

// 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню