该算法题来自于 codewars【语言: javascript】,翻译如有误差,敬请谅解~
- 任务
- 写一个接收两个参数的函数nico,使用
key
对msg
编码
key:由唯一的字母和数字组成
msg: 要编码的字符串
- 规则:首先根据提供的
key
创建一个数字键,方法是按字母顺序对key
中的数字和字母进行排序。 - 例如:
对于当key
为crazy
时,因为将crazy
排序后得到acryz
,那么crazy
编码后即为23154
,然后再使用crazy
来编码msg
。
2 3 1 5 4
---------
s e c r e
t i n f o
r m a t i
o n
编码之后为:
1 2 3 4 5
---------
c s e e r
n t i o f
a r m i t
o n - 注意:
msg
的长度不会比key
短 - 例如:
nico("crazy", "secretinformation") // "cseerntiofarmit on "
nico("abc", "abcd") // "abcd "
nico("ba", "1234567890") // "2143658709"
nico("key", "key") // "eky"
- 解答
- 其一
function nico (key, msg) {
let sortNum = [...key].sort();
let arr = [...key].map(el => {
return {k: el,n: sortNum.indexOf(el)+1}
});
// 根据key截取msg
let strArr = [];
for (let i=0;i < Math.floor(msg.length/key.length) + (msg.length%key.length ? 1 : 0);i++) {
strArr.push(msg.slice(key.length*i,key.length*(i+1)))
}
// msg数组内排序
strArr = strArr.map((el,index)=>{
let msgArr = [];
for (let i=0;i < [...el].length;i++) {
msgArr.push({k: [...el][i],n: arr[i].n})
}
msgArr = msgArr.sort((a, b) => a.n - b.n);
// 处理最后一个元素
if (index == strArr.length-1 && key.length != el.length) {
msgArr = [...key].map((el,index) => {
let obj = {k:' ',n:index+1};
for (let j=0;j<msgArr.length;j++) {
if (index+1 == msgArr[j].n) {
obj.k = msgArr[j].k;
}
}
})
}
return msgArr.map(obj => obj.k).join('');
});
return strArr.join('');
}
- 其二
function nico(key, message) {
const order = Array.from( key, (_,i) => i ).sort( (v,w) => Number(key[v]>key[w]) - Number(key[v]<key[w]) );
return ( message + " ".repeat(key.length-1) ).match( new RegExp( `.{${key.length}}`, "g" ) ).map( s => order.map( i => s[i] ).join("") ).join("");
}
- 其三
function nico (key, message) {
var numericKey = Array.from(key).sort().map(letter => key.indexOf(letter));
var encoded = [];
for (var i = 0; i < message.length / key.length; i++) {
encoded[i*key.length + j] = message[i*key.length + numericKey[j]];
}
}
return encoded.map(c => c === undefined ? " " : c).join("");
}
- 其四
function nico(k, m) {
let ks = k.split('').sort()
k = k.split('').map(l=>ks.indexOf(l))
m = m.split('')
let m2 = []
for(let i = 0; m.length>0; i+=k.length) {
m2.concat(new Array(k.length).fill(' '))
k.forEach(p=> { m2[p+i] = m.shift()||' ' })
}
return m2.join('')
}
网友评论