該算法題來自于 codewars【語言: javascript】,翻譯如有誤差,敬請諒解~
- 任務(wù)
- 寫一個接收兩個參數(shù)的函數(shù)nico,使用
key
對msg
編碼
key:由唯一的字母和數(shù)字組成
msg: 要編碼的字符串
- 規(guī)則:首先根據(jù)提供的
key
創(chuàng)建一個數(shù)字鍵,方法是按字母順序?qū)?code>key中的數(shù)字和字母進行排序。 - 例如:
對于當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}
});
// 根據(jù)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數(shù)組內(nèi)排序
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('')
}