PythonProgrammingPuzzles

PythonProgrammingPuzzles

Python编程谜题集:评估与提升AI编程技能

PythonProgrammingPuzzles是一个开源项目,提供多样化的Python编程谜题,用于评估和提升AI的编程能力。项目包含从基础到高级的各类问题,涵盖经典算法、竞赛题目和开放性数学难题。通过代码定义的规范和自动验证机制,该平台为AI编程学习和评估提供了客观、有效的测试环境。项目不仅展示了现有AI系统的解题能力,还鼓励社区贡献新谜题,促进AI编程技术的持续发展。

Python编程AI算法开源项目Github

Python 编程谜题 (P3)

本仓库包含一个 Python 编程谜题数据集,可用于教学和评估 AI 的编程能力。我们展示了 OpenAI 的 codex 神经网络在解决这些谜题时生成的代码。我们希望这个数据集能快速增长,它在问题难度、领域和解决问题所需的算法工具方面已经很多样化。请提出新谜题浏览新提出的谜题,或通过拉取请求贡献

要了解 GPT-3 等 AI 系统如何解决这些问题,请阅读我们的两篇论文:

编程谜题。Tal Schuster、Ashwin Kalyan、Oleksandr Polozov、Adam Tauman Kalai。发表于第三十五届神经信息处理系统会议数据集和基准轨道 (NeurIPS),2021年。

