资讯动态

freeCodeCamp 每日编程挑战 55:用 Python 实现恒星光谱分类(OBAFGKM)

发布时间:2026/9/10 0:57:32 来源:尧图企业网站定制
freeCodeCamp 每日编程挑战 55用 Python 实现恒星光谱分类OBAFGKM【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南围绕 freeCodeCamp 开源仓库中的每日编程挑战第 55 题展开根据恒星表面温度开尔文 K判断其光谱分类输出经典的O、B、A、F、G、K、M分类字母。文章将完整解析题目要求、七个温度区间划分、八个官方测试用例、种子代码与标准解法并结合仓库源码说明每日挑战的存储、校验与评分机制。读完本文你不仅能独立解出这道题还能理解这类挑战题目在 freeCodeCamp 中从 Markdown 到数据库、再到前端评测的完整链路。挑战背景世界空间周与天文主题编码本题位于 daily-coding-challenges-python 区块是该系列的第 55 题Challenge 55。题目描述明确指出10 月 4 日是世界空间周World Space Week的开始接下来的七天每天都会带来一个天文主题的编程挑战本挑战正是空间周第一天的恒星分类题。在区块的challengeOrder中可以找到本挑战的登记信息ID 为68c1a929005bf54d342aa8d2标题为 Challenge 55: Space Week Day 1: Stellar Classification紧随其后的是空间周第二至第七天Exoplanet Search、Phone Home、Landing Spot、Goldilocks Zone、Moon Phase、Launch Fuel。由此可见本题并非孤立的语法练习而是 freeCodeCamp 用连续主题串联编程能力的教学设计同一周内你将从恒星分类一路写到发射燃料计算。题目要求温度到光谱类型的映射题目给出一个恒星表面温度单位开尔文 K要求返回该恒星的光谱分类。分类依据是经典的哈佛光谱分类体系OBAFGKM温度越高字母越靠前具体的区间划分如下分类温度区间 (K)说明O30,000 K 及以上最热、最蓝的恒星B10,000 K – 29,999 K蓝白色恒星A7,500 K – 9,999 K白色恒星F6,000 K – 7,499 K黄白色恒星G5,200 K – 5,999 K黄色恒星如我们的太阳K3,700 K – 5,199 K橙色恒星M0 K – 3,699 K最冷、最红的恒星注意区间的边界处理每个区间都是下限包含、上限不包含除O无上限、M无下限。例如 6,000 K 属于F而非G3,700 K 属于K而非M3,699 K 属于M。这些边界值恰恰是官方测试用例重点覆盖的对象。从天文常识看我们的太阳表面温度约为 5,778 K落在 5,200 K – 5,999 K 区间因此属于G型恒星——这也是本题测试用例的第一个断言。函数签名与种子代码题目要求实现名为classification的函数接收一个参数temp恒星表面温度单位为 K返回对应的分类字母字符串。种子代码位于原文档的--seed-contents--部分def classification(temp): return temp种子函数目前只是原样返回温度你需要补充判断逻辑。挑战类型为challengeType: 29即每日编程挑战Daily Coding Challenge与普通练习不同这类题目在仓库中采用JavaScript 与 Python 双语言的结构——同一道题在 daily-coding-challenges-javascript 区块存在对应的 JavaScript 版本本文聚焦 Python 解法。官方测试用例边界值与典型值的双重覆盖--hints--部分给出了 8 个测试断言它们共同验证了解法的正确性。每个测试都通过runPython调用 Python 的unittest.TestCase().assertEqual(...)来执行输入温度 (K)期望输出测试意义5778G太阳表面温度典型 G 型恒星2400M典型的红矮星9999AA 区间上边界10,000 K 以下3700KK 区间下边界3699M与上一条形成边界对照210000O远超 30,000 K 的极端高温6000FF/G 分界边界值11432B典型的 B 型恒星这组用例的设计颇具匠心既有5778、2400、11432这样的典型值也有9999、3700、3699、6000这样的边界值可以同时检验你的比较运算符是否用了而非以及区间是否出现缝隙或重叠。在 freeCodeCamp 的评测体系中hints中的testString会被解析为可执行的测试代码。从 api/src/daily-coding-challenge/schemas/daily-coding-challenge.ts 可以看到每个挑战的测试由text测试说明与testString可执行测试字符串两部分构成在 client/src/utils/daily-coding-challenge-validator.ts 中DailyCodingChallengeFromDb结构也明确了tests数组会保存这两部分内容用于前端评测时回放。标准解法一条 if/elif 链搞定七个区间官方--solutions--给出的解法如下def classification(temp): if temp 30000: return O elif temp 10000: return B elif temp 7500: return A elif temp 6000: return F elif temp 5200: return G elif temp 3700: return K else: return M解法思路拆解这个解法的精髓在于利用递减的阈值配合elif短路求值将区间判断转化为下界判断首先检查是否 30000命中即返回O未命中说明temp 30000此时再检查 10000命中的自然落入 10,000 – 29,999 的B区间依此类推每个elif都隐含了已排除上方所有区间的前提最后所有条件都不满足时temp 3700落入else返回M。由于 Python 的elif链从上到下依次短路求值这种写法不需要显式写出每个区间的上界也天然保证了区间不重叠、无缝隙正确处理了题目中所有边界值9999不满足 30000、 10000但满足 7500返回A✓3700满足 3700返回K✓3699不满足任何elif落入else返回M✓6000满足 6000返回F✓复杂度分析该算法的时间复杂度为 O(1)最多执行 7 次整数比较空间复杂度为 O(1)仅使用常数额外空间。由于区间数量固定7 类无论输入温度多大判断次数都不随输入规模增长。常见易错点边界运算符选错若将写成则9999会落入B、6000会落入G导致测试失败区间顺序颠倒若从低温向高温判断先判断M由于低温条件最先满足高温恒星会被误判为M返回类型错误题目要求返回字符串如G而非整数或布尔值。进阶思路二分查找与查表法虽然 if/elif 链是本题的最简解但了解其他实现思路有助于应对区间数量变大的泛化场景二分查找法将阈值与分类放入有序序列用bisect定位温度所在区间import bisect def classification(temp): thresholds [30000, 10000, 7500, 6000, 5200, 3700] classes [O, B, A, F, G, K, M] # bisect_right 返回第一个大于 temp 的阈值下标temp 恰好等于阈值时归入更热区间 idx bisect.bisect_right(thresholds, temp - 1) return classes[min(idx, len(classes) - 1)]在区间数量固定的场景下这种写法与 if/elif 链性能相当但可读性因人而异if/elif 链的优势是意图直白、无需引入bisect。从 Markdown 到每日挑战仓库中的完整链路本挑战的 Markdown 文件只是源头每日编程挑战在实际运行中还经历以下环节均可从仓库源码验证1. 区块定义curriculum/structure/blocks/daily-coding-challenges-python.json 声明了该区块的属性——helpCategory: Python、blockLayout: legacy-challenge-list、usesMultifileEditor: true并在challengeOrder中按顺序登记 300 道挑战本挑战ID68c1a929005bf54d342aa8d2排在第 55 位。2. 数据入库tools/daily-challenges/seed-daily-challenges.ts 是每日挑战的种子脚本。它通过 GraphQL 从 dev-playground 超级区块抓取 JavaScript 与 Python 两套挑战数据校验两者数量一致且等于EXPECTED_CHALLENGE_COUNT 365后以bulkWriteupsert写入 MongoDB 的DailyCodingChallenges集合。每个挑战会被分配一个顺序递增的challengeNumber和按起始日期2025-08-11 UTC逐日递增的date字段这正是每日挑战的时间来源。3. 接口与校验api/src/daily-coding-challenge/routes/daily-coding-challenge.ts 提供查询每日挑战的 APIapi/src/daily-coding-challenge/schemas/daily-coding-challenge.ts 使用 Joi 校验数据库返回结构要求每条挑战必须同时包含javascript与python两个语言对象且每个对象都含tests与challengeFiles数组——也就是说本道 Python 挑战的种子代码与测试字符串最终会被打包进这个统一结构中。4. 前端入口client/src/components/daily-coding-challenge/widget.tsx 是用户在首页/学习地图上看到的每日编程挑战入口组件提供前往今日挑战按美国中部时间的月日生成链接与挑战归档两个按钮client/src/client-only-routes/show-daily-coding-challenge.tsx 则负责渲染具体的挑战页面并驱动评测。5. 评测执行挑战页面中的测试通过runPython将--hints--里的testString如from unittest import TestCase; TestCase().assertEqual(classification(5778), G)注入 Python 运行时执行用户代码的返回值与期望值逐一比对。这也是为什么每个 hint 都用unittest.TestCase().assertEqual包裹的原因——评测器只需要断言函数输出即可无需关心用户如何实现。在本地验证你的解法你可以直接在本地 Python 环境3.x 即可无需额外依赖中验证解法python -c from unittest import TestCase def classification(temp): if temp 30000: return O elif temp 10000: return B elif temp 7500: return A elif temp 6000: return F elif temp 5200: return G elif temp 3700: return K else: return M cases [(5778, G), (2400, M), (9999, A), (3700, K), (3699, M), (210000, O), (6000, F), (11432, B)] for temp, expected in cases: TestCase().assertEqual(classification(temp), expected) print(fclassification({temp}) {classification(temp)!r} (期望 {expected!r})) print(全部 8 个测试通过) 如果输出显示 8 组断言全部通过你的实现就与官方--hints--完全一致。小结本挑战用一道简洁的天文映射题综合训练了 Python 条件判断的三个关键能力区间划分与边界处理理解下限包含、上限不包含的区间语义并正确选用elif链的短路求值利用判断顺序消除冗余条件写出无缝隙、无重叠的分支逻辑面向测试的编码习惯以官方 hints 中的边界用例为基准自查实现。在仓库中这道题对应的源文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-python/68c1a929005bf54d342aa8d2.md如果你想继续挑战同一主题系列可以在同一目录下阅读空间周其余六天的题目68c1a929005bf54d342aa8d3至68c497f3aaefc9fd9f1b0e25把天文主题连续刷完。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价