首页 > 解决方案 > Codewars Kata - 4th Kyu - Codewars 风格排名系统 - “+1 问题”

问题描述

心想这个kata会很爽,休息一下就轻松回到js。我错了大声笑。因此,kata 的 URL 包含所有逻辑和数学信息,我将把必要的放在下面。

网址: https ://www.codewars.com/kata/51fda2d95d6efda45e00004e/train/javascript

代码:

class User {
    constructor() {
        this.rank = -8;
        this.progress = 0;
    this.rankTable=[-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8];
    this.rankIndicator=0;
    }
  
    incProgress(rankOfActivity) {
    if (rankOfActivity == 0 || rankOfActivity > 8 || rankOfActivity < -8) throw new error("Rank input out of range");
        if (rankOfActivity <= this.rank - 2) return;
    let diff = this.rankTable.indexOf(rankOfActivity)-this.rankTable.indexOf(this.rank);
    if (diff==0) this.progress+=3;
    else if(diff==-1) this.progress+=1;
    else if(this.rank!=8){
      this.progress+= 10*diff*diff;
      while(this.progress>=100 && this.rank<8){
        this.progress-=100;
        this.rankIndicator++;
        this.rank=this.rankTable[this.rankIndicator];
      }
    }
    if (this.rank==8) this.progress=0;
  }
}

完成排名比用户低一级的活动将获得 1 分

看到之后,我的观点是:如果活动排名和用户排名之间的差异是 -1 ,例如:

用户的排名为 -2(rankTable 数组中的索引 6)

活动排名为 -3(rankTable 数组中的索引 5)

差异将是 5-6 = -1

所以它应该加起来 1 点进度,看起来它没有这样做,我无法弄清楚为什么它没有加起来。

这里有一堆错误表明它发生在任何等级上。

应用 -1 等级后,进度预计为 21,但实际上是 20

应用 3 级后,进度预计为 61,但实际上是 60

应用 8 级后,进度预计为 51,但实际上是 50

标签: javascriptarrays

解决方案


    //...
    //if (rankOfActivity <= (this.rank - 2)) return;
    //bug
    let diff = (this.rankTable.indexOf(rankOfActivity)) - (this.rankTable.indexOf(this.rank));
    
    if (diff <=-2)return;//
    //fixed
    //...

就个人而言,我不喜欢数组并indexOf在这里使用。使用 [0 到 15] 的排名计数器会好一些。


推荐阅读