该算法题来自于 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 ), "" ) ;