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])))