问题描述
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。
根据给定的射击坐标(x, y),请计算小E的射击得分。
测试样例
样例1:
输入:
x = 1, y = 0
输出:10
样例2:
输入:
x = 1, y = 1
输出:9
样例3:
输入:
x = 0, y = 5
输出:6
样例4:
输入:
x = 3, y = 4
输出:6
代码实现:
import math
def solution(x: int, y: int) -> int: # 计算射击点(x, y)到靶心(0, 0)的距离 distance = math.sqrt(x2 + y2)
# 根据距离计算得分
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)
代码解释
-
计算距离:
- 使用
math.sqrt(x**2 + y**2)计算射击点(x, y)到靶心(0, 0)的距离。
- 使用
-
判断得分:
- 使用一系列
if-elif-else语句根据距离判断得分。 - 距离越小,得分越高。如果距离超过所有环,则返回0分。
- 使用一系列
测试样例
- 样例1:
x = 1, y = 0,输出:10 - 样例2:
x = 1, y = 1,输出:9 - 样例3:
x = 0, y = 5,输出:6 - 样例4:
x = 3, y = 4,输出:6
进一步优化
虽然当前的代码已经能够正确计算得分,但我们可以进一步优化代码的可读性和维护性。例如,可以使用一个列表来存储每个环的得分,并通过循环来判断得分,而不是使用多个 if-elif-else 语句。
优化后的代码
import math
def solution(x: int, y: int) -> int: # 计算射击点(x, y)到靶心(0, 0)的距离 distance = math.sqrt(x2 + y2)
# 定义每个环的得分
scores = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
# 根据距离计算得分
for i in range(10):
if distance <= i + 1:
return scores[i]
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)
优化后的代码解释
-
定义得分列表:
- 使用
scores列表存储每个环的得分,索引i对应的得分是scores[i]。
- 使用
-
循环判断得分:
- 使用
for循环遍历scores列表,判断距离是否在当前环内。 - 如果距离小于等于当前环的半径,则返回对应的得分。
- 如果距离超过所有环,则返回0分。
- 使用
总结
通过使用列表和循环,我们进一步优化了代码的可读性和维护性。这种优化不仅使代码更加简洁,还使得添加或修改环的得分变得更加容易。希望这篇题解对你理解问题和编写代码有所帮助。