codewars是一個線上程式設計網站,其獎勵機制像打怪升級。你不能檢視高於你級別的問題的答案。除非自己通過提交測試。通過提交之後可以看到各種解法排行榜 。通過對比自己解法和排行榜對比,可以找到差距,提高能力。

     描述 : greed dice 是一個骰子游戲,使用5個骰子,5個點數根據 一定的規則 算出分數,你要做的就是根據輸入的陣列點數,輸出最後的分數 。

規則如下 : 3個 1  = 1000分,3個6  = 600分,3個5=500分,3個4 = 400分,3個3 = 300分,3個2 = 200分,1個1 = 100分,1個5 = 50分。

題目應該很簡單,根據輸入的點數,統計每個點數的個數,然後根據規則計算得分。

我的程式碼:

<span style="font-size:18px;">function score( dice ) {
  // Fill me in!
  var score = 0 ;
  var diceR = [ 0,0,0,0,0,0] ;
  var length = dice.length ;
  for (var i =0 ; i < dice.length ; ++ i){
              diceR[dice[i] ] += 1;
          }
  for(var index = 1;index <= diceR.length ;++ index ){
    var item = diceR[index] ;
     if ( item > 0) {
       switch (index){
                  case 1 :  score +=  1000* Math.floor(item /3) + 100* (item %3);continue;
                  case 2 :  
                  case 3 : 
                  case 6 :  
                  case 4 :  score +=  index*100 * Math.floor(item /3) ;continue;
                  case 5 :  score +=  index*100 * Math.floor(item /3) + 50* (item %3); continue;  
                  default : score += 0 ;continue ;                
             }  
     }
  }
   return score ;
}</span>
diceR 陣列是根據下標對應個數。在官網test通過,submit有一個測試案例通不過,但是不知道輸入,到現在也沒想到原因,糾結中,求看到有興趣的私信呀

看一下排行榜第一的程式碼 :

<span style="font-size:18px;"> function score( dice ) {
     var diceR = [0,0,0,0,0,0] ;
     var tdr = [1000,200,300,400,500,600] ;
     var sdr = [100,0,0,0,50,0] ;
     dice.forEach(function(item){
       diceR[item -1] ++ ;
     })
  return   diceR.reduce(function(prev,cur,index){
         return prev + ( cur >= 3 ? tdr[index] : 0)+ sdr[index] * (cur%3) ;
    },0)
}</span>
分析 :  精妙之處 1 ,對原陣列出現個數的統計,我使用了for迴圈,這裡使用forEach函式,陣列的forEach函式,不返回值,只對每一項執行特定的函式,本質上與用for迴圈迭代陣列一樣,用自身函式,效率更高。 2  計算最終結果時,我又用了for迴圈,並且因為要判斷6中情況,所以我還嵌套了一個switch語句,簡直不能忍,這裡把的分數放入陣列,類似於雜湊表的都是用,計算個數對應的得分。 3 歸併函式的使用,reduce函式就是逐個迭代陣列所有項,然後構建一個最終返回值。用在這裡簡練精巧。

 JavaScript提供了很多原生的方法,多練習才能更熟練的運用。