
freeCodeCamp 每日编程挑战 29 Acronym Builder 详解用停用词表生成英文缩略词的 JavaScript 实战【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇围绕 freeCodeCamp 课程仓库中的每日编程挑战 29Acronym Builder缩写构建器展开完整继承原题的四条约束规则、全部官方测试用例与参考解答并结合仓库中的挑战类型定义、结构文件与课程 schema讲清这道题的规则边界、易错点和它在 freeCodeCamp 课程体系中的加载方式。读完后你能独立写出通过全部测试的buildAcronym实现并理解这类每日挑战在仓库中的组织形态。题目在仓库中的位置与身份本题源文件位于 68adce01c0e1144d0a90295e.mdfront matter 中的关键字段为字段取值含义id68adce01c0e1144d0a90295e挑战的唯一 ObjectID与文件名一致titleChallenge 29: Acronym Builder标题challengeType28挑战类型对应 JavaScript 每日挑战dashedNamechallenge-29用于 URL 路由的 slugchallengeType: 28的具体语义可在 challenge-types.ts 中确认常量dailyChallengeJs 28Python 版为 29。该文件同时给出三个映射关系决定了这道题在前端的呈现与提交行为viewTypes[dailyChallengeJs] classic使用经典编辑器视图submitTypes[dailyChallengeJs] tests通过运行断言测试来判定完成getDailyCodingChallengeLanguage(28)返回javascript并由getIsDailyCodingChallenge(28)识别为每日挑战。在课程结构文件中该挑战登记于 daily-coding-challenges-javascript.json 的challengeOrder数组顺序为 Challenge 28Roman Numeral Parser→Challenge 29: Acronym Builder→ Challenge 30Unique Characters。该 block 还配置了usesMultifileEditor: true、helpCategory: JavaScript、blockLayout: legacy-challenge-list与disableLoopProtectTests: true测试执行时禁用死循环保护避免保护机制干扰判定。完整题目规格原题# --description--部分的完整要求如下给定一个包含一个或多个单词的字符串返回这些单词的缩略词acronym需满足缩略词由每个单词的首字母大写组成除非另有说明以下单词的首字母应被忽略除非它们是该字符串的第一个单词a、for、an、and、by、of缩略词字母按单词出现的顺序返回缩略词中不包含任何空格。编辑器中的初始种子代码## --seed-contents--部分为function buildAcronym(str) { return str; }题目本质是按顺序提取每个单词首字母 按停用词表过滤 首单词豁免三步组合考察字符串拆分、数组遍历、条件判断与大小写处理。官方测试用例全解原题# --hints--部分给出了 7 组断言是判定答案正确性的完整依据assert.equal(buildAcronym(Search Engine Optimization), SEO); assert.equal(buildAcronym(Frequently Asked Questions), FAQ); assert.equal(buildAcronym(National Aeronautics and Space Administration), NASA); assert.equal(buildAcronym(Federal Bureau of Investigation), FBI); assert.equal(buildAcronym(Light Amplification by Stimulated Emission of Radiation), LASER); assert.equal(buildAcronym(By the way), BTW); assert.equal(buildAcronym(An unstoppable herd of waddling penguins overtakes the icy mountains and sings happily), AUHWPOTIMSH);这组用例覆盖了规则的全部关键分支纯大写缩写SEO、FAQ验证最基本的逐词取首字母能力and/of/by被过滤NASA、FBI、LASERNational Aeronautics **and** Space Administration得到NASAFederal Bureau **of** Investigation得到FBILight Amplification **by** Stimulated Emission **of** Radiation得到LASER首单词豁免BTWBy the way中by本身在停用词表里但因为它位于首位按首个单词规则保留B结果BTW长句综合用例AUHWPOTIMSH12 个单词中of、and被过滤同时包含一个隐蔽陷阱见下文逐例推演。需要注意原文件中的一处笔误第 5 组 hint 的文字描述写的是buildAcronym(For your information)应返回FYI但其下方的断言代码实际测试的是 LASER 字符串。两个描述各自在其规则下都是自洽的For your information中For为首单词保留F得FYILASER 用例则同时命中by和of两个停用词。参考解答逐行拆解原题# --solutions--部分给出的参考答案function buildAcronym(str) { const smallWords [a, for, an, and, by, of]; const words str.split( ); let acronym ; for (let i 0; i words.length; i) { const word words[i]; const lowerWord word.toLowerCase(); if (i 0 || !smallWords.includes(lowerWord)) { acronym word[0].toUpperCase(); } } return acronym; }各部分的作用smallWords停用词表与题目描述中的六个单词一一对应全部为小写形式str.split( )按单个空格切分。题目输入保证单词间为单空格分隔因此切分后words[i]即第i个单词i 0首单词豁免循环索引为 0 时无条件取首字母这正是By the way → BTW与For your information → FYI两个用例的通过依据lowerWord word.toLowerCase()过滤前统一转小写再与smallWords比较保证And、OF等大小写变体同样能被识别为停用词word[0].toUpperCase()只取原单词保留原始大小写的首字母并转大写累加到acronym天然满足不含空格与保持顺序两条约束。判定条件的逻辑是首单词或非停用词i 0为真时短路跳过停用词检查否则要求lowerWord不在smallWords中才取字母。用长句用例做逐例推演以最复杂的AUHWPOTIMSH用例逐词验证An unstoppable herd of waddling penguins overtakes the icy mountains and sings happily单词处理结果An首单词豁免停用词检查Aunstoppable非停用词Uherd非停用词Hof停用词且非首单词跳过waddling非停用词Wpenguins非停用词Povertakes非停用词Othe不在停用词表中Ticy非停用词Imountains非停用词Mand停用词且非首单词跳过sings非停用词Shappily非停用词H拼接得到AUHWPOTIMSH。这里的易错点是the直觉上the是常见虚词但它不在题目规定的六个停用词a、for、an、and、by、of之中所以其首字母T必须保留。自行扩充停用词表反而会在此用例上失败——过滤范围必须严格等于题目规定不能凭语感增减。这道题在 freeCodeCamp 课程中的运行机制从仓库源码结构看这道挑战的 Markdown 文件采用 freeCodeCamp 统一的分区约定# --description--题干、# --hints--断言提示、## --seed-contents--编辑器种子代码、# --solutions--参考解答challenge-parser 的测试夹具 完整展示了这套分区格式解析后生成结构化挑战对象。生成的对象随后要通过 challenge-schema.js 的 Joi 校验title与description为必填字符串tests为必填数组每项含text与testStringchallengeType限定 0–33 的整数——本题的 7 条assert.equal提示即会进入tests数组作为submitTypes为tests时的完成判定依据。此外block 级配置的disableLoopProtectTests: true表明该 block 的测试执行会关闭循环保护而 daily-coding-challenge-validator.ts 则校验数据库中每日挑战记录的结构tests数组、challengeFiles数组及可选的disableLoopProtectTests与上述配置呼应。实现要点与常见陷阱综合题目规则与测试用例自写实现时需注意过滤必须大小写不敏感word.toLowerCase()后再比对否则句中的And、Of会漏过滤首单词无条件保留i 0的豁免优先于停用词判断两个条件用或连接且短路顺序保证首单词不做也不需要停用词检查停用词表严格限定为六个a、for、an、and、by、of多一个如the都会破坏AUHWPOTIMSH用例按单个空格切分与官方解答保持一致即可满足全部给定用例若输入可能出现多空格split( )会产生空串并导致word[0]为undefined但题目保证一个或多个单词的标准输入格式输出无空格且保持顺序用字符串累加器按序拼接即天然满足无需额外排序或去空格处理。小结Acronym Builder 是 freeCodeCamp JavaScript 每日挑战 block 中的第 29 题文件为 68adce01c0e1144d0a90295e.md。它以停用词过滤 首单词豁免为核心考察点先用split( )拆分单词再对每个单词做小写化的停用词比对索引为 0 时直接取首字母最后将各首字母大写后按序拼接。仓库中challengeType: 28在 challenge-types.ts 中被定义为dailyChallengeJs走经典编辑器视图与断言测试判定流程block 结构文件 daily-coding-challenges-javascript.json 则规定了它的前后题序与disableLoopProtectTests等执行配置。掌握这套规则后7 组官方断言可以直接作为本地验证的回归用例集。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考