CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。
CheckiO 官网:https://checkio.org/
我的 CheckiO 主页:https://py.checkio.org/user/TRHX/
CheckiO 题解系列专栏:https://itrhx.blog.csdn.net/category_9536424.html
CheckiO 所有题解源代码:https://github.com/TRHX/Python-CheckiO-Exercise
题目描述
【Sun Angle】:您的任务是在知道一天中的时间的情况下找到太阳在地平线上方的角度。例如:太阳在 6:00 AM 在东方升起,对应于0°角。在 12:00 PM,太阳到达顶点,这意味着该角度等于90°,6:00 PM 是日落时间,因此角度为180°,如果时间是夜晚时间(上午6:00之前或下午6:00之后),则您的函数应返回“I don’t see the sun!”。
【链接】:https://py.checkio.org/mission/sun-angle/
【输入】:一天中的时间
【输出】:太阳的角度,四舍五入到小数点后两位
【前提】:00:00 <= time <= 23:59
【范例】:
sun_angle("07:00") == 15
sun_angle("12:15"] == 93.75
sun_angle("01:23") == "I don't see the sun!"
解题思路
将输入的时间字符串进行分割,分为小时和分钟两部分
分析时针,06:00
对应 0°
,07:00
对应 15°
,18:00
对应 180°
,也就是每增加 1 个小时,度数就增加 15°
分析分针,60 分钟等于 1 小时,分针转 1 圈(360°)时针转 1/24 圈(15°),那么 1 分钟,时针转 0.25°
如果是整点,那么只需要计算有多少个 15° 就行了
如果不是整点,除了要计算有多少个 15° ,还需要计算有多少个 0.25°,最后两者相加
注意时钟要大于等于 6 并且小于 18,此外,还有特殊的 18 点整等于 180°
代码实现
def sun_angle(time):time = time.split(':')if int(time[0]) == 18 and int(time[1]) == 0:return int(180)elif 6 <= int(time[0]) < 18:if int(time[1]) > 0:return (int(time[0])-6)*15 + int(time[1])*0.25else:return (int(time[0])-6)*15else:return "I don't see the sun!"if __name__ == '__main__':print("Example:")print(sun_angle("07:00"))# These "asserts" using only for self-checking and not necessary for auto-testingassert sun_angle("07:00") == 15assert sun_angle("01:23") == "I don't see the sun!"print("Coding complete? Click 'Check' to earn cool rewards!")
大神解答
大神解答 NO.1
def sun_angle(time):h, m = list(map(int, time.split(':')))angle = 15 * h + m / 4 - 90return angle if 0 <= angle <= 180 else "I don't see the sun!"
看了大神的代码才知道自己写的代码有多菜!如此简洁明了,完全不用我那么复杂!
大神解答 NO.2
def sun_angle(time):t = int(time[:2]) * 15 + int(time[3:]) / 4 - 90return t if 0 <= t <= 180 else "I don't see the sun!"
大神解答 NO.3
from datetime import datetime
from scipy.interpolate import interp1dsolutions = {'06:00': 0, '12:00': 90, '18:00': 180}
stamp = lambda time: datetime.strptime(time, '%H:%M').timestamp()
line = interp1d([*map(stamp, solutions)], [*solutions.values()])def sun_angle(time):try: return line(stamp(time))[()]except ValueError: return "I don't see the sun!"