本文档涵盖了 TheAlgorithms/Python 仓库中的 Project Euler 解决方案系统。该系统提供了 Project Euler 中数学和计算问题的已验证实现,以及确保解决方案正确性的自动化测试基础架构。
有关通用的算法实现指南,请参阅 贡献指南。有关其他数学算法的信息,请参阅 数学与科学算法。
Project Euler 系统由解决方案实现、验证基础架构和自动化测试组件组成,这些组件共同作用以维护解决方案的质量和正确性。
来源: scripts/validate_solutions.py1-109 project_euler/README.md1-119 .github/workflows/project_euler.yml
Project Euler 解决方案遵循标准化的目录结构,每个问题都有自己的目录,其中包含一个或多个解决方案实现。
目录命名约定:问题目录遵循 problem_XXX 模式,其中 XXX 是零填充的问题编号(例如,problem_001、problem_012、problem_145)。
解决方案文件名:解决方案文件命名为 sol1.py、sol2.py 等,允许每个问题有多个实现。
来源: project_euler/README.md17-21 scripts/validate_solutions.py38-48 project_euler/problem_012/sol2.py1-58
该验证系统使用 pytest 和 SHA256 哈希验证来自动测试所有 Project Euler 解决方案,以确保正确性,同时不泄露实际答案。
test_project_euler() 函数实现了参数化测试,其中每个解决方案文件都成为一个独立的测试用例,问题编号从目录名称中提取,并用于查找预期的哈希值。
来源: scripts/validate_solutions.py30-109 scripts/validate_solutions.py93-108
该系统使用 SHA256 哈希来验证解决方案的正确性,同时保持实际答案的机密性。 project_euler_answers.json 文件包含每个问题的预期哈希值。
| 组件 | 目的 | 示例 |
|---|---|---|
PROBLEM_ANSWERS | 将问题编号映射到哈希值的字典 | "001": "c0b20f4..." |
solution() 函数 | 每个解决方案文件必需的函数 | 返回整数/字符串答案 |
| SHA256 哈希 | 将答案转换为可验证的哈希 | hashlib.sha256(answer.encode()).hexdigest() |
哈希验证过程确保解决方案产生正确的结果,同时通过不在仓库中公开实际答案来保持 Project Euler 的教育价值。
来源: scripts/validate_solutions.py100-108 scripts/project_euler_answers.json1-636
Project Euler 解决方案必须遵循特定的编码标准,这些标准将通用的仓库指南扩展到特定于问题的要求。
每个解决方案文件都必须包含一个 solution() 函数,具有以下特征:
| 要求 | 描述 | 示例 |
|---|---|---|
| 模块文档字符串 | 问题陈述和参考资料 | Project Euler 的完整问题文本 |
| 导入位置 | 在模块文档字符串之后 | import math |
| 辅助函数 | 在 solution() 函数之前 | def helper_function() |
| 主保护程序 | 可选执行块 | if __name__ == "__main__" |
来源: project_euler/README.md26-49 project_euler/README.md56-118 project_euler/problem_012/sol2.py1-24
Project Euler 验证系统通过一个专用的工作流与 GitHub Actions 集成,该工作流在每次拉取请求和推送到主分支时运行。
CI 系统会跟踪解决方案的性能,并报告最慢的实现,以帮助识别优化机会。这些信息会出现在 GitHub Actions 日志中的“最慢的 10 次持续时间”下。
对于拉取请求,该系统使用 GitHub API 来仅获取已更改的文件,通过仅验证新解决方案或修改的解决方案来优化测试执行时间。
来源: scripts/validate_solutions.py51-79 scripts/validate_solutions.py82-91 project_euler/README.md8 project_euler/README.md15-21
Project Euler 解决方案的贡献流程遵循一个结构化的工作流程,以确保解决方案的质量和对标准的遵守。
problem_XXX 命名约定来源: CONTRIBUTING.md176-177 project_euler/README.md11-13 project_euler/README.md15-21