Pythonの3、270 262 260 251 246 226
(Sp3000に感謝します:
-~ の代わりに +1、最後の行の後 にスペースを失うことができますreturn 。
- 余計な括弧を失います
W*H。
- ラムダ...
- すべてを1行に配置します。
- python modulo
%は負の数に対して正の結果を与え、さらに20バイトを節約します)
これは、Python 3に移植された質問からのJavaScriptの回答例です。
あまりにも多くの関数引数を渡す必要を避けるために、2つのサポート関数を計算関数内に移動して、スコープを共有するようにしました。また、インデントのコストを回避するために、これらの各関数を1行にまとめました。
説明
このかなり強引なアプローチでは、最初のアイテムを(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])))