Temukan garis terbesar

14

Anda akan diberi array 2-D dari bilangan bulat, dan panjang N. Tugas Anda adalah menemukan di dalam array garis lurus (horizontal, vertikal atau diagonal) elemen N yang menghasilkan jumlah total tertinggi, dan mengembalikan jumlah itu .

Contoh

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

Array ini memiliki 34 baris yang valid, termasuk

 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

Garis maksimumnya adalah

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

Catatan: garis mungkin tidak membungkus tepi array.

Input

  • AX oleh Y 2-D array A, dengan X, Y> 0. Setiap elemen array berisi nilai integer yang mungkin positif, nol atau negatif. Anda dapat menerima array ini dalam format alternatif (mis. Daftar array 1-D) jika diinginkan.
  • Satu, bilangan bulat positif N, tidak lebih besar dari maks (X, Y).

Keluaran

  • Nilai tunggal yang mewakili jumlah baris maksimal yang dapat ditemukan dalam array. Perhatikan bahwa Anda tidak perlu memberikan elemen individual dari garis itu atau di mana letaknya.

Uji kasus

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 
pengguna2390246
sumber
Bisakah Anda menambahkan test case di mana output yang dihasilkan negatif? Seperti [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5( 4 + -7 + -2)
Kevin Cruijssen
@KevinCruijssen Sure, ditambahkan
user2390246
1
Ngomong-ngomong: semua jawaban dengan penjelasan akan mendapatkan suara positif dari saya, tetapi sebaliknya saya tidak memiliki cara menilai bahasa yang saya tidak kenal (dan itu kebanyakan dari mereka).
user2390246

Jawaban:

10

Jelly , 15 byte

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

Cobalah online!

Bagaimana itu bekerja

,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
sumber
Penyalahgunaan yang bagus di ¥sana ...
Erik the Outgolfer
Untuk pengguna (baru) di masa depan: $membuat monad dari ZṚ, sementara ¥membuat angka dua dari ZṚmana mengembalikan hasil dari fungsi yang sama (putar 90 CCW) yang diterapkan pada operan kirinya. Yang cocok dengan pola + ×dan evaluasi v+(λ×ρ)( v = v , (M ZṚ¥ n)dalam hal ini). Namun hanya menggunakan $tidak berfungsi karena tidak ada + Fpola dalam rantai diad.
user202729
6

Bahasa Wolfram (Mathematica) , 73 byte

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

Cobalah online!

Bagaimana itu bekerja

Mengambil pertama Ndan kemudian matriks Asebagai input.

Join@@Partition[#2,{#,#},1,1,-∞]menemukan setiap Ndengan Nsubmatrix dari matriks A, diisi dengan di -∞mana diperlukan untuk memastikan bahwa garis-garis yang keluar dari grid akan keluar dari berjalan.

Untuk setiap blok yang kami hitung Tr/@Join[#,#,{#,Reverse@#}]: jejak (yaitu jumlah) dari setiap baris, jejak (yaitu jumlah) dari setiap kolom, jejak ( sebenarnya jejak, untuk pertama kalinya dalam sejarah golf kode Mathematica) dari blok , dan jejak blok dibalik. #adalah Transpose@#.

Kemudian kita temukan Maxsemua ini.

Misha Lavrov
sumber
Untuk sebagian besar input, 57-byte Max@BlockMap[Tr/@Join[#,#,{#,Reverse@#}]&,#2,{#,#},1]&juga berfungsi. Tapi kita perlu pad dengan -∞untuk menangani kasus-kasus di mana Amemiliki lebih sedikit dari Nbaris atau kolom, dan BlockMaptidak mendukung padding.
Misha Lavrov
1
Untuk versi ramah TIO (mode skrip Mathematica): Karakter U + F3C7 ( \[Transpose]) dapat diketikkan sebagai \:f3c7.
user202729
3
Saya juga percaya ini bukan pertama kalinya Trdigunakan sebagai jejak.
user202729
Terima kasih! Dan ketika saya tidak melebih-lebihkan, saya yakin menggunakan Trjejak matriks telah muncul sebelumnya, tapi itu masih jarang dan mengejutkan.
Misha Lavrov
3
Saya tahu saya sudah mengatakan itu sebelumnya, tetapi kode non-ASCII seharusnya berfungsi dengan baik sekarang. Cobalah online!
Dennis
4

Mathematica, 135 123 byte

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


Cobalah online!

J42161217
sumber
Beberapa optimasi: Diagonal[s,#]ke s~Diagonal~#, dan {{Transpose@#,#2},{Reverse@#,#2}}ke {#|#2,Reverse@#|#2}. (The tak patut ditulis adalah U + F3C7 = \[Transpose]; TIO tampaknya tidak seperti ini, meskipun Alternatif:. {Transpose@#|#2,Reverse@#|#2})
JungHwan Min
@JungHwanMin Ini bukan kesalahan TIO, Mathematica on TIO dijalankan dalam mode skrip, yang hanya mendukung ASCII. Anda perlu mengetik \[Transpose]atau \:f3c7(setidaknya yang terakhir lebih pendek dari Thread@) Namun jika jawabannya adalah Mathematica REPL (bukan script Mathematica), Anda dapat mengasumsikan solusi 3-byte.
user202729
@ user202729 Terima kasih, tidak tahu!
JungHwan Min
3

Jelly , 16 byte

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

Cobalah online!

HyperNeutrino
sumber
Wow solusi kami hampir identik ... Tambang duluµ;Z;UŒD$;ŒDṡ€⁴ẎS€Ṁ
Tn. Xcoder
@ Mr.Xcoder Oh wow, keren: P
HyperNeutrino
3

JavaScript, 151 129 byte

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

Fungsi kari mengambil dua argumen, yang pertama adalah array dari array angka, yang kedua adalah angka.

Berkat Arnauld , hemat 20+ byte.

tsh
sumber
1/sbukannya s==sharus bekerja seperti yang diharapkan.
Arnauld
Menyingkirkan kedua eval: 130 bytes
Arnauld
@Arnauld Terima kasih. Dan ubah (s=(g=...)(n))>m?s:muntuk (g=...)(n)>m?g(n):mmenghemat 1 byte.
tsh
2

Jq 1,5 , 211 byte

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

Diharapkan input dalam Ndan A, misalnya:

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

Diperluas

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

Perhatikan bahwa tantangan ini pada dasarnya sama dengan masalah Project Euler 11

Cobalah online!

jq170727
sumber
1

Python 2 , 208 184 183 176 byte

  • Disimpan 24 byte dengan menggunakan -float("inf")untuk menyatakan bahwa garis yang diperiksa mencapai di luar matriks daripada menghitung jumlah negatif dari semua elemen matriks.
  • Menyimpan byte dengan mendefinisikan R,L=range,lenuntuk mempersingkat fungsi bawaan dan menggunakan y in R(L(A))...R(L(A[y]))alih-alih y,Y in e(A)...x,_ in e(Y).
  • Disimpan tujuh byte oleh golf float("inf")ke 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

Cobalah online!

Penjelasan

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
sumber
1

R , 199 byte

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

Cobalah online!

Solusi rekursif. Untuk setiap elemen (i, j) dari matriks mengembalikan max antara jumlah di sepanjang baris, jumlah di sepanjang kolom, jumlah di sepanjang diagonal, dan hasil dari fungsi yang diterapkan ke (i + 1, j) dan (i, j +1). Hasil untuk kasus uji ditunjukkan dalam TIO.

NofP
sumber
Saya harap saya melewatkannya, tetapi R tampaknya tidak memiliki fungsi dasar untuk menghitung jejak matriks persegi.
NofP
Belum berhasil jika itu akan menghemat byte, tetapi Anda dapat menggunakan jumlah (diag (m)) untuk melacak
user2390246
1

Sekam , 14 byte

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

Cobalah online!

Berkat anti∂iagonals baru yang dibangun di sini, ini adalah jawaban yang cukup singkat :)

Leo
sumber
0

JavaScript 170 byte

masih mengusap bagian golf menambahkan 4 karakter lagi karena saya tidak mengelola kasus di mana maks adalah negatif dan N lebih besar dari 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
sumber
@HermanLauenstein saya menghapus spasi tetapi menambahkan lebih banyak cakupan yang menambahkan total lebih banyak karakter, tetapi thx :)
DanielIndie
164 byte dengan menghapus baris baru yang tidak perlu ( G=tidak dihitung)
Herman L
Kenapa Anda menggunakan a||M,b||M,c||M,d||Mbukan a,b,c,d?
Herman L
@HermanLauenstein Math.max (NaN / tidak ditentukan, 6) = NaN
DanielIndie
0

Python 2 , 222 218 byte

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)

Cobalah online!

TFeld
sumber
Kemungkinan 219 byte .
Jonathan Frech
Kemungkinan 218 byte .
Jonathan Frech