Skip to content

Commit ef039b4

Browse files
authored
Merge pull request #240 from sir-gon/feature/problem11-refactor
[REFACTOR] problem0011 complexity reduced.
2 parents 56a7a44 + a5b9be1 commit ef039b4

File tree

1 file changed

+42
-57
lines changed

1 file changed

+42
-57
lines changed

src/projecteuler/problem0011.py

Lines changed: 42 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -8,72 +8,57 @@ def problem0011(_square_matrix: list[list[int]], _interval: int) -> int:
88

99
top = len(_square_matrix)
1010
result = 0
11-
acum = 0
1211

13-
for i in range(0, top):
12+
quadrant_size = _interval
13+
matrix_limit = len(_square_matrix) - (_interval - 1)
14+
15+
for i in range(0, matrix_limit):
1416
if top != len(_square_matrix[i]):
1517
raise AttributeError("Not a square matrix")
1618

17-
for j in range(0, top):
18-
logger.debug('i: %i, j: %i', i, j)
19-
20-
acum = 1
21-
22-
if i < top - (_interval - 1):
23-
logger.debug('---- VERTICAL ------------------------------------------')
24-
# vertical
25-
26-
for k in range(0, _interval):
27-
logger.debug(
28-
'row: i %i, column: %i, step %i => %i',
29-
i + k, j, k, _square_matrix[i + k][j]
30-
)
31-
32-
acum *= _square_matrix[i + k][j]
33-
34-
result = maximum(acum, result)
35-
36-
acum = 1
37-
if j < top - (_interval - 1):
38-
logger.debug('---- HORIZONTAL ----------------------------------------')
39-
# horizontal
40-
for k in range(0, _interval):
19+
for j in range(0, matrix_limit):
20+
logger.debug('start point => i: %i, j: %i', i, j)
21+
22+
# reset diagonals
23+
diag1_acum = 1
24+
diag2_acum = 1
25+
for k in range(0, quadrant_size):
26+
logger.debug(
27+
'diag1 coordinate: (i, j) = (%i, %i)',
28+
i + k,
29+
j + k
30+
)
31+
logger.debug(
32+
'diag2 coordinate: (i, j) = (%i, %i)',
33+
i + k,
34+
j + (quadrant_size - 1) - k
35+
)
36+
37+
diag1_acum *= _square_matrix[i + k][j + k]
38+
diag2_acum *= _square_matrix[i + k][j + (quadrant_size - 1) - k]
39+
result = maximum(diag1_acum, result)
40+
result = maximum(diag2_acum, result)
41+
42+
# reset lines
43+
vertical_acum = 1
44+
horizontal_acum = 1
45+
for t_l in range(0, quadrant_size):
4146
logger.debug(
42-
'row: i %i, column: %i, step %i => %i',
43-
i, j + k, k, _square_matrix[i][j + k]
44-
)
45-
acum *= _square_matrix[i][j + k]
46-
47-
result = maximum(acum, result)
48-
49-
acum = 1
50-
if i + (_interval - 1) < top and j + (_interval - 1) < top:
51-
# diagonal top left -> bottom right
52-
logger.debug('---- DIAG \\ ---------------------------------------------')
53-
for k in range(0, _interval):
54-
logger.debug(
55-
'row: i %i, column: %i, step %i => %i',
56-
i + k, j + k, k, _square_matrix[i + k][j + k]
47+
'vertical coordinate: (i, j) = (%i, %i)',
48+
i + k,
49+
j + t_l
5750
)
58-
acum *= _square_matrix[i + k][j + k]
59-
60-
result = maximum(acum, result)
61-
62-
acum = 1
63-
if i + (_interval - 1) < top and j + (_interval - 1) < top:
64-
# diagonal top rigth -> bottom left
65-
logger.debug('---- DIAG / ---------------------------------------------')
66-
for k in range(0, _interval):
6751
logger.debug(
68-
'row: i %i, column: %i, step %i => %i',
69-
i + k,
70-
j + (_interval - 1) - k,
71-
_interval,
72-
_square_matrix[i + k][j + (_interval - 1) - k]
52+
'horizontal coordinate: (i, j) = (%i, %i)',
53+
i,
54+
j + k
7355
)
74-
acum *= _square_matrix[i + k][j + (_interval - 1) - k]
7556

76-
result = maximum(acum, result)
57+
vertical_acum *= _square_matrix[i + k][j + t_l]
58+
horizontal_acum *= _square_matrix[i + t_l][j + k]
59+
60+
result = maximum(vertical_acum, result)
61+
result = maximum(horizontal_acum, result)
7762

7863
logger.info('Problem 0011 result: %i', result)
7964
return result

0 commit comments

Comments
 (0)