freeCodeCamp Daily Coding Challenge 315Summer Solstice题解用 JavaScript 根据纬度计算昼夜时长【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南围绕 freeCodeCamp 开源仓库中每日编码挑战Daily Coding Challenge第 315 题「Summer Solstice夏至」展开完整还原题目要求、输出约定、全部测试断言与官方参考解法并逐行拆解公式推导与边界处理。读完本文你将掌握基于纬度计算昼长、将小时数四舍五入到偶数、以 24 字符串对称排布昼夜符号这类模拟/数学类题目的完整解题范式同时了解该挑战在 freeCodeCamp 每日挑战体系challengeType 28中的真实运行机制。一、挑战背景与题目定位这道题位于curriculum/challenges/english/blocks/daily-coding-challenges-javascript/6a15cadf5f240d05a2649559.md是 JavaScript 每日编码挑战块block中的第 315 道标题为 Challenge 315: Summer Solstice其challengeType: 28表示这是一个每日编码挑战类型的题目。题目的现实背景是夏至是北半球一年中白昼最长的一天南半球则是最短的一天。本题要求写一个函数getDaytimeHours(latitude)给定一个纬度值返回一个 24 字符的字符串用符号直观地展示该纬度在夏至当天的昼夜分布。二、题目要求与输出格式原题--description--部分给出的完整规范如下输入纬度取值范围为90北极到 -90南极闭区间白天小时数的计算公式为白天小时数 12 (latitude / 90) * 12将计算出的白天小时数四舍五入到最近的偶数返回一个 24 字符的字符串其中☀️代表白天的小时代表夜晚的小时且每个字符代表一个小时从午夜第 0 小时开始日出与日落围绕正午对称。原题给出的示例纬度为0赤道时白昼为 12 小时日出 6:00 AM、日落 6:00 PM返回值应为☀️☀️☀️☀️☀️☀️☀️☀️☀️☀️☀️☀️三、数学建模从纬度到昼夜字符串解题的第一步是把自然语言描述转成可计算的数学模型。3.1 昼长公式按题目公式给定纬度latitude理论昼长小时为daylight 12 (latitude / 90) * 12验证两个极端latitude 90北极daylight 12 12 24即极昼全天 24 小时都是白天latitude -90南极daylight 12 - 12 0即极夜全天 24 小时都是夜晚。3.2 四舍五入到最近偶数题目要求将昼长取整到最近的偶数。例如-33度时daylight 12 (-33 / 90) * 12 12 - 4.4 7.67.6 到最近的偶数是 8距离 7.6 更近的偶数是 8因为 6 与 7.6 的差为 1.6而 8 与 7.6 的差为 0.4。因此得到 8 小时白昼。官方参考解法中使用的小技巧是先除以 2 再四舍五入最后乘回 2const daylightHours Math.round((12 (latitude / 90) * 12) / 2) * 2;Math.round(x / 2) * 2是四舍五入到最近偶数的标准实现任何数除以 2 后四舍五入为整数再乘 2结果必为偶数且是最接近原值的那个偶数。3.3 日出/日落对称排布由于日出与日落围绕正午第 12 小时对称可得sunrise 12 - daylightHours / 2 sunset 12 daylightHours / 2以赤道latitude 0为例daylightHours 12则sunrise 6、sunset 18与题目示例完全一致。四、官方参考解法逐行解析原文档--solutions--部分给出的参考实现如下function getDaytimeHours(latitude) { const daylightHours Math.round((12 (latitude / 90) * 12) / 2) * 2; const sunrise 12 - daylightHours / 2; const sunset 12 daylightHours / 2; let result ; for (let hour 0; hour 24; hour) { result hour sunrise hour sunset ? ☀️ : ; } return result; }逐行拆解第 2 行按公式计算昼长并四舍五入到最近偶数得到daylightHours必为 024 之间的偶数第 34 行由对称性计算日出小时与日落小时第 69 行遍历 023 共 24 个小时凡是落在[sunrise, sunset)区间含日出、不含日落的记为白天☀️其余记为夜晚第 11 行返回 24 字符的结果串。注意边界语义hour sunset采用左闭右开区间确保昼长恰好等于daylightHours个白天符号。当daylightHours 24时sunrise 0、sunset 2424 个小时全部为☀️当daylightHours 0时sunrise sunset 12没有任何小时满足hour 12 hour 1224 个小时全部为。五、全部测试断言验证原文档--hints--部分共给出 7 组断言逐一演算验证如下纬度理论昼长取偶后昼长日出日落结果形态是否符合断言012126186 夜 12 昼 6 夜✅90242402424 昼极昼✅-9000121224 夜极夜✅-337.688168 夜 8 昼 8 夜✅66.520.867202222 夜 20 昼 2 夜✅4017.333183213 夜 18 昼 3 夜✅-505.33369159 夜 6 昼 9 夜✅其中getDaytimeHours(66.5)是一个很好的取整示例理论昼长约 20.87 小时除以 2 得约 10.43Math.round(10.43) 10乘 2 得 20验证了四舍五入到最近偶数的行为20.87 更接近 20 而非 22。六、种子代码与开发入口挑战的--seed--部分提供了初始脚手架学习者需要在此基础上补齐逻辑function getDaytimeHours(latitude) { return latitude; }初始代码直接返回纬度值显然无法通过任何断言。正确的思路是严格遵循第三节的数学模型计算昼长 → 取偶 → 求日出日落 → 按小时拼接符号。注意不要改动函数名getDaytimeHours与参数名latitude因为测试断言assert.equal直接以该函数名为调用入口。七、该挑战在 freeCodeCamp 每日挑战体系中的位置7.1 block 结构配置本题位于块配置文件 curriculum/structure/blocks/daily-coding-challenges-javascript.json 中编号为 315challengeOrder第 315 项id 为6a15cadf5f240d05a2649559紧随其后的第 316 题是 1337 Speak。整个 block 共 365 道题对应一年中的每一天块配置中usesMultifileEditor: true、helpCategory: JavaScript说明该系列以 JavaScript 为求解语言并在多功能编辑器中作答。7.2 前端如何消费 challengeType 28在 client/src/client-only-routes/show-daily-coding-challenge.tsx 中可以看到前端在组织每日挑战数据时显式使用challengeType: 28对应类型定义 client/src/redux/prop-types.ts 中的challengeType: 28 | 29。也就是说这类题目的渲染与提交走的是独立的每日编码挑战通道而非普通的课程挑战。7.3 每日挑战的种子机制365 道挑战并非手工录入数据库而是通过脚本批量生成的。在 tools/daily-challenges/seed-daily-challenges.ts 中从 Dev Playground superblock 通过 GraphQL 拉取 JavaScript 与 Python 两套挑战校验数量必须为EXPECTED_CHALLENGE_COUNT 365且 JS/Python 两套数量一致以2025-08-11为起始日期每道挑战向后顺延一天START_DATE i * ONE_DAY_IN_MS写入 MongoDB 的DailyCodingChallenges集合。具体的运行流程记录在 tools/daily-challenges/README.md 中复制sample.env为.env、确保依赖已安装、以显示 upcoming changes模式启动主客户端以便脚本通过 GraphQL 获取挑战然后在tools/daily-challenges目录下执行pnpm seed-daily-challenges完成入库。7.4 后端 API 路由挑战内容由 api/src/daily-coding-challenge/routes/daily-coding-challenge.ts 对外提供包括GET /daily-coding-challenge/date/:date按YYYY-MM-DD日期取当日挑战不会返回晚于美国中部时间今天的挑战GET /daily-coding-challenge/day/:day按MM-DD如09-30取挑战闰日02-29会被特殊处理GET /daily-coding-challenge/today、GET /daily-coding-challenge/month/:month、GET /daily-coding-challenge/all、GET /daily-coding-challenge/newest等。日期边界逻辑美国中部时区、UTC 午夜换算实现在该目录的utils/helpers.ts中前端日历组件则位于 client/src/components/daily-coding-challenge/calendar.tsx。7.5 JS/Python 双语言一致性校验仓库还提供了专门的测试 curriculum/src/test/daily-challenges.test.js用于保证每日挑战的 JavaScript 与 Python 两个版本数量相等、id 一一对应、标题与描述一致、测试断言数量一致。这道 Summer Solstice 题同样遵循该约定说明此类题目在两种语言下共享同一套题目语义与判题断言。八、总结与举一反三Challenge 315 表面上是一道天文计算题内核其实是三个通用技能的叠加公式化建模把自然语言夏至昼最长围绕正午对称翻译成确定的数学表达式取整技巧Math.round(x / 2) * 2是实现四舍五入到最近偶数的简洁写法可迁移到任何需要偶数取整的场景区间遍历与符号拼接用左闭右开区间[sunrise, sunset)精确控制 24 个字符中白天符号的个数天然规避了多一个少一个的边界错误。掌握这三点后同类问题如按月份绘制昼夜图、按时区计算日出日落表、甚至前文提到的 Challenge 133 Daylight Hours 与 Challenge 222 Equinox Shadows 等天文主题兄弟题都可以套用相同的分析路径快速求解。关键源码索引挑战原文档curriculum/challenges/english/blocks/daily-coding-challenges-javascript/6a15cadf5f240d05a2649559.mdblock 配置curriculum/structure/blocks/daily-coding-challenges-javascript.json每日挑战种子脚本tools/daily-challenges/seed-daily-challenges.ts每日挑战 API 路由api/src/daily-coding-challenge/routes/daily-coding-challenge.ts前端展示组件client/src/client-only-routes/show-daily-coding-challenge.tsxJS/Python 一致性测试curriculum/src/test/daily-challenges.test.js【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站