尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

freeCodeCamp 每日编程挑战解析:血型相容性(Blood Type Compatibility)判定算法

发布时间:2026/9/10 13:51:08

资讯中心
01
ARTICLE

freeCodeCamp 每日编程挑战解析:血型相容性(Blood Type Compatibility)判定算法

freeCodeCamp 每日编程挑战解析:血型相容性(Blood Type Compatibility)判定算法
freeCodeCamp 每日编程挑战解析血型相容性Blood Type Compatibility判定算法【免费下载链接】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 197: Blood Type Compatibility」为骨架完整讲解 ABO 血型系统与 Rh 因子在输血相容性判定中的建模方法。你将掌握如何把医学规则转化为可判定的条件逻辑、如何用查表法与字符串切片写出可读性强的canDonate函数以及该挑战在 freeCodeCamp 每日编程挑战体系中的真实运行环境。读完本文你不仅能独立完成这道题还能理解这类「双维度规则判定」题目的通用解法套路。挑战背景它来自 freeCodeCamp 的哪套体系这份关联文档位于curriculum/challenges/english/blocks/daily-coding-challenges-javascript/目录下属于 freeCodeCamp 课程中daily-coding-challenges-javascriptJavaScript 每日编程挑战模块的一部分。从 模块结构文件 可以看到该模块的元数据为dashedName:daily-coding-challenges-javascripthelpCategory:JavaScriptblockLayout:legacy-challenge-listusesMultifileEditor:true该模块在 日常挑战测试 中被验证系统同时维护 JavaScript 与 Python 两套每日挑战要求两者数量一致、标题与描述一致、测试数量一致。也就是说这道「血型相容性」题目是每日挑战池中第 197 号题目属于整个系列共 200 道的普通日常题难度中等偏易重点考察字符串解析与多条件逻辑组合。小知识整个 daily-coding-challenges-javascript 模块目前标记为isUpcomingChange: true即属于「即将上线」的实验性课程内容正在通过dev-playgroundsuperblock 进行测试与验证。题目要求判断供血者能否向受血者输血文档--description--部分给出的核心任务是Given a donor blood type and a recipient blood type, determine whether the donor can give blood to the recipient.给定供血者血型与受血者血型判断供血者能否向受血者输血。输入格式每个血型由两部分组成一个字母A、B、AB或O一个 Rh 因子或-血型字符串为「合法字母 Rh 因子」的组合例如AB和O-都是合法血型。函数签名如下function canDonate(donor, recipient) { ... }两个入参均为形如B的字符串函数应返回布尔值。规则拆解ABO 字母规则与 Rh 因子规则题目将判定逻辑清晰地划分为两个独立维度两个规则必须同时通过才能判定为可输血。Letter RulesABO 字母规则供血者字母可输给含义OA、B、AB、OO 型是万能供血者可以给其他任意字母型输血AA、ABA 型只能给 A 型和 AB 型BB、ABB 型只能给 B 型和 AB 型ABABAB 型只能给 AB 型从规则可以提炼出规律规则的核心取决于「受血者的字母是否出现在供血者可输给的字母集合中」。供血者只能给自己「更稀有」或「同型」的受血者输血而 O 型最普遍型可以输给所有人。Rh RulesRh 因子规则供血者 Rh可输给含义-阴性-和Rh 阴性是「万能阴性供血者」可以输给阴性与阳性阳性Rh 阳性只能输给阳性Rh 因子的本质是阴性血型没有 Rh 抗原不会引发阳性受血者的免疫反应而阳性血型如果输给阴性受血者可能引发抗 D 抗体反应因此不允许。综合判定只有当字母规则通过且Rh 规则通过时canDonate才返回true。这也解释了为什么O不能输给A-字母通过但 Rh 不通过以及A不能输给AB-字母通过但 Rh 不通过。测试用例10 个 hints 全解析文档--hints--部分给出了 10 个断言测试覆盖了规则的所有关键分支。完整清单如下调用期望结果判定依据canDonate(B, B)true同字母B→B 允许、同 Rh→ 允许canDonate(O-, AB-)true字母 O→AB 允许Rh -→- 允许canDonate(O, A-)false字母 O→A 允许但 Rh →-不允许canDonate(A, AB)trueA→AB 允许→ 允许canDonate(A-, B-)false字母 A→B不允许canDonate(B-, AB)trueB→AB 允许-→ 允许阴性万能 RhcanDonate(B-, A)false字母 B→A不允许canDonate(O-, O)trueO→O 允许-→ 允许阴性万能 RhcanDonate(O, O-)false字母 O→O 允许但 Rh →-不允许canDonate(AB, AB-)false字母 AB→AB 允许但 Rh →-不允许这些测试用例被写成assert.isTrue(...)/assert.isFalse(...)的断言形式运行在 freeCodeCamp 的浏览器端测试执行环境中。测试脚本通过testString字段注入到挑战页面中执行这部分数据结构在 每日挑战校验器 中被定义为tests: { text, testString }[]与每日挑战 API 返回的数据格式完全对应。测试设计要点10 个用例刻意覆盖了「字母通过 Rh 不通过」「Rh 通过 字母不通过」「两者都通过」「两者都不通过」四种组合确保解法不会只处理单一维度而漏掉逻辑。种子代码与解题思路文档--seed--部分提供的初始代码非常简陋只返回了donor参数function canDonate(donor, recipient) { return donor; }显然这是「占位式」种子代码需要你补全逻辑。官方解题思路分三步走拆解输入用slice把血型字符串拆成「字母部分」和「Rh 因子部分」构建查表用对象字面量表达 ABO 规则的「供血者 → 可输血字母集合」映射组合判定aboMatch rhMatch同时成立才返回true。官方解决方案逐行解析文档--solutions--部分给出了完整官方解法function canDonate(donor, recipient) { const donorType donor.slice(0, -1); const donorRh donor.slice(-1); const recipientType recipient.slice(0, -1); const recipientRh recipient.slice(-1); const aboCompatibility { O: [A, B, AB, O], A: [A, AB], B: [B, AB], AB: [AB] }; const aboMatch aboCompatibility[donorType].includes(recipientType); const rhMatch donorRh - || (donorRh recipientRh ); return aboMatch rhMatch; }第一步字符串切片提取维度const donorType donor.slice(0, -1); // 去掉最后一个字符得到字母部分 const donorRh donor.slice(-1); // 取最后一个字符得到 Rh 因子slice(0, -1)返回除最后一个字符外的所有内容slice(-1)返回最后一个字符。这样AB被拆成AB和O-被拆成O和-。对三个字符的血型AB/AB-与两个字符的血型A/O-都天然兼容这正是用slice而非硬编码下标的原因。第二步查表法表达 ABO 规则const aboCompatibility { O: [A, B, AB, O], A: [A, AB], B: [B, AB], AB: [AB] };对象键是供血者字母值是「该供血者可以输给的受血者字母列表」。这与题目 Letter Rules 完全一一对应。includes方法检查受血者字母是否在该列表中时间复杂度为 O(n)n 最大为 4性能可忽略。第三步Rh 规则的布尔表达式const rhMatch donorRh - || (donorRh recipientRh );这个表达式直接翻译题目规则供血者为-无条件允许donorRh -为真供血者为仅当受血者也时允许括号内两个条件同时为真。第四步双规则合取return aboMatch rhMatch;只有字母规则与 Rh 规则同时通过才返回true与文档要求的 Both letter and Rh rule must pass 完全吻合。从源码看这道题的运行环境与验证链路挑战数据的加载与校验每日挑战由后端 Fastify 服务提供。在 API 路由实现 中挑战通过日期查询/daily-coding-challenge/date/:dateYYYY-MM-DD、/daily-coding-challenge/day/:dayMM-DD、/daily-coding-challenge/today、/daily-coding-challenge/month/:month等端点从dailyCodingChallenges表读取数据返回结构包含id、challengeNumber、title、date、description、javascript、python等字段其中javascript.tests[].testString就是本挑战--hints--中那些assert.isTrue(...)代码的执行载体。前端侧每日挑战校验器 使用 Joi 对 API 返回数据做结构化校验要求tests数组中的每项必须包含text与testString且challengeFiles必须包含fileKey与contents——种子代码function canDonate(...)正是作为challengeFiles[].contents注入编辑器。挑战完成后的提交流程值得注意的一点是API 注释明确说明这些 GET 路由「只用于获取挑战信息挑战仍通过主挑战完成路由提交」见 daily-coding-challenge.ts。也就是说canDonate的测试是在浏览器端编辑器里运行并判定通过后再由客户端把结果提交到挑战完成接口。端到端测试的佐证e2e 每日挑战测试 展示了完整的测试视角它会 mock 一份包含challengeNumber、title、description、javascript/python双语言字段的 API 响应验证每日挑战页面按日期路由如/learn/daily-coding-challenge/08-11正常渲染、编辑器可交互。这印证了本题所处的真实教学链路课程 Markdown 文档 → API 数据 → 前端编辑器 → 浏览器内断言 → 提交完成。深入理解为什么查表法优于 if-else 链同样的问题也可以写成多层if/else// 等价的 if-else 写法供对比非官方解法 function canDonate(donor, recipient) { const [donorLetter] donor; const donorRh donor.slice(-1); const recipientLetter recipient[0]; const recipientRh recipient.slice(-1); let letterOk false; if (donorLetter O) letterOk true; else if (donorLetter A) letterOk recipientLetter A || recipientLetter AB; else if (donorLetter B) letterOk recipientLetter B || recipientLetter AB; else if (donorLetter AB) letterOk recipientLetter AB; let rhOk donorRh - || recipientRh ; return letterOk rhOk; }官方解法选择查表 includes核心优势在于可读性ABO 兼容矩阵以数据形式呈现与题目规则表格一一对应无需逐行解读分支可扩展性如果未来加入更多血型系统如 Kell、Duffy只需扩展对象结构正确性边界donorType作为对象键直接索引代码结构上杜绝了「漏写某个字母分支」的可能。边界情况与健壮性思考题目保证输入为合法血型字母 Rh 因子因此官方解法无需处理非法输入。但作为练习可以延伸思考若输入包含小写如aslice拆解依然有效但对象键查表会得到undefined导致undefined.includes(...)抛错——需要先toUpperCase()归一化若入参为空字符串slice(0, -1)得到同样会触发查表异常若血型是四位字符串现实中不存在slice(0, -1)与slice(-1)依然能正确拆出「最后一个字符为 Rh」只是字母部分可能非法。这些边界在本题中由题目约束排除但理解它们有助于写出更健壮的通用判定函数。延伸阅读与相关资源挑战原文Challenge 197: Blood Type Compatibility模块定义与全部 200 挑战清单daily-coding-challenges-javascript.json挑战数据 API 实现daily-coding-challenge.ts每日挑战数据格式校验daily-coding-challenge-validator.ts每日挑战前端组件日历、归档、今日入口widget.tsx双语言挑战一致性测试daily-challenges.test.js如果你想在本地体验这道题可按仓库根目录 README.md 的指引启动开发环境进入dev-playgroundsuperblock 下的daily-coding-challenges-javascript模块找到 Challenge 197在编辑器内补全canDonate并通过全部 10 个断言即视为通关。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。