Как я могу получить длину текущей строки, из yield * - PullRequest
0 голосов
/ 11 декабря 2018

Я опубликовал этот вопрос: Как сгенерировать все возможные строки со всеми символами ascii определенной длины

В принятом ответе есть довольно приятный код, но у меня есть некоторыепроблемы с его пониманием.
По сути, если я спрашиваю длину выходящей строки, она всегда совпадает с максимальной длиной, которую она может вывести.

Я предполагаю, что это выход *, которыйдействительно вызывает у меня некоторые проблемы.
Читая о yield *, он говорит, что он учитывает окончательное значение.
Итак, я изменил следующий код, чтобы выделить мою проблему.

(async function() {
   for(const combo of combinations(5)) {
     console.log(combo.length + "\t" + combo);
     await timer(1);
   }
})();

Вывод выглядит следующим образом:

5      !
5      "
5      #
5      $
5      %
5      &
5      '
5      (
5      )
5      *
5      +
5      ,
5      -
5      .
5      /
5      0
5      1
5      2
5      3
5      4
5      5
5      6
5      7
5      8
5      9
5      :
5      ;

Даже если строка содержит только 1 символ, она все равно утверждает, что она равна 5.
Итак, как мне получить длину фактического значения, выходящий из генератора?

1 Ответ

0 голосов
/ 11 декабря 2018

Вы получаете длину фактического значения.Здесь происходит две вещи:

Во-первых, код, который они вам дали, выводит только строки длиной 5 (или любое другое число, которое было передано), а не строки восходящей длины, как вы просили.То есть они дали вам код, который не соответствует вашим требованиям.Если вы хотите сохранить подход с использованием генератора, вот некоторый код, который будет выводить строки всех длин 1-5, хотя я не уверен, что он находится в том порядке, в каком вы хотите:

function* combinations(length, previous = "") {
  for(const char of chars())
    yield previous + char;

  if (length > 1) {
    for (const char of chars())
      yield* combinations(length - 1, previous + char)
  }
}

Во-вторых, причинастроки выглядят как будто они короче 5 символов, потому что перед печатными символами стоят непечатаемые символы, а вы видите только печатные.Например, первый символ, с которым будет работать алгоритм, - это String.fromCharCode(0), а этот символ нельзя распечатать.

const unprintable = String.fromCharCode(0);
console.log(unprintable);
console.log(JSON.stringify(unprintable));

const longer = unprintable + '!'
console.log(longer);
console.log(JSON.stringify(longer));
console.log(longer.length);
...