[5kyu]Basic Nico variation

該算法題來自于 codewars【語言: javascript】,翻譯如有誤差,敬請諒解~

  • 任務(wù)
  • 寫一個接收兩個參數(shù)的函數(shù)nico,使用keymsg編碼
    key:由唯一的字母和數(shù)字組成
    msg: 要編碼的字符串
  • 規(guī)則:首先根據(jù)提供的key創(chuàng)建一個數(shù)字鍵,方法是按字母順序?qū)?code>key中的數(shù)字和字母進行排序。
  • 例如:
    對于當keycrazy時,因為將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('')
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,775評論 0 33
  • 直到所有事情都成了后來。 夜幕降臨的時候,周圍一切開始安靜了,一天中最寧靜的時刻已經(jīng)來了。 我想我會一直記得有個人...
    天牙閱讀 135評論 0 0
  • 今天無意中搜索,發(fā)現(xiàn)《徒然喜歡你》是部動漫。名字似乎很悲傷,但不得不說,這真是一部全程撒狗糧的動漫。 一部故事通常...
    張嚴心閱讀 543評論 14 3
  • 憋了一天的文章終于在這個點完成了。 我的內(nèi)心其實是——愧疚的,明明可以更早完成,卻非拖到現(xiàn)在,這深深暴露了我人性中...
    李斯斯閱讀 391評論 1 1
  • ——讀武志紅心理學(xué)課有感 直視那些晦暗的情緒和內(nèi)在,每一次發(fā)生都是一次自我的提升。 今天看到一句話:我就是那個沒什...
    B型血兔子007閱讀 314評論 1 0