Euler问题11:网格中最大的积的一个尝试
"""
In the 20×20 grid below, four numbers along a diagonal line
have been marked in red.
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
What is the greatest product of four adjacent numbers in the
same direction (up, down, left, right, or diagonally) in the
20×20 grid?
"""
import numpy as np
grid = np.loadtxt("grid.txt")
all_products = []
def get_horizontal():
for i in range(20):
start, finish = 0, 4
while finish <= 20:
four_elements = grid[i, start:finish]
all_products.append(np.prod(four_elements))
start += 1
finish += 1
max_horizontal = max(all_products)
return max_horizontal
def get_vertical():
for i in range(20):
start, finish = 0, 4
while finish <= 20:
four_elements = grid[start:finish, i]
all_products.append(np.prod(four_elements))
start += 1
finish += 1
max_horizontal = max(all_products)
return max_horizontal
def get_right():
for i in range(-16, 16):
dgnl = np.diagonal(grid, i)
start, finish = 0, 4
while finish <= len(dgnl):
four_elements = dgnl[start:finish]
all_products.append(np.prod(four_elements))
start += 1
finish += 1
max_right = max(all_products)
return max_right
def get_left():
for i in range(-16, 16):
dgnl = np.diagonal(np.flipud(grid), i)
start, finish = 0, 4
while finish <= len(dgnl):
four_elements = dgnl[start:finish]
all_products.append(np.prod(four_elements))
start += 1
finish += 1
max_left = max(all_products)
return max_left
print(max(get_horizontal(), get_left(), get_right(), get_vertical()))嘿,我真的不太像一个程序员,我只是为了好玩而做这些挑战,我希望你们中的一些人对如何做这个挑战有一个想法,更简洁一点?我觉得我做了很多工作来解决这个问题。
发布于 2020-05-04 14:32:15
(免责声明-我也是这里的初学者,我很高兴读到你的评论。)
代码在方法get_horizontal、get_vertical、.
与此作斗争的一个想法是编写一个函数,得到起始位置、x轴dx中的差和y轴dy中的差(可能还有要乘的数字数--在本例中是4)。
这导致了另一个我们不想解决的问题。我们可以有另一个方法来返回您的索引是否总是留在网格中。
""" Solve Euler problem 11: https://projecteuler.net/problem=11 """
import numpy as np
def all_in_grid(start_x, start_y, dif_x, dif_y, numbers):
"""Check if all positions are in the grid."""
for i in range(numbers):
if not (
0 <= start_x + i*dif_x < GRID.shape[0]
and 0 <= start_y + i*dif_y < GRID.shape[1]
):
return False
return True
def product(start_x, start_y, dif_x, dif_y, numbers):
"""Return multiple of the numbers in the grid.
return GRID[start_x][start_y] * GRID[start_x+dif_x][start_y+dif_y]
* ... * GRID[start_x + (numbers-1)*dif_x][start_y + (numbers-1)*dif_y]
"""
prod = 1
for i in range(numbers):
prod *= GRID[start_x + (i*dif_x)][start_y + (i*dif_y)]
return prod
def max_in_direction(dif_x, dif_y, numbers=4):
"""Return maximum in the given direction."""
return max(
product(start_x=x, start_y=y, dif_x=dif_x, dif_y=dif_y, numbers=numbers)
for x in range(GRID.shape[0])
for y in range(GRID.shape[1])
if all_in_grid(start_x=x, start_y=y, dif_x=dif_x, dif_y=dif_y,
numbers=numbers)
)
GRID = np.loadtxt("grid.txt")
GRID = GRID.astype(int)
SOLUTION = max(
max_in_direction(1, 0),
max_in_direction(0, 1),
max_in_direction(1, 1),
max_in_direction(1, -1),
)
print(SOLUTION)将此解决方案转换为使用numpy产品而不是在python中循环的解决方案可能是个好主意。
https://codereview.stackexchange.com/questions/241468
复制相似问题