gpt4 book ai didi

ruby-on-rails - 如何根据点数相应地查找和更新关卡?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:07 26 4
gpt4 key购买 nike

我正在创建一个类似于游戏的 Rails 应用程序。所以它有积分和等级。例如:要成为一级,用户必须至少获得 100 分,而对于二级,用户必须达到 2 级,用户必须收集 200 分。每 10 个级别后,级别差异会发生变化,即每个级别之间的差异始终在 10 个级别后发生变化。我的意思是,一级和二级之间的分数差异是 100,而 11 和 12 之间的分数差异是 150,依此类推。级别没有上限。

现在我的问题是,假设用户的总分是 3150,刚刚更新到 3155。找到当前级别并在需要时更新它的最佳解决方案是什么?

我可以使用 while 循环并在其中再次循环得到一个解决方案,这将得到 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

最佳答案

我写了一个get_points功能(应该不难)。然后基于它get_level需要求解二次方程才能找到 high 的函数值,然后计算 low .

如果您有任何问题,请告诉我。

检查输出 here .

#!/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()

Why did you set the value of a=250 and b = 750? Can you explain that to me please?

让我们写出每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 级别 * 50 差异变化)并收到从 2 开始的算术级数:

 10 - 2  (+2)
20 - 5 (+3)
30 - 9 (+4)
40 - 14 (+5)

使用arithmetic progression获得 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 , 我。 e. 250 * high^2 + 750 * high - points <= 0 .值 a = 250为正,抛物线的分支向上。现在我们找到quadratic equation的解法250 * high^2 + 750 * high - points = 0并丢弃实部(在 python 脚本中是 high = int(x))。

关于ruby-on-rails - 如何根据点数相应地查找和更新关卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57459713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com