Python 3中,270  262  260  251  246 226
(感谢Sp3000提供的:
- -~而不是- +1,这使我 在最后一行之后失去了一个空格- return。
- 在周围失去多余的括号 W*H。
- lambdas ...
- 将所有内容放在一起。
- python模%为负数提供正结果,以节省另外20个字节)
这是移植到Python 3中的问题的JavaScript示例答案。
为了避免传递太多的函数参数,我将两个支持函数移到了calculate函数内,以便它们共享其作用域。我还将这些功能中的每一个都压缩为一行,以避免缩进的成本。
说明
这种相当蛮力的方法将第一个项目放在(0,0),然后标记所有排除的正方形。然后,它将在所有剩余的有效正方形上递归放置一个项目,直到排除所有正方形为止,并返回所需的最小项目数。
高尔夫代码:
def C(W,H,R):r=range;M=lambda g:min([M(G(g,x,y))for x in r(W)for y in r(H)if g[x+W*y]]or[-1])+1;G=lambda g,x,y:[g[a+W*b]if min((x-a)%W,(a-x)%W)+min((y-b)%H,(b-y)%H)>R else 0for b in r(H)for a in r(W)];return-~M(G([1]*W*H,0,0))
取消程式码:
def calculate(W, H, R):
    starting_min = W * H + 1
    cells = [0] * (W * H)
    grid_state = grid_with_item_added(cells, 0, 0, W, H, R)
    return min_from_here(grid_state, starting_min, W, H, R) + 1
def min_from_here(grid_state, starting_min, W, H, R):
    no_cells = True
    min = starting_min
    for x in range(W):
        for y in range(H):
            if grid_state[x + W * y] == 0:
                no_cells = False
                new_grid_state = grid_with_item_added(grid_state, x, y, W, H, R)
                m = min_from_here(new_grid_state, starting_min, W, H, R)
                if m < min:
                    min = m
    if no_cells:
        return 0
    else:
        return min + 1
def grid_with_item_added(grid_state, x, y, W, H, R):
    grid = grid_state[:]
    for a in range(W):
        for b in range(H):
            if manhattan_distance(a, b, x, y, W, H) <= R:
                grid[a + W * b] = 1
    return grid
def manhattan_distance(a, b, c, d, W, H):
    horizontal = min(abs(W + c - a) % W, abs(W + a - c) % W)
    vertical = min(abs(H + d - b) % H, abs(H + b - d) % H)
    return horizontal + vertical
if __name__ == '__main__':
    import sys
    arguments = sys.argv[1:]
    if len(arguments) < 3:
        print('3 arguments required: width, height and radius')
    else:
        print(calculate(int(arguments[0]), int(arguments[1]), int(arguments[2])))
非高尔夫代码定义了一个函数,还包括允许从命令行调用它的代码。高尔夫球代码仅定义了功能,足以解决标准代码高尔夫球问题。
如果您想从命令行测试高尔夫代码,则此处包含命令行处理(但不是高尔夫):
命令行可测试的高尔夫代码
def C(W,H,R):r=range;M=lambda g:min([M(G(g,x,y))for x in r(W)for y in r(H)if g[x+W*y]]or[-1])+1;G=lambda g,x,y:[g[a+W*b]if min((x-a)%W,(a-x)%W)+min((y-b)%H,(b-y)%H)>R else 0for b in r(H)for a in r(W)];return-~M(G([1]*W*H,0,0))
if __name__ == '__main__':
    import sys
    arguments = sys.argv[1:]
    if len(arguments) < 3:
        print('3 arguments required: width, height and radius')
    else:
        print(C(int(arguments[0]), int(arguments[1]), int(arguments[2])))