我正在创建一个rails应用程序,就像一个游戏。所以它有积分和等级。例如:要成为第一级,用户必须至少获得100分,而对于第二级,用户必须达到二级,用户必须收集200个积分。水平差异在每10个层次之后变化,即每个层次之间的差异总是在10个层次之后变化的。我的意思是,第一级和第二级的差值是100,第11和12级的差是150,依此类推。没有级别的上限。
现在我的问题是,假设一个用户的总分是3150,并且刚刚更新到3155。找到当前级别并在需要时更新它的最佳解决方案是什么?
我可以用will循环得到一个解,然后再在里面循环,这样就可以得到O(n^2)的结果。我需要更好的东西。
我认为这段代码有效,但我不确定这是否是最好的方法
def get_level(points)
diff = 100
sum = 0
level = -1
current_level = 0
while level.negative?
10.times do |i|
current_level += 1
sum += diff
if points > sum
next
elsif points <= sum
level = current_level
break
end
end
diff += 50
end
puts level
end发布于 2019-08-12 18:04:52
我编写了一个get_points函数(应该不难)。然后在此get_level函数的基础上,通过求解二次方程求出high值,然后计算low。
如果你有什么问题,告诉我。
检查输出这里。
#!/usr/bin/env python3
import math
def get_points(level):
high = (level + 1) // 10
low = (level + 1) % 10
high_point = 250 * high * high + 750 * high # (3 + high) * high // 2 * 500
low_point = (100 + 50 * high) * low
return low_point + high_point
def get_level(points):
# quadratic equation
a = 250
b = 750
c = -points
d = b * b - 4 * a * c
x = (-b + math.sqrt(d)) / (2 * a)
high = int(x)
remainder = points - (250 * high * high + 750 * high)
low = remainder // (100 + 50 * high)
level = high * 10 + low
return level
def main():
for l in range(0, 40):
print(f'{l:3d} {get_points(l - 1):5d}..{get_points(l) - 1}')
for level, (l, r) in (
(1, (100, 199)),
(2, (200, 299)),
(9, (900, 999)),
(10, (1000, 1149)),
(11, (1150, 1299)),
(19, (2350, 2499)),
(20, (2500, 2699)),
):
for p in range(l, r + 1): # for in [l, r]
assert get_level(p) == level, f'{p} {l}'
if __name__ == '__main__':
main()为什么要设置a=250和b= 750的值?你能给我解释一下吗?
让我们每隔10个级别写出一次,并说明各点之间的差异:
lvl - pnt (+delta)
10 - 1000 (+1000 = +100 * 10)
20 - 2500 (+1500 = +150 * 10)
30 - 4500 (+2000 = +200 * 10)
40 - 7000 (+2500 = +250 * 10)除以500 (10 levels * 50 difference changes),并收到从2开始的算术级数:
10 - 2 (+2)
20 - 5 (+3)
30 - 9 (+4)
40 - 14 (+5)使用算术级数获取积分公式表示level = k * 10值等于:
sum(x for x in 2..k+1) * 500 =
(2 + k + 1) * k / 2 * 500 =
(3 + k) * k * 250 =
250 * k * k + 750 * k现在我们有了points,并且希望找到最大的high,例如point >= 250 * high^2 + 750 * high,即250 * high^2 + 750 * high - points <= 0.值a = 250是正的,抛物线的分支是向上的。现在我们找到了二次方程 250 * high^2 + 750 * high - points = 0的解决方案,并放弃了真正的部分(在python脚本中是high = int(x) )。
https://stackoverflow.com/questions/57459713
复制相似问题