问题描述
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标
(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。根据给定的射击坐标
(x, y),请计算小E的射击得分。
解题思路
-
计算距离:
- 使用欧几里得距离公式计算射击点
(x, y)到靶心(0, 0)的距离。公式为:[\text{distance} = \sqrt{x^2 + y^2} ]
- 使用欧几里得距离公式计算射击点
-
确定得分:
- 根据计算出的距离,确定射击点所在的环。靶心内(半径为1)得10分,依次向外的每个环分数减少1分。
- 具体来说,如果距离小于等于1,得10分;距离小于等于2,得9分;距离小于等于3,得8分;依此类推,直到距离大于10,得0分。
代码框架
import math
def solution(x: int, y: int) -> int:
# 计算射击点与靶心的距离
distance = math.sqrt(x**2 + y**2)
# 根据距离确定得分
if distance <= 1:
return 10
elif distance <= 2:
return 9
elif distance <= 3:
return 8
elif distance <= 4:
return 7
elif distance <= 5:
return 6
elif distance <= 6:
return 5
elif distance <= 7:
return 4
elif distance <= 8:
return 3
elif distance <= 9:
return 2
elif distance <= 10:
return 1
else:
return 0
if __name__ == '__main__':
print(solution(1, 0) == 10)
print(solution(1, 1) == 9)
print(solution(0, 5) == 6)
print(solution(3, 4) == 6)
当然会有重复的代码而且量也很大(这种方法比较好理解↑↑↑),所以这里提供一种简化过后的方法。
import math
def solution(x: int, y: int) -> int:
# 计算射击点与靶心的距离
distance = math.sqrt(x**2 + y**2)
# 定义环的半径和对应的得分
radii = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
scores = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
# 根据距离确定得分
for i in range(len(radii)):
if distance <= radii[i]:
return scores[i]
# 如果距离大于10,返回0分
return 0
if __name__ == '__main__':
print(solution(1, 0) == 10)
print(solution(1, 1) == 9)
print(solution(0, 5) == 6)
print(solution(3, 4) == 6)
- 定义环的半径和对应的得分:
radii = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
scores = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
这里我们使用两个列表来存储环的半径和对应的得分。radii列表存储环的半径,scores列表存储对应的得分。
- 使用循环来确定得分:
for i in range(len(radii)):
if distance <= radii[i]:
return scores[i]
通过循环遍历radii列表,检查距离是否小于等于当前环的半径。如果是,则返回对应的得分。
总结
通过使用列表和循环,我们减少了重复的条件判断,使代码更加简洁和易于维护。
希望此篇文章对您有所帮助