菜单

欧拉计划解决方案

相关源文件

目的与范围

本文档涵盖了 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_001problem_012problem_145)。

解决方案文件名:解决方案文件命名为 sol1.pysol2.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() 函数,具有以下特征:

  • 参数化带默认值:接受默认值与问题输入匹配的参数
  • 返回类型:将最终答案作为整数或字符串返回
  • Doctest 要求:必须包含 doctests,但不适用于最终答案
  • 类型提示:函数参数和返回值必须进行类型提示

模块结构要求

要求描述示例
模块文档字符串问题陈述和参考资料Project Euler 的完整问题文本
导入位置在模块文档字符串之后import math
辅助函数solution() 函数之前def helper_function()
主保护程序可选执行块if __name__ == "__main__"

文档标准

  • 问题陈述:模块文档字符串中的完整问题描述
  • 解决方案说明:可选但推荐在模块文档字符串中添加
  • 参考资料:如果使用,则链接到 Wikipedia 或其他来源
  • 函数文档字符串:简要说明,并为辅助函数提供 doctests

来源: project_euler/README.md26-49 project_euler/README.md56-118 project_euler/problem_012/sol2.py1-24

CI/CD集成

Project Euler 验证系统通过一个专用的工作流与 GitHub Actions 集成,该工作流在每次拉取请求和推送到主分支时运行。

性能监控

CI 系统会跟踪解决方案的性能,并报告最慢的实现,以帮助识别优化机会。这些信息会出现在 GitHub Actions 日志中的“最慢的 10 次持续时间”下。

API 集成

对于拉取请求,该系统使用 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