Znajdź najlepszą linię

14

Otrzymasz 2-D tablicę A liczb całkowitych i długość N. Twoim zadaniem jest znalezienie w tablicy linii prostej (poziomej, pionowej lub ukośnej) N elementów, która daje najwyższą sumę całkowitą, i zwrócenie tej sumy .

Przykład

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

Ta tablica ma 34 poprawne linie, w tym

 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

Maksymalna linia to

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

Uwaga: linie mogą nie owijać się wokół krawędzi tablicy.

Wejścia

  • AX według Y 2-D tablica A, przy X, Y> 0. Każdy element tablicy zawiera wartość całkowitą, która może być dodatnia, zero lub ujemna. Możesz zaakceptować tę tablicę w alternatywnym formacie (np. Listę tablic 1-D), jeśli chcesz.
  • Pojedyncza dodatnia liczba całkowita N, nie większa niż max (X, Y).

Wynik

  • Pojedyncza wartość reprezentująca maksymalną sumę linii, którą można znaleźć w tablicy. Pamiętaj, że nie musisz podawać poszczególnych elementów tej linii ani jej lokalizacji.

Przypadki testowe

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 
użytkownik2390246
źródło
Czy możesz dodać przypadek testowy, w którym wynik jest ujemny? Jak [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5( 4 + -7 + -2)
Kevin Cruijssen
@KevinCruijssen Sure, dodano
2390246
1
Nawiasem mówiąc: wszystkie odpowiedzi z wyjaśnieniem otrzymają ode mnie opinię, ale poza tym nie mam możliwości oceny języków, których nie znam (a to większość z nich).
user2390246,

Odpowiedzi:

10

Galaretka , 15 bajtów

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

Wypróbuj online!

Jak to działa

,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
źródło
Niezłe nadużycie ¥...
Erik the Outgolfer
Dla przyszłych (nowych) użytkowników: $tworzy monadę ZṚ, podczas gdy ¥tworzy diadę, z ZṚktórej zwraca wynik tej samej funkcji (obrót o 90 CCW) zastosowanej na jej lewym operandzie. Który pasuje do wzorca + ×i oceń v+(λ×ρ)( v = v , (M ZṚ¥ n)w tym przypadku). Jednak samo użycie $nie działa, ponieważ nie ma + Fwzorca w łańcuchu diadadowym.
user202729,
6

Wolfram Language (Mathematica) , 73 bajty

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

Wypróbuj online!

Jak to działa

Najpierw pobiera Nmacierz, a następnie macierz A.

Join@@Partition[#2,{#,#},1,1,-∞]znajduje każdy Nwedług Npodmacierzy macierzy A, wypełniony w -∞razie potrzeby, aby upewnić się, że linie wychodzące z siatki nie będą działały.

Dla każdego z tych bloków obliczamy Tr/@Join[#,#,{#,Reverse@#}]: ślad (tj. Suma) każdego wiersza, ślad (tj. Suma) każdej kolumny, ślad ( właściwie ślad, po raz pierwszy w historii golfowego kodu Mathematica) bloku , a ślad bloku odwrócony. #jest Transpose@#.

Następnie znajdujemy Maxwszystkie z nich.

Misza Ławrow
źródło
W przypadku większości danych wejściowych Max@BlockMap[Tr/@Join[#,#,{#,Reverse@#}]&,#2,{#,#},1]&działa również 57 bajtów . Ale musimy uzupełnić, -∞aby obsłużyć przypadki, w których Ama mniej niż Nwiersze lub kolumny i BlockMapnie obsługuje wypełniania.
Misha Lavrov
1
Dla wersji przyjaznej dla TIO (tryb skryptowy Mathematica): Znak U + F3C7 ( \[Transpose]) można wpisać jako \:f3c7.
user202729,
3
Uważam też, że nie jest to pierwszy raz, gdy Trjest używany jako ślad.
user202729,
Dzięki! A kiedy nie przesadzam, z pewnością używam go Trjako śladu matrycy, ale wciąż jest to rzadkie i zaskakujące.
Misza Ławrow
3
Wiem, że już to mówiłem, ale kod spoza ASCII powinien teraz działać dobrze. Wypróbuj online!
Dennis
4

Mathematica, 135 123 bajtów

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


Wypróbuj online!

J42161217
źródło
Niektóre optymalizacje: Diagonal[s,#]do s~Diagonal~#i {{Transpose@#,#2},{Reverse@#,#2}}do {#|#2,Reverse@#|#2}. (Niezadrukowane wynosi U = + F3C7 \[Transpose]; TIO nie wydaje się tak, jakby alternatywna. {Transpose@#|#2,Reverse@#|#2})
JungHwan Min
@JungHwanMin To nie wina TIO, Mathematica na TIO działa w trybie skryptowym, który obsługuje tylko ASCII. Musisz wpisać \[Transpose]lub \:f3c7(przynajmniej ten drugi jest krótszy niż Thread@) Jednak jeśli odpowiedź brzmi Mathematica REPL (nie skrypt Mathematica), możesz założyć rozwiązanie 3-bajtowe.
user202729,
@ user202729 Dzięki, nie wiedziałem!
JungHwan Min.
3

Galaretka , 16 bajtów

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

Wypróbuj online!

HyperNeutrino
źródło
Wow, nasze rozwiązania są prawie identyczne ... Mój byłµ;Z;UŒD$;ŒDṡ€⁴ẎS€Ṁ
Mr. Xcoder
@ Mr.Xcoder Oh wow cool: P
HyperNeutrino
3

JavaScript, 151 129 bajtów

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

Funkcja Curry przyjmuje dwa argumenty, pierwszy to tablica tablic liczb, drugi to liczba.

Dzięki Arnauld zaoszczędź ponad 20 bajtów.

tsh
źródło
1/szamiast s==spowinien działać zgodnie z oczekiwaniami.
Arnauld
Pozbycie się obu eval: 130 bajtów
Arnauld
@Arnauld Thanks. I zmień, (s=(g=...)(n))>m?s:maby (g=...)(n)>m?g(n):mzapisać 1 bajt.
tsh
2

Jq 1,5 , 211 bajtów

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

Oczekuje danych wejściowych Ni Anp .:

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 ]
];

Rozszerzony

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

Zauważ, że to wyzwanie jest w zasadzie takie samo jak problem 11 z Project Euler

Wypróbuj online!

jq170727
źródło
1

Python 2 , 208 184 183 176 bajtów

  • Zaoszczędzono 24 bajty, używając -float("inf")do reprezentowania, że ​​zaznaczona linia dotarła poza macierz zamiast obliczać ujemną sumę wszystkich elementów macierzy.
  • Zapisano bajt poprzez zdefiniowanie R,L=range,lenskrócenia wbudowanych funkcji i użycie y in R(L(A))...R(L(A[y]))zamiast y,Y in e(A)...x,_ in e(Y).
  • Zaoszczędzono siedem bajtów, grając float("inf")w golfa 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

Wypróbuj online!

Wyjaśnienie

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
źródło
1

R , 199 bajtów

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

Wypróbuj online!

Rozwiązanie rekurencyjne. Dla każdego elementu (i, j) macierzy zwraca maksimum między sumą wzdłuż wiersza, sumą wzdłuż kolumny, sumą wzdłuż każdej przekątnej, a wynikiem funkcji zastosowanej do (i + 1, j) i (i, j + 1). Wyniki dla przypadków testowych są pokazane w TIO.

Nie dotyczy
źródło
Mam nadzieję, że mi tego brakowało, ale R wydaje się brakować funkcji podstawowej do obliczenia śladu macierzy kwadratowej.
NofP
Nie sprawdziłem, czy pozwoli ci to zaoszczędzić bajty, ale możesz użyć sumy (diag (m)) do śledzenia
2390246
1

Łuska , 14 bajtów

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

Wypróbuj online!

Dzięki nowym wbudowanym funkcjom antyagonalnym jest to dość krótka odpowiedź :)

Lew
źródło
0

JavaScript 170 bajtów

nadal wycieram w części golfowej dodano 4 dodatkowe znaki, ponieważ nie udało mi się zrobić przypadku, w którym maksimum jest ujemne, a N jest większe niż 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
źródło
@HermanLauenstein usunąłem spacje, ale dodałem więcej zasięgu, co w sumie dodało więcej znaków, ale dzięki :)
DanielIndie
164 bajty przez usunięcie niepotrzebnych znaków nowej linii ( G=nie jest liczony)
Herman L
Dlaczego użyłeś a||M,b||M,c||M,d||Mzamiast a,b,c,d?
Herman L
@HermanLauenstein Math.max (NaN / undefined, 6) = NaN
DanielIndie
0

Python 2 , 222 218 bajtów

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)

Wypróbuj online!

TFeld
źródło
Możliwe 219 bajtów .
Jonathan Frech
Możliwe 218 bajtów .
Jonathan Frech