@inproceedings{
schuster2021programming,
title={Programming Puzzles},
author={Tal Schuster and Ashwin Kalyan and Alex Polozov and Adam Tauman Kalai},
booktitle={Thirty-fifth Conference on Neural Information Processing Systems Datasets and Benchmarks Track},
year={2021},
url={https://arxiv.org/abs/2106.05784}
}

要复现该论文的结果,请查看 solvers 文件夹。

新的自学方法: 在我们的第二篇论文中,我们让语言模型(LMs)生成自己的谜题,并与 Python 解释器一起提高自身解谜能力。继我们的论文(arXiv,2022年)之后,出现了几篇论文,其中 LM 通过检查自己的解决方案来改进自身。然而,我们的方法可能更强大,因为我们让 LM 生成自己的问题,而不仅仅是自己的解决方案。

语言模型可以自学编程以提高能力。Patrick Haluptzok、Matthew Bowers、Adam Tauman Kalai。发表于第十一届国际学习表示会议 (ICLR),2023年。

@inproceedings{
haluptzok2022selfteach,
title={Language Models Can Teach Themselves to Program Better},
author={Patrick Haluptzok, Matthew Bowers, Adam Tauman Kalai},
booktitle={Eleventh International Conference on Learning Representations (ICLR)},
year={2023},
url=https://arxiv.org/abs/2207.14502}
}

要复现该论文的结果,请查看 ICLR2023 文件夹。

如果你想直接开始解决一些谜题,可以尝试 Binder 上的入门笔记本,它展示了 AI 基线解决和未解决的谜题,让你可以比较自己的编程水平。

什么是 Python 编程谜题?

每个谜题都是一个 Python 函数的形式,该函数接受一个答案作为参数。答案是一个输入,使函数返回 True。这被称为满足谜题,这就是为什么所有谜题都命名为 sat

def sat(s: str): return "Hello " + s == "Hello world"

上面谜题的答案是字符串 "world",因为 sat("world") 返回 True。谜题的范围从像这样的琐碎问题,到经典谜题,再到编程竞赛问题,甚至包括算法和数学中的未解决问题。

经典的 汉诺塔 谜题可以这样写:

def sat(moves: List[List[int]]): """ 八个大小为 1-8 的圆盘堆叠在三个塔上,每个塔上的圆盘按从大到小的顺序排列。移动 [i, j] 对应于从塔 i 取下最小的圆盘并放在塔 j 上,只要塔保持排序顺序,这种移动就是合法的。找到一系列移动,将所有圆盘从第一个塔移动到最后一个塔。 """ rods = ([8, 7, 6, 5, 4, 3, 2, 1], [], []) for [i, j] in moves: rods[j].append(rods[i].pop()) assert rods[j][-1] == min(rods[j]), "较大的圆盘在较小圆盘上面" return rods[0] == rods[1] == []

最短的答案是一个包含 255 个移动的列表,所以我们要求 AI 生成输出答案的代码。在这种情况下,codex API 生成了以下代码:

def sol(): # 来自 https://www.geeksforgeeks.org/c-program-for-tower-of-hanoi/ moves = [] def hanoi(n, source, temp, dest): if n > 0: hanoi(n - 1, source, dest, temp) moves.append([source, dest]) hanoi(n - 1, temp, source, dest) hanoi(8, 0, 1, 2) return moves

这不是它的第一次尝试,但这就是谜题的优势之一——计算机很容易检查答案,所以它可以生成许多答案,直到找到一个满意的答案。对于这个谜题,大约每 1,000 个解决方案中有 1 个是令人满意的。显然,codex 以前在其他输入格式中见过这个问题——它甚至生成了一个 url!(仔细检查后,该网站确实存在,并包含完全不同格式和不同变量名的 Python 汉诺塔代码。)在一个更难、不太标准的 汉诺塔谜题变体 中,需要从特定的起始位置移动到结束位置,codex 在 10,000 次尝试中都没有解决它。

接下来,考虑一个受 codeforces.com 网站上 这个简单的竞赛编程问题 启发的谜题:

def sat(inds: List[int], string="Sssuubbstrissiingg"): """找到递增的索引,使其构成子字符串 "substring" """ return inds == sorted(inds) and "".join(string[i] for i in inds) == "substring"

Codex 生成了以下代码,运行后给出了有效答案 [1, 3, 5, 7, 8, 9, 10, 15, 16]。这满足了谜题,因为它是一个递增的索引列表,如果你连接这些索引处 "Sssuubbstrissiingg" 的字符,你会得到 "substring"

def sol(string="Sssuubbstrissiingg"): x = "substring" pos = string.index(x[0]) inds = [pos] while True: x = x[1:] if not x: return inds pos = string.find(x[0], pos+1) if pos == -1: return inds inds.append(pos)

同样,这里有多个有效答案,而且这也是经过多次尝试的结果(10,000 次中只有 1 次成功)。

一个更具挑战性的谜题,需要 动态规划 的是 最长递增子序列 问题,我们也可以用字符串来描述:

def sat(x: List[int], length=20, s="Dynamic programming solves this classic job-interview puzzle!!!"): """找到字符按排序顺序的最长子串的索引""" return all(s[x[i]] <= s[x[i + 1]] and x[i + 1] > x[i] for i in range(length - 1))

Codex 没有解决这个问题。

该数据集还包含一些计算机科学和数学中的未解决问题。例如,Conway 的 99 图问题 是图论中一个未解决的问题(另见 五个 $1,000 问题(2017 年更新)

def sat(edges: List[List[int]]): """ 找到一个有 99 个顶点的无向图,其中每两个相邻顶点恰好有一个共同邻居,每两个不相邻顶点恰好有两个共同邻居。 """ # 首先计算邻居集合 N: N = {i: {j for j in range(99) if j != i and ([i, j] in edges or [j, i] in edges)} for i in range(99)} return all(len(N[i].intersection(N[j])) == (1 if j in N[i] else 2) for i in range(99) for j in range(i))

为什么是谜题?一个原因是,如果我们能比人类程序员更好地解决它们,那么我们就可以在一些重要的算法问题上取得进展。但在此之前,第二个原因是它们可以用于训练和评估 AI 系统。多年来,人们提出了许多编程数据集,其中几个包含类似性质的问题(如编程竞赛问题)。在谜题中,规范是由代码定义的,而其他数据集通常使用英语和隐藏的输入-输出对测试集的组合。基于英语的规范众所周知是模糊的,并测试系统对英语的理解。而对于输入-输出测试用例,你必须在提出谜题之前就解决了它,那么这有什么用呢?基于代码的规范的优势在于它们是明确的,不需要调试 AI 生成的代码或担心它不能做你想要的事。如果它解决了谜题,那么根据定义它就成功了。

有关动机以及编程谜题如何帮助 AI 学习编程的更多信息,请参阅论文: 编程谜题,作者:Tal Schuster、Ashwin Kalyan、Alex Polozov 和 Adam Tauman Kalai。2021 年(链接将很快添加)

点击此处浏览谜题和解决方案

本仓库中的问题基于:

笔记本

notebooks 子目录包含一些相关的笔记本。Intro.ipynb 包含十几个谜题,指出了 AI 解决和未解决的谜题 在 Binder 上尝试笔记本,看看你的编程水平如何与 AI 基线相比较!

Demo.ipynb 包含我们用户在用户研究中完成的 30 个问题。尝试 演示笔记本,看看你的编程水平如何与 AI 基线相比较!

黑客马拉松

2020年7月27日至29日,在微软举办的黑客马拉松期间,多人完成了30个用户研究谜题。我们还在Hackathon_puzzles.ipynb中创造谜题时玩得很开心。这些谜题风格略有不同,因为它们更多的是"黑客"式的,比如:

def sat(x): return x > x

这里x的类型显然是非标准的。这些谜题的创作者包括以下GitHub用户: Adam Tauman KalaiAlec HelblingAlexander VorobevAlexander WeiAlexey RomanovKeith BattaochiKodai SudoMaggie HeiMariia MykhailovaMisha KhodakMonil MehtaPhilip RosenfieldQida MaRaj BhargavaRishi JaiswalSaikiran MullaguriTal SchusterVarsha Srinivasan。 你可以在(链接待添加)尝试这个notebook。

亮点

  • 许多简单的谜题,如反转列表,对学习编程很有帮助
  • 经典谜题如:
    • 汉诺塔
    • 字母算术(解决数字替换问题,如SEND + MORE = MONEY)
    • 生命游戏(例如,找出给定周期的振荡器,一些未解决
    • 国际象棋谜题(如骑士巡游和N皇后问题变体)
  • 双人游戏
    • 找出井字游戏、石头剪刀布、大师心眼的最优策略(待添加:四子棋?)
    • 找出零和双矩阵游戏的极小极大策略,等同于线性规划
    • 找出一般和游戏的纳什均衡(未解决,PPAD完全问题)
  • 数学和编程竞赛
    • 国际数学奥林匹克(IMO)题目
    • 国际大学生程序设计竞赛(ICPC)题目
    • 来自codeforces.com的竞赛编程题目
  • 图论算法谜题
    • 最短路径
    • 植入团(未解决)
  • 初等代数
    • 解方程
    • 解二次、三次和四次方程
  • 数论算法谜题:
    • 找出公约数(如使用欧几里得算法)
    • 因数分解(小因数容易,大数未解决,已颁发超过10万美元奖金)
    • 离散对数(一般情况未解决,某些情况容易)
    • 学习奇偶性(通常用高斯消元法解决)
    • 带噪声的奇偶性学习(未解决
  • 压缩
    • 给定解压缩算法(但不给压缩算法)压缩给定字符串,或仅给定压缩算法解压缩给定的压缩字符串
    • (待添加:计算霍夫曼树)
  • 困难数学问题
    • Conway的99图问题(未解决
    • 在Collatz过程中找到一个循环(未解决

训练-测试集划分

文件split.json包含一个建议的训练-测试集划分。这个划分是由熟悉所有谜题的谜题作者手动选择的,以确保两个集合中相关谜题之间的重叠最小。特别是,对于相关谜题对,要么两者都放在训练集中,要么都放在测试集中。

贡献

本项目欢迎贡献和建议。发挥你的创造力,帮助教AI编程!查看我们的如何添加谜题维基

大多数贡献要求你同意贡献者许可协议(CLA),声明你有权并确实授予我们使用你贡献的权利。详情请访问https://cla.opensource.microsoft.com。

当你提交拉取请求时,CLA机器人会自动确定你是否需要提供CLA,并相应地装饰PR(例如,状态检查、评论)。只需按照机器人提供的说明操作即可。你只需在所有使用我们CLA的仓库中执行一次此操作。

本项目采用了Microsoft开源行为准则。 有关更多信息,请参阅行为准则常见问题解答或联系opencode@microsoft.com提出任何其他问题或意见。

查看我们数据集的数据表

商标

本项目可能包含项目、产品或服务的商标或标志。Microsoft商标或标志的授权使用必须遵循Microsoft的商标和品牌指南。 在本项目的修改版本中使用Microsoft商标或标志不得引起混淆或暗示Microsoft赞助。 任何第三方商标或标志的使用均受该第三方的政策约束。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多