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 

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.

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.


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!


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

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.


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!


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

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.


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 :)


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)


@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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.