ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

freeCodeCamp 每日编程挑战解析:用 Python 计算恒星的宜居带(Goldilocks Zone)

2026/9/10 0:57:59 拓冰建站 浏览量
freeCodeCamp 每日编程挑战解析:用 Python 计算恒星的宜居带(Goldilocks Zone) freeCodeCamp 每日编程挑战解析用 Python 计算恒星的宜居带Goldilocks Zone【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇指南以 freeCodeCamp 课程仓库中curriculum/challenges/english/blocks/daily-coding-challenges-python/68c1a929005bf54d342aa8d6.mdChallenge 59Space Week Day 5为蓝本系统讲解如何用 Python 根据恒星质量计算其宜居带范围完整覆盖题目要求、数学建模、测试用例、参考实现并结合仓库源码剖析每日挑战在 freeCodeCamp 课程体系中的定义、执行与发布机制。读完本文你将能独立完成该挑战并理解其背后的质光关系与 Web Worker 评测原理。挑战背景Space Week 与宜居带是什么该挑战属于 freeCodeCampdaily-coding-challenges-python模块Python 每日编程挑战是太空周Space Week系列的第 5 天题目。Space Week 系列共 7 题Challenge 55~61分别围绕恒星分类、系外行星搜索、通信、着陆点、宜居带、月相与发射燃料等天文学主题展开。可以从 daily-coding-challenges-python.json 中的challengeOrder看到完整序列Challenge 55Space Week Day 1: Stellar Classification恒星分类Challenge 56Space Week Day 2: Exoplanet SearchChallenge 57Space Week Day 3: Phone HomeChallenge 58Space Week Day 4: Landing SpotChallenge 59Space Week Day 5: Goldilocks Zone本篇Challenge 60Space Week Day 6: Moon PhaseChallenge 61Space Week Day 7: Launch Fuel所谓Goldilocks Zone金发姑娘区即宜居带——恒星周围距离恰到好处、温度允许液态水存在的环形区域既不太近也不太远just right。本挑战采用简化的天文学模型只依据恒星质量估算宜居带内外边界距离以**天文单位AU**度量1 AU 约为地球到太阳的平均距离。题目要求与数学模型题目原文要求非常明确核心是一个三步计算流程计算恒星光度luminosity将质量以太阳质量为单位取 3.5 次幂即luminosity mass ** 3.5。这是天体物理中主序星的质量-光度关系L ∝ M³·⁵的简化应用——质量越大的恒星越亮其宜居带也随之外移。计算宜居带起点内侧边界光度的平方根乘以 0.95即start 0.95 * sqrt(luminosity)。计算宜居带终点外侧边界光度的平方根乘以 1.37即end 1.37 * sqrt(luminosity)。输出要求为包含起点和终点距离的数组且两项均四舍五入保留两位小数。由于sqrt(mass ** 3.5)在数学上等价于mass ** 1.75该模型也可以写成更紧凑的形式start round(0.95 * mass ** 1.75, 2) end round(1.37 * mass ** 1.75, 2)题目给出的示例质量为1即 1 倍太阳质量时返回[0.95, 1.37]——这正是公式代入 M1 的结果也印证了太阳本身的宜居带估算范围。测试用例一览hints原文档以--hints--区块的形式内置了 5 组断言全部使用 Python 标准库unittest的TestCase().assertEqual进行严格相等比较。这些用例覆盖了**整数、小数、低质量恒星M1与高质量恒星M1**四种典型输入是验证实现正确性的金标准输入质量 mass期望返回值AU验证要点1[0.95, 1.37]基准用例太阳质量验证公式系数正确0.5[0.28, 0.41]小数/亚太阳质量验证低光度下边界收缩3.7[9.38, 13.52]小数 较大质量验证舍入行为6[21.85, 31.51]整数大质量验证平方根换算20[179.69, 259.13]极端大质量验证结果随质量非线性增长将任意一行代入公式均可精确复现例如mass 20时20 ** 3.5 ≈ 35777.09取其平方根约189.150.95 × 189.15 ≈ 179.691.37 × 189.15 ≈ 259.13与期望输出完全一致。可见宜居带半径随质量呈约 1.75 次幂的超线性增长这就是为什么 20 倍太阳质量的恒星宜居带远达近 260 AU。从种子代码到参考实现原文档的--seed-contents--提供了一个待补全的函数骨架def goldilocks_zone(mass): return mass可见学习者只需填充函数体、保持函数名与签名不变即可。官方--solutions--给出的参考实现如下import math def goldilocks_zone(mass): luminosity mass ** 3.5 start 0.95 * math.sqrt(luminosity) end 1.37 * math.sqrt(luminosity) return [round(start, 2), round(end, 2)]要点拆解import math引入平方根函数若希望不依赖math模块也可用luminosity ** 0.5等价实现。round(value, 2)执行四舍五入并保留两位小数这正是文档Return the distances rounded to two decimal places的要求。返回值是[start, end]形式的列表list而非元组——测试断言要求assertEqual(goldilocks_zone(1), [0.95, 1.37])元组(0.95, 1.37)与列表在assertEqual中并不相等因此必须返回列表。一个不需要math模块的紧凑等价写法def goldilocks_zone(mass): zone mass ** 1.75 return [round(0.95 * zone, 2), round(1.37 * zone, 2)]挑战在课程体系中的定义与类型机制从源码层面看该挑战文件头部 frontmatter 的三个字段决定了它在 freeCodeCamp 课程管道中的身份id: 68c1a929005bf54d342aa8d6 title: Challenge 59: Space Week Day 5: Goldilocks Zone challengeType: 29 dashedName: challenge-59challengeType: 29即dailyChallengePy。在 packages/shared/src/config/challenge-types.ts 中定义同时配套viewTypes[29] classic挑战使用经典classic单文件编辑器视图submitTypes[29] tests提交方式为运行内置测试getIsDailyCodingChallenge(29)返回true用于前端识别每日编程挑战这一特殊品类getDailyCodingChallengeLanguage(29)返回python告知系统该挑战以 Python 作答。dashedName与challengeOrder中的 id 一一对应是路由与排序的依据。模块配置 daily-coding-challenges-python.json 还声明了isUpcomingChange: true属于即将上线的新内容、usesMultifileEditor: true多文件编辑器、helpCategory: Python与blockLayout: legacy-challenge-list旧式列表布局。每日挑战模块存在严格的双语JS/Python对称性。测试文件 curriculum/src/test/daily-challenges.test.js 会从dev-playgroundsuperblock 同时拉取daily-coding-challenges-javascript与daily-coding-challenges-python两个模块的挑战断言两侧挑战数量相等、每个 id 一一对应、标题与描述完全一致、测试条数相同。这意味着本题存在一份同 id 的 JavaScript 姊妹版本两边的描述与测试始终保持同步。评测如何执行Pyodide 与 Web Worker本题的--hints--使用runPython(...)在浏览器端执行 Python 断言。从客户端实现看Python 代码并非在服务端运行而是通过 Web Worker 内嵌的Pyodide浏览器中的 Python 运行时执行client/src/templates/Challenges/utils/python-worker-handler.ts 声明了 worker 脚本路径/js/workers/${browserScripts.version}/python-worker.js并缓存唯一的Worker实例runPythonCode向 worker 发送{ type: run, code }消息若代码运行超时无法中断worker 会被terminate()后重建见interruptCodeExecution随后重发最后一次代码消息保证学习者在代码执行中再次编辑时也能得到正确反馈。因此在浏览器中你的goldilocks_zone函数会被注入测试代码后实际运行from unittest import TestCase与assertEqual的执行结果直接决定挑战是否通过。每日挑战的发布机制从课程文件到数据库理解这道题的文件如何变成用户每天刷到的挑战可以看 tools/daily-challenges/seed-daily-challenges.ts 与 tools/daily-challenges/helpers.ts先运行前端客户端Gatsby使其通过 GraphQL 暴露课程数据种子脚本向http://localhost:8000/___graphql发起查询按superBlock: dev-playground与block: daily-coding-challenges-{language}过滤拉取 JS 与 Python 两侧挑战的id/title/description/tests/challengeFiles见fetchChallengescombineChallenges会校验两侧标题、描述、测试条数完全一致然后把挑战合并为一条记录写入 MongoDB 的DailyCodingChallenges集合每条记录带有challengeNumber与自2025-08-11起逐日递增的date字段这正是每日一题的排期来源脚本同时用EXPECTED_CHALLENGE_COUNT 365校验全年挑战总数。换言之68c1a929005bf54d342aa8d6.md这类课程 Markdown 是内容源而种子脚本负责把它与 JS 版本合并、编号、定档最终投放到生产数据库中供用户每日作答。实战建议与易错点总结返回值类型务必返回[start, end]列表元组会导致assertEqual失败。舍入精度先计算完整浮点结果最后统一round(x, 2)不要在中途截断否则大质量用例如mass 20可能在末位偏差。浮点与等价变换math.sqrt(mass ** 3.5)与mass ** 1.75数值上等价但要注意大质量时mass ** 3.5中间值较大如20 ** 3.5 ≈ 3.6e4Python 浮点完全可容纳无需担心溢出。命名约定函数名必须严格为goldilocks_zone与测试中runPython注入的调用名一致。本地验证可直接用 Python REPL 按测试用例表逐条核对输出或仿照 hints 中的unittest写法快速自测from unittest import TestCase TestCase().assertEqual(goldilocks_zone(1), [0.95, 1.37]) TestCase().assertEqual(goldilocks_zone(0.5), [0.28, 0.41]) TestCase().assertEqual(goldilocks_zone(6), [21.85, 31.51]) TestCase().assertEqual(goldilocks_zone(3.7), [9.38, 13.52]) TestCase().assertEqual(goldilocks_zone(20), [179.69, 259.13])通过全部 5 组断言即视为完成 Challenge 59。这个挑战虽小却串联了指数运算、平方根、浮点舍入、列表返回与单元测试断言等 Python 基础能力同时向学习者传递了天文学中质量决定光度、光度决定宜居带的物理直觉——是科学与编程结合的良好练习样本。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考