【问题标题】:JS function for writing out a word, binary counter style写出一个单词的JS函数,二进制计数器样式
【发布时间】:2011-01-20 15:28:20
【问题描述】:

如何创建一个循环来输出任何给定的单词,如下所示:

...如果单词是'abcd'

a---
-b--
ab--
--c-
a-c-
-bc-
abc-
---d
a--d
-b-d
ab-d
--cd
a-cd
-bcd
abcd

换句话说,字母以二进制计数器顺序出现

1000
0100
1100
0010
1010

等等

谢谢

【问题讨论】:

  • (13).toString(2) == "1101";
  • 这就是如何获取二进制数字 - 我需要给定单词的字母以二进制顺序一个接一个地输出...即循环的第 4 步将输出“--c-” , 更多。不过谢谢 :-)

标签: javascript string binary


【解决方案1】:
var i = 1;
console.log("abcd".replace(/./g, function(c,n) { 
   return (i & (1 << n)) ? c : '-';
}));

只需将i1 循环到(2 ^ length) -1

【讨论】:

  • 哈哈,你的更短!好的。 :)
  • 这是一个很棒的 - 短甜:-)
【解决方案2】:

看起来您实际上想要二进制计数的反向;即对于二进制它会是

0001
0010
0011

但你正在翻转它。这很好。下面的代码从 0 计数到必要的数字(四个字母的单词为 16),获取每个数字的二进制表示,反转它,并在二进制表示中有一个的地方输出单词的字母。

function letterScroller(str) {
   var iterations = Math.pow(2,str.length);//iterate from 0 to 2**wordlength
   var result = "";
   for (i=0;i<iterations;i++) {
       //get the binary representation, pad it, and reverse it
       var bin = reverse(pad(i.toString(2), str.length));

       //loop through binary, adding character of word where there's a 1
       for (j=0;j<str.length;j++) {
           if (bin.charAt(j)=="1") {
               result += str.charAt(j)
           } else {
               result += "-";
           }
       }
       result += "<br />"; //separate lines with HTML line break
   }
   return result;
}

function pad(str, length) {
    while (str.length < length) {
       str="0" + str;
    }
    return str;
}

function reverse (str) {
  return str.split("").reverse().join("");
}

【讨论】:

  • 你的反向函数有问题
  • 我相信你,但你能给我一个潜在错误的例子吗?我得到了想要的输出。
【解决方案3】:
function doStuff(word) {
    var wordLength = word.length, num = 1 << wordLength;
    var i, bit, wordChars = word.split(""), chars;
    for (var i = 1; i < num; ++i) {
        chars = [];
        for (bit = 0; bit < wordLength; ++bit) {
            chars.push( i & 1 << bit ? wordChars[bit] : "-" );
        }
        console.log( chars.join("") );
    }
}

doStuff("abcd");

【讨论】:

    【解决方案4】:

    使用 KennyTM 的代码可以很容易地完成

    String.prototype.reverse = function(){
    splitext = this.split("");
    revertext = splitext.reverse();
    reversed = revertext.join("");
    return reversed;
    }
    
    str='abcd'; //your string
    for(var i=0;i<20;i++){ //a loop of numbers  
      var result='';
    
      var ii=i.toString(2).reverse();
      for(var q=0;q<Math.max(ii.length,str.length);q++){
        if(ii.charAt(q)=='1'){
          result+=str.charAt(q);
        }else{
          result+='-';
          }
      }      
    
     document.write(result+'<br>');
    }
    

    这很有趣 :) 你需要那个做什么?

    【讨论】:

    • 我想把它用作一种进度指示器——就像一个微调器,但正在计数......
    • 如果将 '20' 替换为 'Math.pow(str.length,2)',您将获得正确数量的循环...
    【解决方案5】:

    这是简短的版本:

    var string = 'abcd';
    for (i = 1; i < Math.pow(string.length,2); i++) {
        str = "";
        for (j = 0; j < string.length; j++) {
            if (i & (1 << j)) 
                str += string[j];
            else
               str += "-";
        }
     console.log(str);
    }
    

    享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多