[6kyu]Grill it!

该算法题来自于 codewars【语言: javascript】,翻译如有误差,敬请谅解~


  • 介绍

格栅密码是通过将纸张透过穿孔的纸张(纸或纸板或类似物)写入一张纸来加密明文的技术。这种加密方法最早出现在1550年的Girolamo Cardano的聚会上。他的建议是使用一个矩形模板,其中允许单个字母,音节或单词被写入,然后通过其各种穿孔的纸张读取。明文的书面片段可以进一步伪装,通过用无止尽的单词或字母填充片段之间的空白。这也是隐写术的变种之一,许多格栅密码都是是如此。

  • 任务
  • 写一个函数接收两个参数(message,code),并返回从message中解密出隐藏信息。
  • 例如:
    grille("abcdef", 5) => "df"
  message : abcdef
    code    : 000101
    ----------------
    result  : df

  • 解答
  • 其一
const grille = (message, code) => {
      let binary = (code).toString(2);
      let decode = binary.length < message.length ? '0'.repeat(message.length-binary.length) + binary : binary.substr(-message.length); 
      let str = '';
      if (message){  
        for(let i=0;i<[...decode].length;i++){
          if(~~[...decode][i]) {
            str += [...message][i];
          }
        }
      }
      return str;
}
  • 其二
function grille(message, code) {
      var binary = code.toString(2).split("");
      var input = message.split("");   
      var output = [];   
      while (binary.length > 0){
        var char = binary.pop();
        if (char == 1) output.push(input.pop());
          else input.pop();
      }   
      return output.reverse().join("") 
}
  • 其三
function grille(message, code) {
      const mask = ('0'.repeat(message.length)+code.toString(2)).slice(-message.length);
      return [...message].filter((c,i)=>+mask[i]).join('');
}
  • 其四
function grille(message, code) {
      var s =""
      var cy = code.toString(2).split("").reverse()
      return message.split("").reverse().filter((a,i) =>cy[i]=="1").reverse().join("")
}
  • 其五
const grille = (s,n) => [].reduceRight.call( s, (acc,v) => ( n&1 && ( acc=v+acc, n-=1 ), n/=2, acc ), "" ) ;

你可能感兴趣的:([6kyu]Grill it!)