#jam #solver #helper #google #language #implemented #case

nightly libcodejam

构建Google Code Jam求解器的框架

1 个不稳定版本

0.2.0 2018年11月11日

#13 in #jam

GPL-3.0 许可证

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 内置求解辅助器处理这一点。例如,假设有一个问题,输入是一个包含值 TX 的行。接下来的 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