ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

freeCodeCamp 每日编程挑战解析:Space Week Day 3 “Phone Home“ 通信时延计算

freeCodeCamp 每日编程挑战解析:Space Week Day 3 “Phone Home“ 通信时延计算 freeCodeCamp 每日编程挑战解析Space Week Day 3 Phone Home 通信时延计算【免费下载链接】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模块的第 57 道挑战Space Week Day 3: Phone Home展开完整讲解题目约束、数学模型、官方参考解法与全部测试用例并结合仓库源码剖析这道 Python 挑战在 freeCodeCamp 平台上的执行与判题机制。读完本文你将掌握一类数组求和 固定时延补偿 指定位数舍入问题的通用解法也能理解该挑战背后的运行原理。挑战背景每日编码挑战与 Space Week在 freeCodeCamp 的课程体系中daily-coding-challenges-python是隶属于dev-playgroundsuperblock 的一个 Python 练习块。从 块定义文件 可以看到该块被标记为isUpcomingChange: true、usesMultifileEditor: true帮助分类为 Python块内包含从 Challenge 1: Vowel Balance 到 Challenge 250 等数百道独立的小型编程题目每道题聚焦一个具体的数据结构与算法技能点。本题是连续 7 道 Space Week 系列挑战中的第 3 天题目。整个系列还包括挑战标题主题Challenge 55Space Week Day 1: Stellar Classification恒星分类Challenge 56Space Week Day 2: Exoplanet Search系外行星搜索Challenge 57Space Week Day 3: Phone Home通信路由时延Challenge 58Space Week Day 4: Landing Spot着陆点Challenge 59Space Week Day 5: Goldilocks Zone宜居带Challenge 60Space Week Day 6: Moon Phase月相Challenge 61Space Week Day 7: Launch Fuel发射燃料该块的所有 Python 挑战都配有对应的 JavaScript 版本本题的 JS 孪生题目位于 JavaScript 同款挑战。课程测试文件 专门校验两个语言版本的挑战数量、ID、标题、描述与测试用例数量完全一致确保两种语言的练习体验等价。题目描述计算一条星际消息的传输总时长在 Space Week 的第三天你所在的通信路由上分布着你自己、若干颗卫星以及母星。题目给你一个由数字组成的数组其中每个元素代表路由上相邻两个节点之间的距离单位千米语义如下数组第一个值从你所在位置到第一颗卫星的距离数组中间的每个值除最后一个外从当前卫星到下一颗卫星的距离数组最后一个值从最后一颗卫星到你母星的距离。你的任务是计算一条消息沿该路由到达母星所需的总时间单位秒必须遵守以下约束消息传播速度为300,000 km/s即真空中光速的量级消息每经过一颗卫星都会引入0.5 秒的中继传输延迟最终结果需要四舍五入保留 4 位小数且去除末尾多余的零即返回符合 Python 数值舍入语义的数字。这里需要特别留意每经过一颗卫星的语义数组有n个元素就表示路由上有n段链路而消息在穿越这些链路时会经过n - 1颗中间卫星第一颗、第二颗……直到最后一颗最后一颗卫星之后直接到达母星。因此卫星数量是n - 1中继延迟总量为(n - 1) × 0.5秒。数学建模将上述约束翻译成公式设数组为route长度为n总路程 sum(route)即所有相邻节点间距离之和纯传播时间 sum(route) / 300_000秒中继延迟 (n - 1) × 0.5秒总时间 传播时间 中继延迟返回round(总时间, 4)。理解数组元素的物理含义题目的三个取值规则实际上描述了一条**逐跳hop-by-hop**的通信链路数组下标i表示第i跳。对于[a, b, c]这样的三元素数组a自己 → 卫星 1b卫星 1 → 卫星 2c卫星 2 → 母星。整条链路共3跳、经过2颗卫星。这个跳数减一的推导是本题最容易出错的地方——初学者容易误用len(route)作为卫星数量导致每个用例都多算 0.5 秒。初始代码Seed从占位实现出发freeCodeCamp 为本题提供了如下的初始模板seed存放在题目的--seed--段落中def send_message(route): return route这个模板刻意只返回了入参本身它不是一个可用的实现而是引导学习者逐步替换为真正的计算逻辑。你需要将route视为一个 Python 列表list并在函数体内完成求和、除法、延迟补偿与舍入。官方参考解法四行完成全部计算题目的--solutions--段落给出了官方参考实现def send_message(route): total_distance sum(route) delay (len(route) - 1) * 0.5 time total_distance / 300_000 total time delay return round(total, 4)逐行拆解sum(route)Python 内置求和一步得到总路程时间复杂度 O(n)(len(route) - 1) * 0.5数组长度减 1 得到中继卫星数量乘以 0.5 秒得到总延迟total_distance / 300_000利用 Python 3 的数字字面量下划线分隔符300_000提升可读性等价于300000除法在 Python 3 中始终返回浮点数round(total, 4)四舍五入到 4 位小数同时天然满足去除末尾多余零的要求——round(364.5, 4)返回364.5而不是364.5000因为 Python 的round返回的是数值而非格式化字符串。代码风格要点使用300_000这类下划线分隔的数字字面量在千米、光速等大数值场景下能显著提升代码可读性round的第二个参数ndigits4指定保留的小数位数这是题目四舍五入到 4 位小数的直接对应该解法没有显式处理空数组或负距离从题目约束看路由数组总是至少包含一个距离值这是符合题意的合理简化。全部测试用例验证逐例推导题目--hints--段落提供了 6 组断言全部通过runPython在浏览器内以unittest.TestCase().assertEqual的形式执行。下面逐一推导验证官方解法的正确性用例 1send_message([300000, 300000])→2.5总路程 600,000 km传播时间 600000 / 300000 2.0 s卫星数 2 - 1 1延迟 0.5 s总时间 2.0 0.5 2.5✓用例 2send_message([384400, 384400])→3.0627总路程 768,800 km传播时间 768800 / 300000 ≈ 2.5626667 s延迟 0.5 s总时间 ≈ 3.0626667四舍五入到 4 位 3.0627✓用例 3send_message([54600000, 54600000])→364.5总路程 109,200,000 km传播时间 364.0 s延迟 0.5 s总时间 364.5✓注意返回值是364.5而非364.5000验证了去除末尾零的要求用例 4send_message([1000000, 500000000, 1000000])→1674.3333总路程 502,000,000 km传播时间 502000000 / 300000 ≈ 1673.3333 s卫星数 3 - 1 2延迟 1.0 s总时间 ≈ 1674.3333 → 四舍五入 1674.3333✓用例 5send_message([10000, 21339, 50000, 31243, 10000])→2.4086总路程 122,582 km传播时间 122582 / 300000 ≈ 0.4086067 s卫星数 5 - 1 4延迟 2.0 s总时间 ≈ 2.4086067 → 四舍五入 2.4086✓用例 6send_message([802101, 725994, 112808, 3625770, 481239])→21.1597总路程 5,747,912 km传播时间 5747912 / 300000 ≈ 19.1597067 s延迟 2.0 s总时间 ≈ 21.1597067 → 四舍五入 21.1597✓可以观察到测试用例的覆盖面设计得很用心用例 1、3 验证整除场景下延迟项仍然生效且返回整数形态的浮点数用例 2 验证四舍五入进位用例 4 验证多颗卫星2 颗的延迟叠加用例 5、6 验证较长路由4 颗卫星下传播时间与延迟的精确叠加。其中用例 6 的 4 位小数恰好落在21.1597而非21.1598对舍入边界的把握提出了要求。源码级原理这道 Python 挑战在平台上是如何运行的Python 代码在浏览器中通过 Web Worker 执行与常规的 JavaScript 挑战不同Python 挑战无法直接由浏览器 JS 引擎执行。在 freeCodeCamp 客户端中Python 代码通过 Python Worker 处理器 调度客户端会加载python-worker.js基于 Pyodide 方案将 CPython 编译到 WebAssembly 后在浏览器内运行并维护一个单例 Workerfunction getPythonWorker(): Worker { if (!worker) { worker new Worker(pythonWorkerSrc); } return worker; }当学习者点击运行按钮时runPythonCode会向 Worker 发送{ type: run, code }消息由 Worker 内运行 Python 解释器执行用户代码执行结果通过print/input消息回传给页面供控制台终端渲染。若代码进入死循环或超时interruptCodeExecution会先尝试发送cancel消息失败则在 1 秒后强制终止并重建 Worker。判题机制unittest 断言注入本题的 6 个 hint 之所以能作为自动化测试运行是因为它们都包裹在runPython(...)调用中。以第一个测试为例({test: () { runPython( from unittest import TestCase TestCase().assertEqual(send_message([300000, 300000]), 2.5)) }})即在 Python 解释器中导入unittest构造TestCase将学习者定义的send_message与期望值进行断言比较。这种每个 hint 独立注入一段 Python 测试代码的模式让题目可以复用 Python 标准库的断言能力也保证send_message函数必须恰好返回一个数值而不是打印出来否则assertEqual必然失败。挑战的课程数据链路块与题目顺序本题在 块定义 中被声明为challengeOrder中的第 57 项id 为68c1a929005bf54d342aa8d4superblock 归属dev-playground superblock 同时挂载了daily-coding-challenges-javascript与daily-coding-challenges-python两个块二者共享题目 ID 与标题这也是 daily-challenges.test.js 能按索引一一配对校验的基础元数据校验课程 schema 会对每个挑战文件的 frontmatter 进行 Joi 校验确保challengeType本题为 29即 Python 类挑战、标题、描述、seed 与 solutions 等字段格式合法。易错点与进一步练习易错点 1卫星数量算错。卫星数量永远是len(route) - 1因为数组元素描述的是段而卫星位于段与段之间。把len(route)直接当作卫星数会让每个用例的答案多 0.5 秒。易错点 2忘记延迟项。只做sum(route) / 300_000会得到纯传播时间与期望值系统性偏差 0.5 的整数倍。易错点 3舍入方式不对。题目要求四舍五入保留 4 位小数应使用round(total, 4)而非int()截断或格式化字符串截断同时注意返回的是数值末尾零应自然消失。延伸思考如果题目改为每颗卫星延迟 0.4 秒或速度为 299,792.458 km/s解法结构完全不变只需替换常量。这提示我们这类问题的核心训练点在于把自然语言约束准确映射为数学表达式——识别求和、固定补偿、精度处理三个正交的组成部分是应对一切类似题目的通用方法论。如果你希望继续探索可以阅读本题的 Python 挑战原文 与 JavaScript 同款挑战 对照学习在 daily-coding-challenges-python 块目录 中浏览 Space Week 系列的其他题目Challenge 55–61体会同一主题下的渐进式难度设计阅读 Python Worker 处理器源码 深入了解浏览器内 Python 执行与中断恢复机制运行 每日挑战一致性测试SHOW_UPCOMING_CHANGEStrue时生效观察 JS 与 Python 两个版本如何被校验为完全等价。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表