以可打印的ASCII

时间:2017-06-05 18:35:57

标签: javascript ecmascript-6 generator

如何使用生成器以可打印的ASCII(例如0x20)到0x7E~))获取所有可能的字符串?它应该输出(如果用.next()连续调用):

 
!
"
#
$

...

~
  
 !
 "
 #
 $

等等。我怎么能这样做?

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

最多可以尝试94次(~)。我之后如何让它工作?

2 个答案:

答案 0 :(得分:3)

在这里捅了一下。如上面的评论中所确定的,这是采用每个数字的基数94表示并添加32并打印相应的ASCII字符的问题。这就是下面(tabBarController as! AccountTopTabBarViewController).AccountCustomTabBar.changeTabIndex(1) 功能的作用。 char生成器函数从0迭代到无穷大,numbers函数整数 - 递归地将给定数字除以94,将余数连接为字符(每str)以生成字符串。



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




答案 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);