6

私はプロジェクトオイラーの問題11の解決策を単純化しようとしています(20x20グリッドで4列の数値の最大の積を見つけます)。

私の答えに対する私の主な不満は、sub_lists_at_xyの定義にある4つのtry/except句です。ボードから外れる可能性のある4列のリストの各方向(東、南、南東、南西)に1つずつあります。この実装を単純化または乾燥させるための提案はありますか?

from operator import mul

with open("11.txt") as f:
    nums = [[int(num) for num in line.split(' ')] for line in f.read().split('\n')]

def prod(lst):
    return reduce(mul, lst, 1)

def sub_lists_at_xy(array, length, x, y):

    try:
        east=array[y][x:x+length]
    except IndexError:
        east=[0]*length

    try:
        south=[list[x] for list in array[y:y+length]] 
    except IndexError:
        south=[0]*length

    try:
        southeast=[array[y+i][x+i] for i in range(length)]
    except IndexError:
        southeast=[0]*length

    try:
        southwest=[array[y+i][x-i] for i in range(length)]
    except IndexError:
        southwest=[0]*length    

    return east, south, southeast, southwest

sub_lists=[]

for x in range(len(nums[0])):
    for y in range(len(nums)):
        sub_lists += sub_lists_at_xy(nums, 4, x, y)
best = max(prod(lst) for lst in sub_lists)
print(best)
4

2 に答える 2

3

do n't-repeat-yourselfのルールに従うために、方向ロジックを引き出すことができます。

def sub_lists_at_xy(array, length, x, y):
    directions = [(1, 0), (0, 1), (1, 1), (-1, 1)]
    sublists = []
    for dx, dy in directions:
        try:
            seq = [array[y+dy*i][x+dx*i] for i in range(length)]
            sublists.append(seq)
        except IndexError:
            pass
    return sublists

あなたは私が道順を間違えなかったことを確認したいかもしれません-私は通常至る所でサインエラーをします-しかしあなたは考えを理解します。

[注:これは私自身が行う方法ではありませんが、コードを単純化する方法です。]

于 2012-07-28T00:35:24.423 に答える
2

入力を確認することもできますが、配列を埋めることもできます

with open("11.txt") as f:
    nums = [["X"] + [int(num) for num in line.split(' ')] + ["X"] for line in f.read().split('\n')]
    nums = ["X"]*(len(nums[0])+2) + nums + ["X"]*(len(nums[0])+2)

その後、データをフィルタリングできます

reduce(mul, [x for x in lst if x != "X"], 1)
于 2012-07-28T00:15:10.953 に答える