在这个Codewar问题中,我的C代码有一个问题:
贪婪是一种用五个六面骰子玩的骰子游戏.你的任务,如果你 Select 接受它,就是根据这些规则得分.您将始终获得一个具有五个六面骰子值的array.
三个
1
‘S(⚀)=>;1
0分
三个6
‘S(⚅)=>;600分
三5
‘S(⚄)=>;500分
三4
‘S(⚃)=>;400分
三个3
‘S(⚂)=>;300分
三2
‘S(⚁)=>;200分
一个1
(⚀)=>;1
分
一5
(⚄)=>;50分每一卷只能计算一次单个骰子.例如,给定的
5
只能算作三元组的一部分(贡献500分)或单个50分,但不能同时计算在同一卷中.打分示例
Throw Score
---------------------------
5 1 3 4 1
250: 50 (for the5
) + 2 * 100 (for the1
s)
1 1 1 3 1
1100: 1000 (for three1
s) + 100 (for the other1
)
2 4 4 5 4
450: 400 (for three4
s) + 50 (for the5
)在某些语言中,可以改变函数的输入.这是你永远不应该做的事情.如果您改变输入,您将无法通过所有测试.
我的解决方案如下所示:
int score(const int dice[5]) {
int score = 0;
int digits[6] = { 0 };
for (int i = 0; i < 5; i++) {
digits[dice[i]]++;
}
// Rules
// 100 points for each 1 except when there is more than 2
if (digits[1] < 3) {
score += digits[1] * 100;
} else {
score += (digits[1] % 3) * 100;
}
// 50 points for each 5
if (digits[5] < 3) {
score += digits[5] * 50;
} else {
score += (digits[5] % 3) * 50;
}
// 1000 points for 3 1s
for (int i = 1; i <= 6; i++) {
int repeats = digits[i];
if (repeats >= 3) {
switch (i) {
case 1:
score += 1000;
break;
case 2:
score += 200;
break;
case 3:
score += 300;
break;
case 4:
score += 400;
break;
case 5:
score += 500;
break;
case 6:
score += 600;
break;
default:
break;
}
}
}
return score;
}
有时,测试通过了OK,但没有明显的原因,它就不会通过相同的测试.代码在我的机器上的所有测试中都运行得很好,所以我怀疑我引入了一个依赖于机器/编译器的错误,该错误是在Codewar运行它时出现的.如果有人能指给我看,那就太棒了.
我试图在我的机器上重新运行它,结果都很成功.这个问题可以在Codewar中找到, here个