尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

freeCodeCamp 每日编程挑战解析:用 Python 实现密码强度分级(Challenge 54: P@ssw0rd Str3ngth!)

freeCodeCamp 每日编程挑战解析:用 Python 实现密码强度分级(Challenge 54: P@ssw0rd Str3ngth!) freeCodeCamp 每日编程挑战解析用 Python 实现密码强度分级Challenge 54: Pssw0rd Str3ngth!【免费下载链接】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-python板块的第 54 道每日编程挑战68b7cadffed0e75a517da677.md为核心完整解析密码强度分级这道题的规则设计、全部测试用例、种子代码与官方参考解法并结合仓库源码说明这类挑战从课程 Markdown 文件到数据库、再到前端评测的完整运转链路。读完本文你将掌握一套可复现的密码强度判定算法实现并理解 freeCodeCamp 每日编程挑战在开源代码库中的真实组织方式。挑战概览Challenge 54 在每日编程挑战中的位置daily-coding-challenges-python是一个位于 dev-playground superblock 下的 Python 每日编程挑战模块。在 curriculum/structure/blocks/daily-coding-challenges-python.json 中可以看到该 block 的完整元数据dashedNamedaily-coding-challenges-pythonisUpcomingChangetrue属于进行中/未正式发布的变更usesMultifileEditortruehelpCategoryPythonblockLayoutlegacy-challenge-listChallenge 54 的 frontmatter 定义在 curriculum/challenges/english/blocks/daily-coding-challenges-python/68b7cadffed0e75a517da677.md 中id: 68b7cadffed0e75a517da677 title: Challenge 54: Pssw0rd Str3ngth! challengeType: 29 dashedName: challenge-54其中challengeType: 29表明这是每日编码挑战daily coding challenge类型的题目。它的标题Pssw0rd Str3ngth!本身就是一道leet 化的密码字符串——Pssw0rd可读作 PasswordStr3ngth可读作 Strength与题目主题形成呼应。需求解析四规则与三档分级题目要求实现一个函数check_strength(password)根据密码强度返回字符串weak、medium或strong。密码按下述 4 条规则进行评估编号规则判定方式1长度至少 8 个字符len(password) 82同时包含大写与小写字母至少一个小写字母且至少一个大写字母3至少包含一个数字包含0-9中的任意字符4至少包含一个特殊字符来自集合! # $ % ^ *返回值与命中规则数量的映射关系如下命中规则数返回值少于 2 条即 0 或 1 条weak2 或 3 条medium全部 4 条strong注意两个关键细节规则 2 是复合规则必须同时存在大小写字母才算命中只有大写或只有小写都不算。这也是PASSWORD全大写被判为 weak 的原因。规则 4 的特殊字符集合是受限的并非任意标点符号都算数必须是!、、#、$、%、^、、*这 8 个字符之一。这意味着像pass!!!虽然包含!但由于它只命中特殊字符这一条规则少于 2 条依然属于 weak。测试用例逐条拆解原文档通过 9 个 hint测试断言固化了函数的预期行为全部使用 Python 标准库unittest的TestCase().assertEqual(...)通过runPython执行。逐一分析如下输入命中规则预期输出解读123456仅数字1 条weak长度不足 8、无字母、无特殊字符pass!!!仅特殊字符1 条weak长度不足 8、无大写、无数字Qwerty大小写兼有1 条weak长度不足 8、无数字、无特殊字符PASSWORD无0 条weak全大写规则 2 要求大小写同时存在故不命中PASSWORD!大写 特殊字符2 条medium命中 2 条进入 medium 档PassWord%^!大小写 特殊字符2 条medium无数字命中 2 条qwerty12345长度 数字2 条medium无大写、无特殊字符S3cur3Pssw0rd全部 4 条strong经典 leet 密码S3cur3 Pssw0rdC0d3Fun!全部 4 条strong数字0、3特殊字符、!大小写齐全长度 10这些用例覆盖了三条路径上的关键边界长度不足、仅命中单规则、命中 23 条medium 档的两种可能性、全部命中strong 档。特别是PASSWORD与PASSWORD!这一对用例精准地验证了大小写同时存在这一复合条件的实现正确性。从种子代码到参考实现种子代码起始模板原文档# --seed--部分给出的起始代码非常精简def check_strength(password): return password函数接收密码字符串后原样返回显然无法通过任何测试。你的任务就是用规则计数逻辑替换掉占位实现。官方参考解法# --solutions--部分给出的参考实现使用re模块完成字符类匹配import re def check_strength(password): rules_met 0 if len(password) 8: rules_met 1 if re.search(r[a-z], password) and re.search(r[A-Z], password): rules_met 1 if re.search(r\d, password): rules_met 1 if re.search(r[!#$%^*], password): rules_met 1 if rules_met 2: return weak elif rules_met 4: return medium else: return strong实现要点逐行解读计数器rules_met用整数累计命中的规则数这是整个算法的核心状态。规则 1长度len(password) 8字符串内建len()即可完成无需正则。规则 2大小写re.search(r[a-z], password) and re.search(r[A-Z], password)—— 注意这里是两次独立的搜索再取逻辑与。re.search只要在字符串任意位置找到匹配即返回 truthy 的 match 对象因此r[a-z]与r[A-Z]必须都命中才累计这一条规则。规则 3数字re.search(r\d, password)\d等价于[0-9]。规则 4特殊字符re.search(r[!#$%^*], password)字符类中的%、^、*等字符在方括号内按字面量处理无需转义^不在字符类首位时也是字面量。分级判定rules_met 2返回weakrules_met 4返回medium否则返回strong。这个三分支结构天然覆盖了 0/1/2/3/4 全部五种命中情况。不使用正则的替代实现如果题目环境希望避免引入re也可以完全用字符串方法实现逻辑等价SPECIALS set(!#$%^*) def check_strength(password): rules_met 0 if len(password) 8: rules_met 1 has_lower any(c.islower() for c in password) has_upper any(c.isupper() for c in password) if has_lower and has_upper: rules_met 1 if any(c.isdigit() for c in password): rules_met 1 if any(c in SPECIALS for c in password): rules_met 1 if rules_met 2: return weak elif rules_met 4: return medium else: return strong这里str.islower()/str.isupper()/str.isdigit()分别对应三条字符类规则特殊字符集合同样取自题目限定集合。两种写法在输入合法的前提下结果一致正则版更贴近官方解法字符串方法版则避免了正则符号的书写负担。每日编程挑战的完整运转链路源码级佐证Challenge 54 只是整个每日编程挑战流水线中的一个节点。从仓库源码看它的生命周期分为课程内容 → 种子脚本 → API 服务 → 前端评测四个环节。1. 课程内容与双语配对如 curriculum/structure/blocks/daily-coding-challenges-python.json 所示Python 版共有 200 道挑战Challenge 1 至 Challenge 54 之后还有大量后续题而每日挑战同时存在 JavaScript 与 Python 两个版本。在 tools/daily-challenges/helpers.ts 中fetchChallenges(language: javascript | python)通过 GraphQL 查询superBlock: dev-playground下的daily-coding-challenges-${language}block随后combineChallenges会强制校验两语言的标题、描述、测试数量完全一致不一致直接抛错if (jsTitle ! pyTitle) { throw new Error(...) } if (jsDescription ! pyDescription) { throw new Error(...) } if (jsTests.length ! pyTests.length) { throw new Error(...) }这正是每日挑战双语同步的设计保证同一道题两个语言版本必须同题同测。2. 种子脚本与数据库tools/daily-challenges/seed-daily-challenges.ts 负责把课程内容写入 MongoDB 的DailyCodingChallenges集合通过 GraphQL 从正在运行的客户端需开启 upcoming changes 显示拉取挑战数据校验EXPECTED_CHALLENGE_COUNT 365即预期共 365 道每日挑战从START_DATE 2025-08-11T00:00:00.000Z开始每道挑战按一天递增分配日期new Date(START_DATE.getTime() i * ONE_DAY_IN_MS)以挑战 ID 为_id用replaceOneupsert做幂等写入。有趣的是脚本中有一处针对生产环境禁止修改起始日期的硬校验——如果START_DATE意外变动会直接throw new Error防止已发布的每日挑战日程被打乱。这也是为什么 Challenge 54 对应的实际发布日期可以由起始日期推算它位于第 54 天即2025-08-11 53 天 ≈ 2025-10-03。3. API 与数据校验api/src/daily-coding-challenge 目录提供了每日挑战数据的 API 端点README 中说明获取每日挑战信息走该端点而提交逻辑仍在主 API 中。前端侧client/src/utils/daily-coding-challenge-validator.ts 用 Joi 对数据库返回的挑战结构做严格校验challengeNumber必须是大于等于 1 的整数javascript与python两套语言数据必须同时存在且各自包含teststexttestString与challengeFilesfileKeycontents字段。Challenge 54 的 Python 版本最终就是以其testString形式即本文开头那 9 个runPython断言被下发到浏览器评测的。4. 前端评测方式从挑战文档的 hint 可以看出Python 每日挑战的测试是通过runPython(...)注入到页面执行的测试体内直接使用标准库unittest.TestCase().assertEqual()。这意味着你的check_strength函数只需是模块级可导入的顶层函数就能被评测代码调用。这与普通 Python 挑战逐断言比对输出的评测方式不同——它直接执行单元测试风格的对象断言对函数的命名check_strength、参数单参数password和返回值weak/medium/strong三个精确字符串都有严格要求。从挑战到工程实践密码强度评估的现实考量作为收尾值得指出这道题在真实世界中的定位与局限这是一道规则计数教学题其四规则模型长度、大小写、数字、特殊字符对应经典的组成复杂度密码策略与 NIST 等现代密码建议所强调的长度优先 黑名单 泄露检测思路并不完全一致真实系统通常会用zxcvbn之类的强度估算库基于模式匹配与字典攻击模拟而非简单的规则计数但作为面试题/练习题这道题的价值在于把自然语言规则精确翻译成可执行的判定逻辑并正确处理复合规则与边界集合两类易错点——这正是从能写循环到能写规格明确的小工具函数的重要一步。如果你希望把check_strength用到自己的项目里官方解法中的re版本可直接复制若担心正则可读性字符串方法版同样成立。两者都能通过仓库中全部 9 个测试断言。小结本文以 freeCodeCamp 开源仓库中的 Challenge 54Pssw0rd Str3ngth!为样本完成了从题目规则、测试用例、官方解法到流水线源码的全链路拆解。核心要点回顾规则建模4 条规则用计数器累加2 条以下 weak、23 条 medium、4 条 strong复合条件大小写必须同时存在特殊字符仅限 8 个指定字符源码印证挑战文档 → block 元数据 → 种子脚本 → API 校验四层证据链完整可查。掌握了这套方法你既能独立通过该挑战也能理解 freeCodeCamp 每日编程挑战从课程 Markdown到线上评测的真实工程实现。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表