1 个不稳定版本
0.2.0 | 2018年11月11日 |
---|
#13 in #jam
31KB
922 行
LibCodeJam
Google Code Jam的辅助库,支持多种语言实现。
预览
假设有一个示例问题。输入文件是 T,测试用例的数量,然后是 T 行。每行包含 N,值的数量,然后是 N 个整数。输出应该是 T 行,格式为 "Case #x: y",其中 x 是测试用例编号,从 1 开始,y 是整数的总和。
在纯Python中,这看起来像
import sys
def tokens():
for line in sys.stdin:
for token in line.split():
yield int(token)
tokens = tokens()
num_cases = next(tokens)
for i in range(num_cases):
num_values = next(tokens)
values = [next(tokens) for _ in range(num_values)]
print("Case #{}: {}".format(i+1, sum(values)))
快速,但解决方案算法与输入解析和输出格式化混合在一起,看起来很丑陋。LibCodeJam以一种整洁的方式处理所有这些
from code_jam import *
@autosolve
@collects
def solve(N: int,
values: ('N', int)):
return sum(values)
@autosolve
装饰器设置解决方案函数。它自动设置文件解析和输出格式化。它读取第一个令牌,T,然后调用您的求解函数 T 次,并写入返回值。@collects
装饰器设置一些魔法令牌输入 - 它检查您的函数签名,并根据注解为您提供的函数提供令牌或令牌列表。这允许您只关注编写一个用于解决问题的函数。输入文件从 stdin 读取,解决方案写入 stdout。
一些编程竞赛有一些全局数据,在测试用例之间共享。@autosolve
还通过使用 @cases
内置求解辅助器处理这一点。例如,假设有一个问题,输入是一个包含值 T 和 X 的行。接下来的 T 行包含一个单独的整数 N。测试用例 n 的解决方案是 Nn + X。这是 LibCodeJam 的解决方案
from code_jam import *
@autosolve
@collects
def solve(T: int, X: int, tokens):
@cases(T)
@collects
def solve_case(N: int):
return N + X
# The `yield from` indicates to @autosolve that this function solves a whole problem, not a single test case.
yield from solve_case(tokens)
依赖项
~4.5MB
~84K SLoC