ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

freeCodeCamp 每日编程挑战 360:Spoken Duration——把秒数翻译成口语化英语时长

freeCodeCamp 每日编程挑战 360:Spoken Duration——把秒数翻译成口语化英语时长 freeCodeCamp 每日编程挑战 360Spoken Duration——把秒数翻译成口语化英语时长【免费下载链接】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 Challenges系列中的 Challenge 360 Spoken Duration 为核心完整讲解这道题的原始需求、全部测试断言与参考解法如何把一个纯数字的秒数按小时/分钟/秒拆解后组合成符合英语口语习惯的时长表达如1 hour, 2 minutes and 3 seconds并结合同仓库中挑战类型定义与 block 配置文件说明这道题在 freeCodeCamp 课程体系中的实际落地机制。读完后你可以独立完成这类数值拆解 单复数 英文连接词的字符串组装问题并理解 freeCodeCamp 挑战文件的 frontmatter、hints、seed 与 solutions 各段落的结构约定。题目背景每日编程挑战中的 Challenge 360该题定义在 6a26df3e2988bcdded204896.md属于daily-coding-challenges-javascript板块JavaScript 版每日挑战。在 block 结构文件 daily-coding-challenges-javascript.json 中可以看到它的登记条目{ id: 6a26df3e2988bcdded204896, title: Challenge 360: Spoken Duration }它位于 Challenge 358 Emoji Translator 与 Challenge 361 Spoken Time 之间后者是它的姊妹题处理的是带 AM/PM 的钟表时间。该 block 的顶部配置还声明了若干运行特性直接影响做题体验{ isUpcomingChange: true, dashedName: daily-coding-challenges-javascript, usesMultifileEditor: true, helpCategory: JavaScript, disableLoopProtectTests: true, blockLayout: legacy-challenge-list, ... }其中disableLoopProtectTests: true可以理解为关闭了防死循环保护的测试包装意味着解法中如果出现无限循环不会被特殊熔断逻辑提前截断usesMultifileEditor: true表示该系列题使用多文件编辑器界面。挑战类型 28 意味着什么题目 frontmatter 中的challengeType: 28是理解运行方式的关键。在 challenge-types.ts 中类型常量的定义确认了 28 即dailyChallengeJsconst dailyChallengeJs 28; const dailyChallengePy 29;同文件还给出了这类挑战的两条行为映射// determine the component view for each challenge export const viewTypes { ... [dailyChallengeJs]: classic, ... }; // determine the type of submit function to use on challenge completion export const submitTypes { ... [dailyChallengeJs]: tests, ... };也就是说这道题在前端以classic经典代码编辑器视图呈现提交时走tests提交流程——把用户代码与内置断言一起执行。这也解释了为什么题目文件中的每条提示都是一个assert.equal(...)断言它们就是判题依据本身。该文件还提供了getIsDailyCodingChallenge、getDailyCodingChallengeLanguage等辅助函数用于在站点层面区分每日挑战并映射语言dailyChallengeJs→javascript。题目要求完整继承原题给出的完整需求如下Given a number of seconds, return the duration in spoken English.Break the duration into hours, minutes, and seconds.Skip any zero values.Use singular or plural as appropriate (1 hour,2 hours).If present, join the last two units withand, and the second and third to last units with a comma (1 hour, 2 minutes and 3 seconds).逐条翻译为可验证的约束拆解输入秒数必须拆成小时、分钟、秒三个单位1 小时 3600 秒1 分钟 60 秒。跳过零值某个单位的计数为 0 时不输出该单位而不是输出0 minutes之类。单复数计数为 1 时用单数hour/minute/second否则用复数hours/minutes/seconds。英文连接词当存在多个单位时最后两个单位之间用 and 连接倒数第三与倒数第二单位之间用逗号, 分隔。即三单位时形如A hours, B minutes and C seconds两单位时形如A hours and B seconds。官方断言用例题目--hints--段落给出了 7 条官方断言覆盖了全部关键分支含三单位、两单位、单单位、跨小时跳过分钟、单数形式输入期望输出考察点37231 hour, 2 minutes and 3 seconds三单位全齐 小时取单数72952 hours, 1 minute and 35 seconds三单位 分钟取单数85212 hours, 22 minutes and 1 second三单位 秒取单数4357 minutes and 15 seconds小时为 0 被跳过144554 hours and 55 seconds分钟为 0 被跳过7200020 hours仅剩单单位无连接词11 second最小输入 单数以文档原样保留的断言形式assert.equal(getSpokenDuration(3723), 1 hour, 2 minutes and 3 seconds); assert.equal(getSpokenDuration(7295), 2 hours, 1 minute and 35 seconds); assert.equal(getSpokenDuration(8521), 2 hours, 22 minutes and 1 second); assert.equal(getSpokenDuration(435), 7 minutes and 15 seconds); assert.equal(getSpokenDuration(14455), 4 hours and 55 seconds); assert.equal(getSpokenDuration(72000), 20 hours); assert.equal(getSpokenDuration(1), 1 second);初始代码seed做题时编辑器中给出的骨架--seed-contents--段落function getSpokenDuration(seconds) { return seconds; }初始实现只是原样返回入参需要完全改写。注意入参名为seconds与输出单位seconds同名改写时用局部变量名如secs避免混淆。参考解法逐行解析--solutions--段落给出的官方参考解function getSpokenDuration(seconds) { const hours Math.floor(seconds / 3600); const minutes Math.floor((seconds % 3600) / 60); const secs seconds % 60; const parts []; if (hours) parts.push(${hours} ${hours 1 ? hour : hours}); if (minutes) parts.push(${minutes} ${minutes 1 ? minute : minutes}); if (secs) parts.push(${secs} ${secs 1 ? second : seconds}); if (parts.length 1) return parts[0]; if (parts.length 2) return ${parts[0]} and ${parts[1]}; return ${parts[0]}, ${parts[1]} and ${parts[2]}; }可以拆成三个阶段理解阶段一借位拆解。hours Math.floor(seconds / 3600)整除得到小时数minutes Math.floor((seconds % 3600) / 60)先取余去掉整小时再整除 60 得到分钟数——注意必须用seconds % 3600而不是seconds / 3600 % 60前者直接隔离出小时内的秒数secs seconds % 60最终余数即零头秒。三个变量相加恒等于输入秒数hours * 3600 minutes * 60 secs seconds这是后续手工验证用例的基础。阶段二按需收集非零片段。parts数组只推入非零单位每条推入的字符串内联完成了单复数判断hours 1 ? hour : hours三处同理。if (hours)/if (minutes)/if (secs)的 truthy 判断天然实现了跳过零值——0 是 falsy对应单位不会进入parts。阶段三按长度拼接连接词。拼接策略完全由parts.length决定与题目第 4 条约束一一对应length 1直接返回唯一片段没有任何连接词对应20 hours、1 secondlength 2A and B对应4 hours and 55 seconds、7 minutes and 15 seconds;length 3A, B and C对应前三个三单位用例。用例手工验证用阶段一的恒等式逐条核对官方断言输入hours / minutes / secsparts 内容拼接分支结果37231 / 2 / 3[1 hour, 2 minutes, 3 seconds]3 段1 hour, 2 minutes and 3 seconds✓72952 / 1 / 35[2 hours, 1 minute, 35 seconds]3 段2 hours, 1 minute and 35 seconds✓85212 / 22 / 1[2 hours, 22 minutes, 1 second]3 段2 hours, 22 minutes and 1 second✓4350 / 7 / 15[7 minutes, 15 seconds]2 段7 minutes and 15 seconds✓144554 / 0 / 55[4 hours, 55 seconds]2 段4 hours and 55 seconds✓7200020 / 0 / 0[20 hours]1 段20 hours✓10 / 0 / 1[1 second]1 段1 second✓7 条官方断言全部命中。从源码结构看解法没有对输入0做防御此时parts为空、parts.length走最后的 3 段分支会拼出undefined但官方断言集未覆盖该输入做题时无需处理若在自己的项目中复用此逻辑建议显式约定0的返回值。可迁移的写法要点先收集、后拼接是处理不定长枚举输出的稳妥模式把每个候选单位作为独立片段推入数组最后只按数组长度选择连接模板避免了在拆解阶段就预测这是几个单位的分支混乱truthy 过滤 模板字符串内联三元让跳过零值与单复数两条规则在同一个表达式里完成无需额外状态单复数判断必须发生在片段构造时因为拼接阶段拿到的已是成品字符串无法再追溯数量。这道题在 freeCodeCamp 课程系统中的位置结合仓库内的实现证据可以确认该题的完整落地链路内容层题目正文以 freeCodeCamp 的 challenge Markdown 格式书写--description--题目、--hints--断言提示、--seed--/--seed-contents--初始代码、--solutions--参考解各段落语义固定frontmatter 中的id、title、dashedNamechallenge-360用于站点路由与锚点。结构层daily-coding-challenges-javascript.json 的challengeOrder数组按 id 注册题目顺序决定 360 在挑战列表中的位置。运行层challengeType: 28经 challenge-types.ts 映射为classic视图与tests提交类型用户提交后代码与--hints--中的断言一同执行判定。该系列中编号相邻的 Challenge 361: Spoken Time 处理的是 12 小时制钟面时间与本題的时长口语化形成对照适合作为延伸练习。小结Challenge 360 用一个短小的函数题集中考察了四件事整除取余的时间拆解、零值过滤、英文单复数分支、以及不定长元素的连接词拼装。官方参考解的核心模式——拆解为hours/minutes/secs→ truthy 过滤进parts数组 → 按parts.length三档拼接——可以直接迁移到任何把结构化数值渲染成口语/文案的场景。题目原文、全部断言与参考解均可在 6a26df3e2988bcdded204896.md 中核对。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表