Así que hice esto de una manera extraña. Noté que había dos patrones en la forma en que se forma la matriz.
El primero es cómo el patrón de las filas superiores tiene la diferencia entre cada término que aumenta de 1 -> h donde h es la altura y l es la longitud. Así que construyo la fila superior en función de ese patrón
Para una matriz de dim (3,4) dando un max RoC = 3
Veremos la fila superior del formulario
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
Supongamos, en cambio, que el dim (3,9) que da un max RoC = 3
a veremos una fila superior de
`1, (1+1), (2+2), (4+3), (7+3), (10+3), (13+3), (16+3), (19+3) = 1, 2, 4, 7, 10, 13, 16, 19, 22
El segundo patrón es cómo cambian las filas entre sí. Si consideramos la matriz:
1 2 4 7 11
3 5 8 12 16
6 9 13 17 20
10 14 18 21 23
15 19 22 24 25
y restamos cada fila de la fila de abajo (ignorando la fila adicional) obtenemos
2 3 4 5 5
3 4 5 5 4
4 5 5 4 3
5 5 4 3 2
Al ver esta matriz, podemos notar que esta matriz es la secuencia 2 3 4 5 5 4 3 2
donde por cada fila hay 5 términos de este patrón desplazados por 1 para cada fila. Ver abajo para visual.
|2 3 4 5 5| 4 3 2
2 |3 4 5 5 4| 3 2
2 3 |4 5 5 4 3| 2
2 3 4 |5 5 4 3 2|
Entonces, para obtener la matriz final, tomamos nuestra primera fila que creamos y sacamos esa fila agregada con los 5 términos necesarios de este patrón.
Este patrón siempre tendrá las características de principio 2-> max value
y fin max value -> 2
donde max value = min(h+1, l)
el número máximo de veces que aparecerá el valor máximo es appearances of max = h + l -2*c -2
dondec = min(h+1, l) - 2
Entonces, en general, mi método de crear nuevas filas se ve como
1 2 3 7 11 + |2 3 4 5 5|4 3 2 = 3 5 8 12 16
3 5 8 12 16 + 2|3 4 5 5 4|3 4 2 = 6 9 13 17 20
6 9 13 17 20 + 2 3|4 5 5 4 3|4 2 = 10 14 18 21 23
10 14 18 21 23 + 2 3 4|5 5 4 3 2| = 15 19 22 24 25
Código relevante a continuación. No terminó siendo corto pero todavía me gusta el método.
o,r=len,range
def m(l,h):
a,t=[1+sum(([0]+[x for x in r(1,h)]+[h]*(l-h))[:x+1]) for x in r(l)],min(l,h+1);s,c=[x for x in r(2,t)],[a[:]]
for i in r(h-1):
for j in r(o(a)):
a[j]+=(s+[t]*(l+h-2*(t-2)-2)+s[::-1])[0+i:l+i][j]
c+=[a[:]]
for l in c:print(l)
Pruébalo en línea!