Encuentra la mejor línea

14

Se le dará una matriz A de números enteros en 2-D, y una longitud N. Su tarea es encontrar dentro de la matriz la línea recta (horizontal, vertical o diagonal) de N elementos que produce la suma total más alta, y devolver esa suma .

Ejemplo

 N = 3, A = 
 3    3    7    9    3
 2    2   10    4    1
 7    7    2    5    0
 2    1    4    1    3

Esta matriz tiene 34 líneas válidas, incluidas

 Vertical
 [3]   3    7    9    3
 [2]   2   10    4    1
 [7]   7    2    5    0
  2    1    4    1    3       [3,2,7] = 12
 Horizontal
  3    3    7    9    3
  2    2   10    4    1
  7    7   [2]  [5]  [0]
  2    1    4    1    3       [2,5,0] = 7
 Diagonal
  3    3   [7]   9    3
  2    2   10   [4]   1
  7    7    2    5   [0]
  2    1    4    1    3       [7,4,0] = 11

La línea máxima es

 3    3    7   [9]   3
 2    2  [10]   4    1
 7   [7]   2    5    0
 2    1    4    1    3        [7,10,9] = 26

Nota: las líneas pueden no ajustarse alrededor de los bordes de la matriz.

Entradas

  • AX por Y matriz 2D A, con X, Y> 0. Cada elemento de la matriz contiene un valor entero que puede ser positivo, cero o negativo. Puede aceptar esta matriz en un formato alternativo (por ejemplo, una lista de matrices 1-D) si lo desea.
  • Un solo entero positivo N, no mayor que max (X, Y).

Salida

  • Un valor único que representa la suma máxima de líneas que se puede encontrar en la matriz. Tenga en cuenta que no necesita proporcionar los elementos individuales de esa línea o dónde se encuentra.

Casos de prueba

N = 4, A = 
-88    4  -26   14  -90
-48   17  -45  -70   85
 22  -52   87  -23   22
-20  -68  -51  -61   41
Output = 58

N = 4, A =
 9    4   14    7
 6   15    1   12
 3   10    8   13
16    5   11    2
Output = 34

N = 1, A = 
 -2
Output = -2

N = 3, A =
1    2    3    4    5
Output = 12

N = 3, A = 
-10   -5    4
 -3    0   -7
