拓冰建站拓冰建站
首页 / 资讯中心 / 正文

freeCodeCamp Python 每日编程挑战精讲:Challenge 1「Vowel Balance」元音平衡问题

freeCodeCamp Python 每日编程挑战精讲Challenge 1「Vowel Balance」元音平衡问题【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇以 freeCodeCamp 课程库中的 Python 每日编程挑战第一题「Vowel Balance元音平衡」为主体完整解析其题目规则、7 组官方测试用例、种子代码与参考解法并结合仓库源码说明该挑战在 challengeType 体系中的定位dailyChallengePy 29以及runPython测试与 Web Worker 执行链路的底层原理。读完后你既能独立完成这道题也能理解这类题目在 freeCodeCamp 前端是如何被构建、运行与判分的。一、挑战的出处与在课程体系中的定位该题的源文件是 Vowel Balance 挑战位于课程区块daily-coding-challenges-python之下。区块结构定义在 daily-coding-challenges-python.json 中关键配置如下dashedName:daily-coding-challenges-python即区块的 URL 标识usesMultifileEditor:true使用多文件编辑器布局helpCategory:Python帮助分类归入 PythonblockLayout:legacy-challenge-list以传统挑战列表形式呈现challengeOrder数组的第一项正是本挑战id: 6814d8e1516e86b171929de4title: Challenge 1: Vowel Balance其后依次是 Challenge 2: Base Check、Challenge 3: Fibonacci Sequence 等数百道按编号排列的题目。从挑战文件的 front matter 可以看到它被标记为challengeType: 29。这一编号的定义在 challenge-types.ts 中const dailyChallengeJs 28; const dailyChallengePy 29; // 即本挑战的类型challengeType 29决定了三个行为见 challenge-types.ts维度取值含义viewTypes[29]classic复用经典代码编辑器界面左侧编辑器 右侧控制台submitTypes[29]tests通过「运行测试」按钮判分而非提交项目 URLgetDailyCodingChallengeLanguage(29)python代码本地缓存等逻辑以语言后缀区分 JS/Python 挑战其中getIsDailyCodingChallengechallenge-types.ts#L182-L188通过判断类型是否为28或29来识别「每日编程挑战」前端多处如 completion-epic.js、code-storage-epic.js据此走差异化分支。二、题目原文与规则拆解原题描述引自 挑战源文件Given a string, determine whether the number of vowels in the first half of the string is equal to the number of vowels in the second half.即给定一个字符串判断其前半部分的元音字母数量是否等于后半部分的元音字母数量。规则要点字符串可以包含任意字符数字、符号、空格均可元音定义为a、e、i、o、u这五个字母大小写均计入即AEIOU与aeiou等价若字符串长度为奇数忽略正中间的字符。设字符串长度为n则前半部分取前n // 2个字符后半部分取后n // 2个字符奇数长度时中间那个字符自然被落在两个切片之外从而被「忽略」。三、官方测试用例全集与逐例验证源文件的# --hints--段落共给出 7 组测试。这些测试以 JavaScript 包裹的形式定义每条 hint 的展示文本如 is_balanced(racecar)should returnTrue.下方附带一个通过runPython在 Python 测试环境中执行的断言({test: () { runPython( from unittest import TestCase TestCase().assertIs(is_balanced(racecar), True)) }})这里用unittest.TestCase().assertIs做同一性断言——要求返回值必须是布尔单例True/False本身而不是任意真值/假值例如返回1或yes都会失败因此解法必须显式返回布尔结果。完整用例如下表并对每一例给出按规则的切分推演half n // 2输入长度 nhalf前半部分元音数后半部分元音数期望racecar73raca1cara1TrueLorem Ipsum115Lore o,e2IpsumI,u2TrueKitty Ipsum115Kittyi1IpsumI,u2Falsestring63str0ingi1False 100见下方边界说明0Trueabcdefghijklmnopqrstuvwxyz2613a..ma,e,i3n..zo,u2False123A#b!E*456-o.U178123A#b!EA,E2*456-o.Uo,U2True这 7 组用例覆盖了奇数/偶数长度、含空格、纯字母、全字母表验证大小写元音只算a,e,i,o,u五个、以及数字与特殊符号混排验证非字母字符一律不计。其中racecar特意让元音e落在被忽略的中心位置检验「奇数长度忽略中点」规则123A#b!E*456-o.U则检验大写元音A、E、U的计数。四、种子代码与参考解法编辑器的初始种子代码# --seed--段是一个故意不实现的函数体等待学习者填充def is_balanced(s): return s仓库给出的参考解法# --solutions--段def is_balanced(s): vowels set(aeiouAEIOU) n len(s) half n // 2 first_half s[:half] second_half s[-half:] def count_vowels(sub): return sum(1 for char in sub if char in vowels) return count_vowels(first_half) count_vowels(second_half)逐行解析vowels set(aeiouAEIOU)用集合而非字符串存放 10 个大小写元音char in vowels的成员检测是 O(1) 的哈希查找相比s.lower()后只存小写这里省去了对每个字符做大小写转换的开销。half n // 2整数除法取半天然实现「奇数长度丢弃中间字符」。s[:half]与s[-half:]正负下标切片分别取前、后half个字符两段互不重叠中点字符恰好不被包含。count_vowels内部函数生成器表达式sum(1 for char in sub if char in vowels)逐字符计数是 Python 中最惯用的单趟计数写法。返回值两侧计数比较后返回布尔值满足assertIs对True/False单例的要求。边界行为补充说明两个值得注意的 Python 切片细节从参考解法的行为可以推断空字符串n 0half 0s[:0]与s[-0:]中前者为空串s[-0:]等价于s[0:]即整串仍为空串两侧元音数均为 0返回True符合直觉。长度为 1 的字符串half 0时s[-0:]等价于s[0:]会取到整个字符串而非空串。若输入是单个元音如a此实现会返回False而按「忽略中点字符」的字面规则两侧都应为 0。现有 7 组测试用例均未覆盖这一极端输入因此它不属于本题的判分范围但若自行扩展测试建议显式处理half 0的情况例如second_half s[-half:] if half else 。另一种等价写法利用元音判断的对称性也可以先把整串归一化为小写再比较或直接用一行式表达核心逻辑def is_balanced(s): v set(aeiou) s s.lower() half len(s) // 2 return (sum(c in v for c in s[:half]) sum(c in v for c in s[-half:]))sum(c in v for c in ...)利用了bool是int的子类这一特性True被求和时记为 1注意这种写法在half 0时同样存在第 2 点所述的边界行为。五、挑战的运行与判分机制源码级视角理解这道题「在哪里跑、怎么判分」可以沿仓库中的前端执行链路看识别 Python 挑战execute-challenge-saga.js 中previewChallengeSaga检查challengeData.challengeType challengeTypes.dailyChallengePy与python、pyLab等并列源码注释明确写道// Python challenges do not use the preview frame, they use a web worker // to run the code. The UI is handled by the xterm component...即 Python 类挑战不走预览 iframe而是把构建后的代码交给 Web Worker 执行控制台输出由 xterm 终端组件渲染。代码进入 WorkerupdatePreviewSaga在用户编辑后延迟 700ms 防抖调用updatePython(challengeData)经 build.ts 中的challengeHasPreview其中包含dailyChallengePy构建出buildData最终在 execute-challenge-saga.js#L409-L421 调用runPythonCode(code)把用户代码送入 Worker 求值。测试执行点击「运行测试」时submitTypes[29]为tests框架取每条 hint 中的testString即上节那些runPython(...)片段在 Python 测试帧中逐条执行。任一assertIs失败即判为未通过全部通过方可标记挑战完成完成逻辑见 completion-epic.js 中对getDailyCodingChallengeLanguage(challengeType)的使用用于按语言维度记录完成情况。数据侧的校验每日挑战在数据库中以「一天一题、含 JS/Py 双语言版本」的形式存放客户端侧用 daily-coding-challenge-validator.ts 中的 Joi schema 校验其结构必含id、challengeNumber≥1 的整数、title、date、description以及javascript与python两个语言对象每个语言对象必含teststexttestString数组与challengeFiles。这说明挑战文件中的# --hints--测试段最终就是 schema 里的tests数组元素。六、小结与延伸阅读本题的核心考点可以归纳为三点正负下标切片s[:half]/s[-half:]配合整数除法n // 2实现「奇数长度忽略中点」集合成员检测完成 O(1) 元音判定且必须同时覆盖大小写返回严格布尔值以通过unittest.TestCase().assertIs的同一性断言。若想继续深入可以从以下仓库路径入手本题源文件Vowel Balance 挑战区块结构全部挑战顺序daily-coding-challenges-python.json挑战类型注册表challenge-types.tsPython 执行链路execute-challenge-saga.js、build.ts挑战数据结构校验daily-coding-challenge-validator.ts。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门