小E的射击训练 | 豆包MarsCode AI刷题

65 阅读2分钟

问题描述

小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。

根据给定的射击坐标(x, y),请计算小E的射击得分。

解题思路

  1. 计算距离

    • 使用欧几里得距离公式计算射击点(x, y)到靶心(0, 0)的距离。公式为: [\text{distance} = \sqrt{x^2 + y^2} ]
  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,返回0return 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. 定义环的半径和对应的得分
radii = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
scores = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

这里我们使用两个列表来存储环的半径和对应的得分。radii列表存储环的半径,scores列表存储对应的得分。

  1. 使用循环来确定得分
for i in range(len(radii)):
    if distance <= radii[i]:
        return scores[i]

通过循环遍历radii列表,检查距离是否小于等于当前环的半径。如果是,则返回对应的得分。

总结

通过使用列表和循环,我们减少了重复的条件判断,使代码更加简洁和易于维护。

希望此篇文章对您有所帮助