【Python CheckiO 题解】Sun Angle

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,传送门:https://checkio.org/,本博客主要记录自己在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。

题目描述

【Sun Angle】:您的任务是在知道一天中的时间的情况下找到太阳在地平线上方的角度。例如:太阳在 6:00 AM 在东方升起,对应于0°角。在 12:00 PM,太阳到达顶点,这意味着该角度等于90°,6:00 PM 是日落时间,因此角度为180°,如果时间是夜晚时间(上午6:00之前或下午6:00之后),则您的函数应返回“I don’t see the sun!”。

sun

【输入】:一天中的时间

【输出】:太阳的角度,四舍五入到小数点后两位

【前提】: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 对应 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 int(time[0]) >= 6 and int(time[0]) < 18:
        if int(time[1]) > 0:
            return (int(time[0])-6)*15 + int(time[1])*0.25
        else:
            return (int(time[0])-6)*15
    else:
        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-testing
    assert sun_angle("07:00") == 15
    assert 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 - 90
    return 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 - 90
    return t if 0 <= t <= 180 else "I don't see the sun!"

大神解答 NO.3

from datetime import datetime
from scipy.interpolate import interp1d

solutions = {'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!"
发布了115 篇原创文章 · 获赞 348 · 访问量 37万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览