Questo è semplice ma interessante da programmare perché occorre stare bene attenti a tutti i casi possibili (righe, colonne, diagonali) e ai casi limite (siamo vicino a un bordo?).
M =
[08022297381500400075040507785212507791084949994017811857608717409843694804566200814931735579142993714067538830034913366552709523046011426924685601325671370236912231167151676389419236542240402866331380244732609903450244753353783684203517125032988128642367102638406759547066183864706726206802621220956394396308409166499421245558056673992697177878968314883489637221362309750076442045351400613397343133957817532822753167159403800462161409535692163905429635314755588824001754243629855786560048357189070544443744602158515417581980816805944769287392138652177704895540045208839735991607975732162626793327986688366887576220720346336746551232639353690442167338253911249472180846293240627636206936417230238834629969826759857404361620733529783190017431497148868116235705540170547183515469169233486143520189196748]
function maxp4_over_rows(M::Matrix; verbose=false)
cur_max = 0
R, C = size(M)
for i in1:R
for j in1:(C-3)
if prod(@view M[i,j:j+3]) > cur_max
cur_max = prod(@view M[i,j:j+3])
println("Lungo le righe: i=$i, j=$j, cur_max=$cur_max")
endendendreturn cur_max
endfunction maxp4_over_cols(M::Matrix; verbose=false)
cur_max = 0
R, C = size(M)
for j in1:C
for i in1:(R-3)
if prod(@view M[i:i+3,j]) > cur_max
cur_max = prod(@view M[i:i+3,j])
println("Lungo le colonne: i=$i, j=$j, cur_max=$cur_max")
endendendreturn cur_max
endfunction maxp4_over_diag(M::Matrix; verbose=false)
cur_max = 0
R, C = size(M)
# direzione ↘for i in1:(R-3)
for j in1:(C-3)
idxs = i .+ [0,1,2,3]
jdxs = j .+ [0,1,2,3]
# shortcut se carichiamo LinearAlgebra (using LinearAlgebra)# max_here = tr(M[idxs,jdxs]))
max_here = 1for k in1:4
max_here *= M[idxs[k],jdxs[k]]
endif max_here > cur_max
cur_max = max_here
println("Lungo le diagonali ↘: i=$i, j=$j, cur_max=$cur_max")
endendend# direzione ↙for i in1:(R-4)
for j in4:C
idxs = i .+ [0,1,2,3]
jdxs = j .- [0,1,2,3]
# shortcut se carichiamo LinearAlgebra (using LinearAlgebra)# max_here = tr(M[idxs,jdxs]))
max_here = 1for k in1:4
max_here *= M[idxs[k],jdxs[k]]
endif max_here > cur_max
cur_max = max_here
println("Lungo le diagonali ↙: i=$i, j=$j, cur_max=$cur_max")
endendendreturn cur_max
end@show maximum([maxp4_over_rows(M),maxp4_over_cols(M),maxp4_over_diag(M)])
Lungo le righe: i=1, j=1, cur_max=34144
Lungo le righe: i=1, j=2, cur_max=162184
Lungo le righe: i=1, j=3, cur_max=1216380
Lungo le righe: i=1, j=14, cur_max=2433600
Lungo le righe: i=1, j=16, cur_max=4204200
Lungo le righe: i=2, j=1, cur_max=9507960
Lungo le righe: i=2, j=12, cur_max=11630640
Lungo le righe: i=2, j=13, cur_max=13956768
Lungo le righe: i=3, j=9, cur_max=17696040
Lungo le righe: i=5, j=5, cur_max=19159119
Lungo le righe: i=5, j=7, cur_max=21149604
Lungo le righe: i=8, j=9, cur_max=21941010
Lungo le righe: i=8, j=16, cur_max=27663636
Lungo le righe: i=9, j=11, cur_max=48477312
Lungo le colonne: i=1, j=1, cur_max=1651104
Lungo le colonne: i=2, j=1, cur_max=4540536
Lungo le colonne: i=2, j=2, cur_max=5210170
Lungo le colonne: i=4, j=2, cur_max=9995020
Lungo le colonne: i=17, j=2, cur_max=14808780
Lungo le colonne: i=13, j=4, cur_max=23569344
Lungo le colonne: i=14, j=4, cur_max=35845044
Lungo le colonne: i=7, j=16, cur_max=51267216
Lungo le diagonali ↘: i=1, j=1, cur_max=279496
Lungo le diagonali ↘: i=1, j=3, cur_max=2904000
Lungo le diagonali ↘: i=1, j=8, cur_max=11587200
Lungo le diagonali ↘: i=2, j=1, cur_max=16194745
Lungo le diagonali ↘: i=3, j=2, cur_max=32719995
Lungo le diagonali ↘: i=17, j=10, cur_max=40304286
Lungo le diagonali ↙: i=2, j=13, cur_max=41076896
Lungo le diagonali ↙: i=13, j=7, cur_max=70600674
maximum([maxp4_over_rows(M), maxp4_over_cols(M), maxp4_over_diag(M)]) = 70600674