判断)
freeCodeCamp 每日编程挑战解析Challenge 152 Circular Prime循环素数判断【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp在 freeCodeCamp 的 JavaScript 每日编程挑战Daily Coding Challenge中第 152 题要求实现isCircularPrime(n)判断一个整数是否为循环素数Circular Prime——即它的每一位数字依次循环轮转得到的所有数都仍是素数。本文以仓库中该题目的源 Markdown69373793f5a867f769cde137.md为核心完整还原题目约束、官方测试用例与参考解法并结合前端运行、GraphQL 抽取、数据库种子与 API 路由等源码讲透从题目文件到网页上可作答的交互挑战的完整链路。读完本文你既能独立通过本题也能掌握这类 freeCodeCamp 挑战文件的编写规范与仓库结构。题目回顾什么是循环素数题目给出的数学定义非常精炼一个**循环素数circular prime**是这样一个整数将其十进制表示的数字不断旋转把首位数字依次移到末尾得到的所有排列依然是素数。以题目文档中给出的经典例子197为例它的全部旋转为197→ 自身971→ 首位移到末尾719→ 继续旋转由于197、971、719三个数都是素数因此isCircularPrime(197)应返回true。值得注意素数不一定是循环素数。例如23是素数但旋转得到32偶数、非素数因此23不是循环素数同理89本身是素数但旋转成98后为合数所以也不是循环素数。这说明解题时必须考察每一个旋转结果而不是只看原数本身。理解挑战文件结构题目是如何被编排的这道题在仓库中是一个标准的 freeCodeCamp challenge Markdown 文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/69373793f5a867f769cde137.md。文件内容可以拆解为两部分frontmatterYAML 元数据与正文分段以# --xxx--分隔的指令块。frontmatter 字段含义文件开头是 YAML 格式的元数据--- id: 69373793f5a867f769cde137 title: Challenge 152: Circular Prime challengeType: 28 dashedName: challenge-152 ---id该挑战的全局唯一标识同时是题目在每日挑战时间线中的日期坐标来源。在 daily-coding-challenges-javascript.json 的challengeOrder数组中第 614–615 行可以找到id: 69373793f5a867f769cde137与title: Challenge 152: Circular Prime的对应关系。title/dashedName用于展示与生成 URL 片段的题目标题。challengeType: 28声明题目类型为可运行代码 自动测试的编码题。可以从前端源码 show-daily-coding-challenge.tsx 中看到印证JavaScript 版每日挑战被写入challengeType: 28而对应的 Python 版本使用challengeType: 29两者都被当作经典classic挑战渲染。正文的四大分段分段内容作用# --description--题目文字说明渲染在题目描述区讲解循环素数定义与197例子# --hints--一组assert断言用户代码通过全部断言即判为通过# --seed--/--seed-contents--初始代码骨架编辑器初始加载的待补全函数isCircularPrime(n)# --solutions--官方参考实现维护者提供的标准答案用于验证题目可解这种结构正是 freeCodeCamp 课程体系所有题目的通用编排格式可对照同目录下其他 challenge 文件而本仓库的课程 schema 校验、课程生成工具与前端 Gatsby 数据层都依赖这套约定来消费这些 Markdown。官方测试用例解读# --hints--段落的断言就是本题的自动化评分依据共 5 组全部应当通过输入期望返回值推理依据197true旋转197、971、719均为素数题目示例23false23为素数但旋转32是合数13true旋转13、31均为素数89false89为素数但旋转98是合数1193true旋转1193、1931、9311、3119均为素数1193也是最小的四位循环素数作为开发者你完全可以用这套断言驱动开发先实现朴素版本再逐个用assert核对边界。动手实现分三步完成判断函数签名与初始骨架由# --seed--给出function isCircularPrime(n) { return n; }初始代码只是一个占位返回显然无法通过任何测试。完整实现可以拆解为三个独立的小函数逻辑更清晰、更易测试。第 1 步可靠的素性检测isPrimefunction isPrime(n) { if (n 2) return false; for (let i 2, sqrt Math.floor(Math.sqrt(n)); i sqrt; i) { if (n % i 0) return false; } return true; }要点分析n 2直接排除0、1与负数都不是素数这是最容易遗漏的边界。只用试除到√n如果n a × b且两者都大于√n则乘积会超过n矛盾因此只要在[2, √n]区间内找不到因子n必为素数。对旋转产生的三位数、四位数而言这一步能把工作量从n量级降到√n量级。也可额外处理n 2、偶数提前返回等小优化但上面的写法对本题输入已足够且最不易出错。第 2 步生成全部旋转rotationsfunction rotations(num) { const str num.toString(); const result []; for (let i 0; i str.length; i) { result.push(str.slice(i) str.slice(0, i)); } return result.map(Number); }这里用字符串切片模拟旋转对每个偏移量i把子串[i..末尾]拼到[0..i-1]的前面。以197为例i 0197 →197i 197 1→971i 27 19→719最后通过map(Number)把字符串数组转回数字数组方便后续直接交给isPrime。注意旋转次数等于数字位数一位数旋转后仍是它自身此时只需判断其本身是否为素数。第 3 步组合成isCircularPrimefunction isCircularPrime(num) { const rots rotations(num); return rots.every(isPrime); }利用Array.prototype.every只有所有旋转都是素数才返回true只要有一个不是素数就短路返回false——这与# --hints--中23、89返回false的用例完全吻合。参考解法与复杂度分析# --solutions--中官方给出的完整参考实现如下function isPrime(n) { if (n 2) return false; for (let i 2, sqrt Math.floor(Math.sqrt(n)); i sqrt; i) { if (n % i 0) return false; } return true; } function rotations(num) { const str num.toString(); const result []; for (let i 0; i str.length; i) { result.push(str.slice(i) str.slice(0, i)); } return result.map(Number); } function isCircularPrime(num) { const rots rotations(num); return rots.every(isPrime); }设输入为d位数则rotations的时间与空间复杂度均为O(d)每个旋转数做一次isPrime单次代价O(√(10^d))总体时间复杂度约为O(d · √(10^d))。对测试用例中的 14 位数来说运行毫秒级即可完成能轻松通过挑战评测。从工程视角看把素数判定旋转生成整体判断拆成三个纯函数既方便单独调试也让isCircularPrime的语义一目了然——这正是 freeCodeCamp 相关编码题所鼓励的小函数 组合风格。进阶优化思路若要追求更好的性能可以利用循环素数的结构特征做前置剪枝当位数大于 1 时若数字中任意一位是偶数或5那么把这一位旋转到最高位后得到的数要么是偶数、要么以5结尾被 5 整除必然不是素数因此可以直接判定为false从而省去大量无谓的素性检测。换言之真正的多位循环素数其所有数字只能来自{1, 3, 7, 9}可参考本仓库 daily-coding-challenges-javascript 板块中Unnatural Prime等其他素数题目的类似剪枝思想。不过需要注意的是数字全部属于{1,3,7,9}只是必要条件像79这样的数旋转后97虽也是素数、可通过而91 7 × 13这类情形仍需老老实实对每个旋转做isPrime校验因此全部旋转逐一验证依然是最终的判断标准。另外若需要判断大量输入是否为循环素数可先用筛法如埃拉托斯特尼筛预生成素数表把isPrime降为O(1)查表这在批量处理时能显著提速。从题目文件到网页一次完整的生命周期这道题并不仅仅是一份孤立的 Markdown它在仓库中有一条完整的数据链路。理解这条链路能让你真正明白每日一道题是如何运转的。1. 源文件JavaScript / Python 双版本并行helpers.ts 中的 GraphQL 查询表明每日挑战分别从daily-coding-challenges-javascript与daily-coding-challenges-python两个 block 抓取同号题目并在combineChallenges()里严格校验两者title、description、测试数量完全一致后合并成一条记录——其中_id直接复用 JavaScript 题的id即本题的69373793f5a867f769cde137。这份 markdown 正是该链路的源头输入。2. 种子脚本写入 MongoDB 的DailyCodingChallenges集合seed-daily-challenges.ts 承担灌库职责它先要求本地 Gatsby 客户端以 dev-playground superblock 形式运行并暴露 GraphQL 接口再拉取全部题目、为第i道题分配START_DATE i 天的日期起始日为2025-08-11T00:00:00.000Z共期望365道题最后用replaceOne upsert的批量写操作写入 MongoDB。脚本顶部还有防呆设计如果起始日期被意外改动会直接抛错防止上线后时间线错乱。3. API 层按日期取题写入数据库后每日挑战由 routes/daily-coding-challenge.ts 的接口对外提供前端通过形如${apiLocation}/daily-coding-challenge/day/${monthDay}的请求按MM-DD取当日题目响应数据会用 daily-coding-challenge-validator.ts 做 schema 校验防止脏数据进入编辑器。4. 前端渲染经典挑战Classic视图show-daily-coding-challenge.tsx 负责把数据库返回的题目信息重新组装成ShowClassic组件需要的challengeNode结构并根据用户在 JS/Python 间的语言选择默认取localStorage中dailyCodingChallengeLanguage的值注入challengeType、tests、challengeFiles等属性。题目入口今日挑战与往期归档按钮则由 widget.tsx 提供跳转到/learn/daily-coding-challenge/...路径。也就是说你在浏览器里看到的isCircularPrime代码编辑器、右侧实时运行的 5 条assert测试其源头正是本篇文章所解析的这份 Markdown 中的# --hints--与# --seed--——文件的每一行最终都会被真实执行。小结Challenge 152: Circular Prime是 freeCodeCamp 每日编程挑战中一道典型的数学定义 枚举验证型题目先正确写出素性检测再用字符串切片穷举全部旋转最后用every做短路判定。它在仓库内的完整存在形式包括位于 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/69373793f5a867f769cde137.md 的题目源文件、编排在 daily-coding-challenges-javascript.json 的结构清单、经由 helpers.ts 与 seed-daily-challenges.ts 完成的 JS/Python 合并与灌库、以及 API 与前端组件的取题渲染。若想动手验证自己的解法运行仓库中 daily-coding-challenge 相关测试pnpm test等详见各子包package.json脚本即可获得与官方一致的断言反馈。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考