-11   -3   -2
Output = -5 
usuario2390246
fuente
¿Podría agregar un caso de prueba donde la salida resultante es negativa? Me gusta [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5(4 + -7 + -2 )
Kevin Cruijssen
@KevinCruijssen Sure, agregado
usuario2390246
1
Por cierto: todas las respuestas con una explicación obtendrán un voto positivo de mí, pero de lo contrario no tengo forma de juzgar idiomas con los que no estoy familiarizado (y esa es la mayoría de ellos).
user2390246

Respuestas:

10

Jalea , 15 bytes

,ZṚ¥;ŒD$+⁹\€€FṀ

Pruébalo en línea!

Cómo funciona

,ZṚ¥;ŒD$+⁹\€€FṀ  Main link. Left argument: M (matrix). Right argument: n (integer)

 ZṚ¥             Zip/transpose and reverse M. This is equivalent to rotating M 90°
                 counterclockwise.
,                Pair M and the result to the right.
    ;ŒD$         Append the diagonals of both matrices to the pair.
        +⁹\€€    Take the sums of length n of each flat array.
             FṀ  Flatten and take the maximum.
Dennis
fuente
Buen abuso de ¥allí ...
Erik the Outgolfer
Para usuarios futuros (nuevos): $crea una mónada desde ZṚ, mientras que ¥crea una díada desde la ZṚcual devuelve el resultado de la misma función (girar 90 CCW) aplicada en su operando izquierdo. Que coincide con el patrón + ×y evalúa v+(λ×ρ)(es v = v , (M ZṚ¥ n)en este caso). Sin embargo, solo el uso $no funciona porque no hay un + Fpatrón en la cadena diádica.
user202729
6

Wolfram Language (Mathematica) , 73 bytes

Max[Tr/@Join[#,#,{#,Reverse@#}]&/@Join@@Partition[#2,{#,#},1,1,-∞]]&

Pruébalo en línea!

Cómo funciona

Primero toma Ny luego la matrizA como entrada.

Join@@Partition[#2,{#,#},1,1,-∞]Busca todos Npor Nsubmatriz de la matrizA , acolchado con-∞ cuando sea necesario para asegurar que las líneas corriendo de la rejilla será fuera de la carrera.

Para cada uno de esos bloques calculamos Tr/@Join[#,#,{#,Reverse@#}]: la traza (es decir, la suma) de cada fila, la traza (es decir, la suma) de cada columna, la traza (en realidad, la traza, por primera vez en la historia del golf de código de Mathematica) del bloque , y el rastro del bloque se invirtió. #es Transpose@#.

Luego encontramos el Maxde todos estos.

Misha Lavrov
fuente
Para la mayoría de las entradas, el byte de 57 Max@BlockMap[Tr/@Join[#,#,{#,Reverse@#}]&,#2,{#,#},1]&también funciona. Pero tenemos que rellenar -∞para manejar casos donde Atiene menos de Nfilas o columnas, y BlockMapno admite relleno.
Misha Lavrov
1
Para la versión compatible con TIO (modo de secuencia de comandos de Mathematica): el carácter U + F3C7 ( \[Transpose]) se puede escribir como \:f3c7.
user202729
3
También creo que no es la primera vez que Trse usa como rastro.
usuario202729
¡Gracias! Y cuando no estoy exagerando, estoy seguro de que lo he usado antes, Trya que el rastro de una matriz ha aparecido antes, pero aún es raro y sorprendente.
Misha Lavrov
3
Sé que lo he dicho antes, pero el código no ASCII debería funcionar bien ahora. Pruébalo en línea!
Dennis
4

Mathematica, 135 123 bytes

Max[(s=#;r=#2;Max[Tr/@Partition[#,r,1]&/@Join[s,s~Diagonal~#&/@Range[-(t=Tr[1^#&@@s])+2,t-1]]])&@@@{#|#2,Reverse@#|#2}]&


Pruébalo en línea!

J42161217
fuente
Algunas optimizaciones: Diagonal[s,#]to s~Diagonal~#y {{Transpose@#,#2},{Reverse@#,#2}}to {#|#2,Reverse@#|#2}. (El no imprimible es U + F3C7 = \[Transpose]; TIO no parece de este tipo, aunque alternativa:. {Transpose@#|#2,Reverse@#|#2})
JungHwan Min
@JungHwanMin No es culpa de TIO, Mathematica en TIO se ejecuta en modo script, que solo es compatible con ASCII. Debe escribir \[Transpose]o \:f3c7(al menos este último es más corto que Thread@) Sin embargo, si la respuesta es Mathematica REPL (no Mathematica script), puede asumir la solución de 3 bytes.
user202729
@ user202729 ¡Gracias, no lo sabía!
JungHwan Min
3

Jalea , 16 bytes

µ;Z;Uµ;ŒDðṡ€ẎS€Ṁ

Pruébalo en línea!

Hiperneutrino
fuente
Wow, nuestras soluciones son casi idénticas ... La mía fueµ;Z;UŒD$;ŒDṡ€⁴ẎS€Ṁ
Sr. Xcoder
@ Mr.Xcoder Oh wow genial: P
HyperNeutrino
3

JavaScript 151 129 bytes

a=>n=>a.map((l,x)=>l.map((v,y)=>[...'01235678'].map(d=>m=(g=i=>i--&&g(i)+(a[x+d%3*i-i]||[])[y+i*~-(d/3)])(n)>m?g(n):m)),m=-1/0)|m

La función Curry toma dos argumentos, el primero es un conjunto de números, el segundo es un número.

Gracias a Arnauld , ahorre más de 20 bytes.

tsh
fuente
1/sen lugar de s==sdebería funcionar como se esperaba.
Arnauld
Deshacerse de ambas evaluaciones: 130 bytes
Arnauld
@Arnauld Gracias. Y cambie (s=(g=...)(n))>m?s:mpara (g=...)(n)>m?g(n):mguardar 1 byte.
tsh
2

Jq 1.5 , 211 bytes

def R:reverse;def U:[range(length)as$j|.[$j][$j:]]|transpose|map(map(select(.))|select(length>=N));def D:U+([R[]|R]|U|map(R)[1:]);[A|.,transpose,D,(map(R)|D)|.[]|range(length-N+1)as$i|.[$i:$i+N]]|max_by(add)|add

Espera entrada Ny A, por ejemplo:

def N: 3;
def A: [
  [ 3, 3,  7, 9, 3 ],
  [ 2, 2, 10, 4, 1 ],
  [ 7, 7,  2, 5, 0 ],
  [ 2, 1,  4, 1, 3 ]
];

Expandido

def chunks:      .[] | range(length-N+1) as $i | .[$i:$i+N] ;
def flip:        [ reverse[] | reverse ] ;
def upperdiag:   [ range(length) as $j | .[$j][$j:] ] | transpose | map(map(select(.))|select(length>=N)) ;
def lowerdiag:   flip | upperdiag | map(reverse)[1:] ;
def diag:        upperdiag + lowerdiag ;
def allchunks:   A | ., transpose, diag, (map(reverse)|diag) | chunks ;

[allchunks]|max_by(add)|add

Tenga en cuenta que este desafío es básicamente el mismo que el problema 11 del Proyecto Euler

Pruébalo en línea!

jq170727
fuente
1

Python 2 , 208 184 183 176 bytes

  • Se guardaron 24 bytes al usar -float("inf")para representar que la línea marcada alcanzó fuera de la matriz en lugar de calcular la suma negativa de todos los elementos de la matriz.
  • Se guardó un byte definiendo R,L=range,lenpara acortar las funciones integradas y utilizando en y in R(L(A))...R(L(A[y]))lugar de y,Y in e(A)...x,_ in e(Y).
  • Ahorró siete bytes jugando float("inf")al golf 9e999.
lambda N,A:max(sum(A[y+q*j][x+p*j]if-1<x+p*j<L(A[y])>-1<y+q*j<L(A)else-9e999for j in R(N))for y in R(L(A))for x in R(L(A[y]))for p,q in[(1,0),(0,1),(1,1),(1,-1)]);R,L=range,len

Pruébalo en línea!

Explicación

lambda N,A:                                                                                                                                                       ;R,L=range,len # lambda function, golfed built-ins
           max(                                                                                                                                                  )               # return the maximum line sum
                                                                                          for y in R(L(A))                                                                       # loop through matrix rows
                                                                                                          for x in R(L(A[y]))                                                    # loop through matrix columns
                                                                                                                             for p,q in[(1,0),(0,1),(1,1),(1,-1)]                # loop through four directions; east, south, south-east, north-east
               sum(                                                                      )                                                                                       # matrix line sum
                                                                            for j in R(N)                                                                                        # loop through line indices
                                  if-1<x+p*j<L(A[y])>-1<y+q*j<L(A)                                                                                                               # coordinates inside the matrix?
                   A[y+q*j][x+p*j]                                                                                                                                               # true; look at the matrix element
                                                                  else-9e999                                                                                                     # false; this line cannot be counted, max(...) will not return this line
Jonathan Frech
fuente
1

R , 199 bytes

function(m,n,i=1,j=1){y=1:n-1
x=j-y;x[x<1]=NA
y=i-y;y[y<1]=NA
'if'(i>nrow(m)|j>ncol(m),NA,max(c(v(m[i,x]),v(m[y,j]),v(m[b(y,x)]),v(m[b(y,rev(x))]),f(m,n,i+1,j),f(m,n,i,j+1)), na.rm=T))}
v=sum
b=cbind

Pruébalo en línea!

Una solución recursiva. Para cada elemento (i, j) de la matriz, devuelve el máximo entre la suma a lo largo de la fila, la suma a lo largo de la columna, la suma a lo largo de cualquier diagonal y el resultado de la función aplicada a (i + 1, j) y (i, j + 1) Los resultados para los casos de prueba se muestran en el TIO.

NofP
fuente
Espero haberlo perdido, pero R parece carecer de una función base para calcular la traza de una matriz cuadrada.
NofP
No he resuelto si le ahorraría bytes, pero puede usar sum (diag (m)) para la traza
user2390246
1

Casco , 14 bytes

▲mΣṁX⁰ṁëIT∂(∂↔

Pruébalo en línea!

Gracias a los nuevos anti∂iagonals incorporados, esta es una respuesta bastante corta :)

León
fuente
0

JavaScript 170 bytes

Todavía wip en la parte de golf agregó 4 caracteres más porque no logré un caso donde el máximo es negativo y N es mayor que 1

M=-1e9
G=(A,N)=>eval(`for(y in m=M,A)
for(x in R=A[y])
{for(a=b=c=d=j=0;j<N;d+=Y[x-j++])
{a+=R[X=+x+j]
b+=(Y=A[+y+j]||[])[x]
c+=Y[X]}
m=Math.max(m,a||M,b||M,c||M,d||M)}`)

console.log(G([ [3,3,7,9,3],
 [2,2,10,4,1],
 [7,7,2,5,0],
 [2,1,4,1,3]],3)==26)
 
 console.log(G([[-88,4,-26,14,-90],
[-48,17,-45,-70,85],
[22,-52,87,-23,22],
[-20,-68,-51,-61,41]],4)==58)

console.log(G([[9,4,14,7],[6,15,1,12],[3,10,8,13],[16,5,11,2]],4)==34)

console.log(G([[-2]],1)==-2)
console.log(G([[1,2,3,4,5]],3) ==12)

DanielIndie
fuente
@HermanLauenstein eliminé los espacios pero agregué más cobertura, lo que agregó en total más caracteres, pero gracias :)
DanielIndie
164 bytes eliminando nuevas líneas innecesarias ( G=no se cuenta)
Herman L
¿Por qué usaste en a||M,b||M,c||M,d||Mlugar de a,b,c,d?
Herman L
@HermanLauenstein Math.max (NaN / undefined, 6) = NaN
DanielIndie
0

Python 2 , 222 218 bytes

n,a=input()
W=len(a[0]);Q=['']*W;R=range;a+=[Q]*n
for l in a:l+=Q
print max(sum(x)for y in[zip(*[(a[j][i+k],a[j+k][i],a[j+k][i+k],a[j+k][i+n+~k])for k in R(n)])for j in R(len(a)-n)for i in R(W)]for x in y if''not in x)

Pruébalo en línea!

TFeld
fuente
Posibles 219 bytes .
Jonathan Frech
Posibles 218 bytes .
Jonathan Frech