私はプロジェクトオイラーの問題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)