题解:小E的射击训练

88 阅读3分钟

问题描述

小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)

代码解释

  1. 计算距离

    • 使用 math.sqrt(x**2 + y**2) 计算射击点 (x, y) 到靶心 (0, 0) 的距离。
  2. 判断得分

    • 使用一系列 if-elif-else 语句根据距离判断得分。
    • 距离越小,得分越高。如果距离超过所有环,则返回0分。

测试样例

  • 样例1x = 1, y = 0,输出:10
  • 样例2x = 1, y = 1,输出:9
  • 样例3x = 0, y = 5,输出:6
  • 样例4x = 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)

优化后的代码解释

  1. 定义得分列表

    • 使用 scores 列表存储每个环的得分,索引 i 对应的得分是 scores[i]
  2. 循环判断得分

    • 使用 for 循环遍历 scores 列表,判断距离是否在当前环内。
    • 如果距离小于等于当前环的半径,则返回对应的得分。
    • 如果距离超过所有环,则返回0分。

总结

通过使用列表和循环,我们进一步优化了代码的可读性和维护性。这种优化不仅使代码更加简洁,还使得添加或修改环的得分变得更加容易。希望这篇题解对你理解问题和编写代码有所帮助。