675. NeurIPS 2025 - Google Code Golf Championship | google-code-golf-2025
我们要感谢主办方和 Kaggle 团队组织了如此富有创意和启发性的比赛。
这是我们第一次接触代码高尔夫(Code Golf),通过这次激动人心的挑战,我们学到了很多。
团队成员: @chimaki821 @isakatsuyoshi @denden12 @hikari30 @kosirowada
目录:
由于大语言模型很难从头开始解决任务或从根本上改进算法,我们手动创建了许多“初始解决方案”。
在这个过程中,论坛上的讨论非常有帮助。特别是我们发布的两个讨论帖:
[2] 对角线扩展 (task034)
这两个帖子与许多参与者进行了富有成效的交流,我们能够 Incorporate 从中获得的见解。我们真诚地感谢每一位贡献者。
我们专注于通过仔细观察测试用例并利用网格中的结构模式来简化算法。
我们的主要策略如下:
any, all, zip, map, filter, 和 sum。list.index 或 enumerate 而不是手动的 range 循环。在手动解决任务时,我们注意到许多问题具有相似的结构。识别这些模式使我们能够将一个任务的成功策略应用到另一个任务。
感谢 @denden12 编译了总结所有任务的 PDF,使我们能够更容易地发现这种相似性。
例如:
由于这些问题几乎相同,我们将它们一起处理,并同时 aiming for 分数改进。
我们通过采用强大的人工编写的种子解决方案,然后使用像 GPT-5 Pro 这样的 AI 对其进行“后续代码高尔夫优化”,积累了大量分数。
我们采用这种工作流程有几个原因:
我们在提示词设计和系统级上下文构建上投入了大量精力。
关键思想是提供良好的示例和丰富的上下文,以便 LLM 能够学习如何有效地进行高尔夫优化。
这些结构化的提示词文件帮助模型理解问题格式和高尔夫策略的本质,从而产生 consistently 更好的代码压缩效果。
我们修改了官方评估脚本以更好地支持基于 LLM 的实验:
p=lambda g:type("",(),{"__eq__":lambda*_:1})()
(这是一个 46 字节的片段,可以在本地通过任何测试用例,但在排行榜上会失败)。
在收集了足够多的强初始解决方案后,我们自动化了这个过程:
对于每个任务,我们向模型提示:
使用 gpt-5, gpt-5-mini 和 grok-4,我们进行了迭代改进。
平均而言,gpt-5 每 50 个问题产生一次几字节的改进,gpt-5-mini 每 100 个问题产生一次。
我们的团队在整个比赛期间维护了两个同步的数据集:
每次更新或改进后,两个数据集都会通过后处理管道自动刷新。
我们开发了 23 个基于规则的 Notebook,每分钟自动顺序执行。
每个 Notebook 应用特定的转换以进一步缩短代码,同时保持正确性。
以下是使用的主要规则总结:
if True: 块并完全移除 if False: 块True/False 替换为 1/0len(x) == 0 替换为 not xx == False 替换为 not xx == True 替换为 xpass 语句return None → return;list() 调用l.append(x) 替换为 l += [x]from X import Y → from X import *range → R)print 语句这个自动化管道不断完善提交内容以接近最小字节数。
通过保持这些转换模块化和增量式,我们确保即使 minor 编辑也能安全地传播到最新代码版本。
除了基于规则的框架外,我们还使用 OpenAI API, Gemini API 和 Grok API 自动化了基于 AI 的后处理 Notebook。
这些 Notebook 定期执行,以执行更灵活、非基于规则的优化,并捕捉纯静态规则无法捕捉的改进。
我们使用 pysearch 应用了 targeted 转换。
通过指定期望的输入/输出对,pysearch 合成满足它们的最短逻辑,这改进了一些问题的分数。
示例:
对于 task144.py,我们需要 3*(x==y),其中 x∈[0,7] 且 y∈[0,2]。
pysearch 将其重写为 3>>x+y,节省了 2 个字节。
语法优化:考虑到 zlib/zopfli 压缩,我们有时故意增加原始字节数以获得更好的压缩分数。
例如,将 range 别名为 R=range 并使用 R() 可以减少原始字节,但不别名可能压缩得更好。
我们首先手动执行了一些此类转换,然后将它们转化为提示词示例,并使用 GPT-5 相应地修订代码。
变量名优化:基于 Garry Moss 的 Notebook compressed-variable-name-optimization,
我们加速并调整了搜索。
我们推迟了昂贵的正确性检查,首先计算压缩字节数以加快迭代,并在分数提高时重置试验计数器。
在实践中,我们首先运行感知压缩的重写,然后应用变量名优化,这产生了更好的整体压缩效率。