Tìm dòng lớn nhất


14

Bạn sẽ được cung cấp một mảng 2 chiều A gồm các số nguyên và độ dài N. Nhiệm vụ của bạn là tìm trong mảng đường thẳng (ngang, dọc hoặc chéo) của các phần tử N mang lại tổng tiền cao nhất và trả về tổng đó .

Thí dụ

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

Mảng này có 34 dòng hợp lệ, bao gồm

 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

Dòng tối đa là

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

Lưu ý: các dòng có thể không bao quanh các cạnh của mảng.

Đầu vào

  • AX theo Y 2-D mảng A, với X, Y> 0. Mỗi phần tử của mảng chứa một giá trị nguyên có thể là dương, bằng 0 hoặc âm. Bạn có thể chấp nhận mảng này ở định dạng thay thế (ví dụ: danh sách các mảng 1-D) nếu bạn muốn.
  • Một số nguyên N dương duy nhất, không lớn hơn max (X, Y).

Đầu ra

  • Một giá trị đại diện cho tổng dòng tối đa có thể được tìm thấy trong mảng. Lưu ý rằng bạn không cần cung cấp các yếu tố riêng lẻ của dòng đó hoặc vị trí của nó.

Các trường hợp thử nghiệm

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 

Bạn có thể thêm một trường hợp thử nghiệm trong đó đầu ra kết quả là âm tính? Thích [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5( 4 + -7 + -2)
Kevin Cruijssen

@KevinCruijssen Chắc chắn, đã thêm
user2390246

1
Nhân tiện: tất cả các câu trả lời với một lời giải thích sẽ nhận được sự ủng hộ từ tôi, nhưng nếu không thì tôi không có cách nào để đánh giá các ngôn ngữ mà tôi không quen thuộc (và đó là hầu hết trong số chúng).
dùng2390246

Câu trả lời:


10

Thạch , 15 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

,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.

Lạm dụng tuyệt vời ¥ở đó ...
Erik the Outgolfer 16/10/17

Đối với người dùng trong tương lai (mới): $tạo một đơn nguyên từ ZṚ, trong khi ¥tạo một dyad từ ZṚđó trả về kết quả của cùng một chức năng (xoay 90 CCW) được áp dụng trên toán hạng bên trái của nó. Mà phù hợp với mô hình + ×và đánh giá v+(λ×ρ)(đó là v = v , (M ZṚ¥ n)trong trường hợp này). Tuy nhiên, chỉ sử dụng $không hoạt động vì không có + Fmô hình trong chuỗi dyadic.
dùng202729

6

Ngôn ngữ Wolfram (Mathicala) , 73 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Lấy đầu tiên Nvà sau đó là ma trận Alàm đầu vào.

Join@@Partition[#2,{#,#},1,1,-∞]tìm thấy mọi thứ Nbằng Nhàm con của ma trận A, được đệm với -∞nơi cần thiết để đảm bảo rằng các dòng chạy ra khỏi lưới sẽ không chạy.

Đối với mỗi khối đó, chúng tôi tính toán Tr/@Join[#,#,{#,Reverse@#}]: dấu vết (tức là tổng) của mỗi hàng, dấu vết (tức là tổng) của từng cột, dấu vết ( thực sự là dấu vết, lần đầu tiên trong lịch sử chơi golf mã Mathicala) của khối và dấu vết của khối đảo ngược. #Transpose@#.

Sau đó, chúng tôi tìm thấy Maxtất cả những điều này.


Đối với hầu hết các đầu vào, 57 byte Max@BlockMap[Tr/@Join[#,#,{#,Reverse@#}]&,#2,{#,#},1]&cũng hoạt động. Nhưng chúng ta cần phải đệm -∞để xử lý các trường hợp Acó ít hơn Nhàng hoặc cột và BlockMapkhông hỗ trợ phần đệm.
Misha Lavrov

1
Đối với phiên bản thân thiện với TIO (chế độ tập lệnh Mathicala): Ký tự U + F3C7 ( \[Transpose]) có thể được nhập vào dưới dạng \:f3c7.
dùng202729

3
Ngoài ra tôi tin rằng đây không phải là lần đầu tiên Trđược sử dụng như dấu vết.
dùng202729

Cảm ơn! Và khi tôi không phóng đại, tôi chắc chắn sử dụngTr như dấu vết của ma trận đã xuất hiện trước đó, nhưng nó vẫn hiếm và đáng ngạc nhiên.
Misha Lavrov

3
Tôi biết tôi đã nói điều đó trước đây, nhưng mã không phải ASCII sẽ hoạt động tốt ngay bây giờ. Hãy thử trực tuyến!
Dennis

4

Toán học, 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}]&


Hãy thử trực tuyến!


Một số tối ưu hóa: Diagonal[s,#]đến s~Diagonal~#, và {{Transpose@#,#2},{Reverse@#,#2}}để {#|#2,Reverse@#|#2}. (Tuy nhiên, không thể in được là U + F3C7 = \[Transpose]; TIO dường như không thích điều này. Thay vào đó {Transpose@#|#2,Reverse@#|#2}:)
JungHwan Min

@JungHwanMin Không phải lỗi của TIO, Mathicala trên TIO được chạy ở chế độ tập lệnh, chỉ hỗ trợ ASCII. Bạn cần gõ \[Transpose]hoặc \:f3c7(ít nhất là cái sau ngắn hơn Thread@) Tuy nhiên nếu câu trả lời là Mathicala REPL (không phải tập lệnh Mathicala), bạn có thể giả sử giải pháp 3 byte.
dùng202729

@ user202729 Cảm ơn, không biết!
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

Hàm Curry có hai đối số, đầu tiên là một mảng các số, thứ hai là một số.

Nhờ Arnauld , lưu hơn 20 byte.


1/sthay vì s==slàm việc như mong đợi.
Arnauld

Loại bỏ cả hai eval: 130 byte
Arnauld

@Arnauld Cảm ơn. Và thay đổi (s=(g=...)(n))>m?s:mđể (g=...)(n)>m?g(n):mtiết kiệm 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

Yêu cầu đầu vào trong NA, ví dụ:

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

Mở rộng

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

Lưu ý rằng thách thức này về cơ bản giống như vấn đề Project Euler 11

Hãy thử trực tuyến!


1

Python 2 , 208 184 183 176 byte

  • Đã lưu 24 byte bằng cách sử dụng -float("inf") để biểu thị rằng dòng đã kiểm tra nằm ngoài ma trận thay vì tính tổng âm của tất cả các phần tử ma trận.
  • Đã lưu một byte bằng cách xác định R,L=range,lenđể rút ngắn các hàm dựng sẵn và sử dụng y in R(L(A))...R(L(A[y]))thay vì y,Y in e(A)...x,_ in e(Y).
  • Lưu Bảy byte bằng cách chơi golf float("inf")để 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

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến!

Một giải pháp đệ quy. Đối với mỗi phần tử (i, j) của ma trận, nó trả về giá trị cực đại giữa tổng dọc theo hàng, tổng dọc theo cột, tổng dọc theo đường chéo và kết quả của hàm được áp dụng cho (i + 1, j) và (i, j + 1). Kết quả cho các trường hợp thử nghiệm được hiển thị trong TIO.


Tôi hy vọng tôi đã bỏ lỡ nó, nhưng R dường như đang thiếu một hàm cơ sở để tính toán dấu vết của ma trận vuông.
NofP

Sẽ không hiệu quả nếu nó giúp bạn tiết kiệm byte, nhưng bạn có thể sử dụng tổng (diag (m)) cho dấu vết
user2390246


0

JavaScript 170 byte

Vẫn lau phần golf thêm 4 ký tự nữa vì tôi không quản lý trường hợp max là âm và N lớn hơn 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 tôi xóa các khoảng trắng nhưng đã thêm phạm vi bảo hiểm được thêm vào tổng số ký tự nhiều hơn, nhưng thx :)
DanielIndie

164 byte bằng cách xóa các dòng mới không cần thiết ( G=không được tính)
Herman L

Tại sao bạn sử dụng a||M,b||M,c||M,d||Mthay vì a,b,c,d?
Herman L

@HermanLauenstein Math.max (NaN / không xác định, 6) = NaN
DanielIndie

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.