ค้นหาบรรทัดที่ยิ่งใหญ่ที่สุด


14

คุณจะได้รับอาร์เรย์ 2 มิติ A ของจำนวนเต็มและความยาว N งานของคุณคือการค้นหาภายในอาร์เรย์เป็นเส้นตรง (แนวนอนแนวตั้งหรือแนวทะแยง) ขององค์ประกอบ N ที่ให้ผลรวมผลรวมสูงสุดและคืนค่าผลรวมนั้น .

ตัวอย่าง

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

อาร์เรย์นี้มี 34 บรรทัดที่ใช้ได้รวมถึง

 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

บรรทัดสูงสุดคือ

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

หมายเหตุ: บรรทัดอาจไม่ล้อมรอบขอบของอาร์เรย์

ปัจจัยการผลิต

  • AX by Y 2-D array A, พร้อมด้วย X, Y> 0 แต่ละองค์ประกอบของอาร์เรย์มีค่าจำนวนเต็มซึ่งอาจเป็นค่าบวกศูนย์หรือค่าลบ คุณอาจยอมรับอาร์เรย์นี้ในรูปแบบอื่น (เช่นรายการอาร์เรย์ 1-D) หากคุณต้องการ
  • เลขจำนวนเต็มบวก N ตัวเดียวไม่เกิน max (X, Y)

เอาท์พุต

  • ค่าเดียวที่แสดงถึงผลรวมบรรทัดสูงสุดที่สามารถพบได้ในอาร์เรย์ โปรดทราบว่าคุณไม่จำเป็นต้องระบุองค์ประกอบของบรรทัดนั้นหรือที่ที่มันอยู่

กรณีทดสอบ

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 

คุณสามารถเพิ่มกรณีทดสอบที่ผลลัพธ์เป็นลบได้หรือไม่? กด Like [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5( 4 + -7 + -2)
Kevin Cruijssen

@KevinCruijssen Sure ได้เพิ่ม
user2390246

1
โดยวิธีการ: คำตอบทั้งหมดที่มีคำอธิบายจะได้รับ upvote จากฉัน แต่อย่างอื่นฉันไม่มีวิธีการตัดสินภาษาที่ฉันไม่คุ้นเคย (และนั่นคือส่วนใหญ่)
user2390246

คำตอบ:


10

เยลลี่ 15 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

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

มีการละเมิดที่ดี¥...
Erik the Outgolfer

สำหรับผู้ใช้ในอนาคต (ใหม่): $สร้าง monad จากZṚในขณะที่¥สร้าง dyad ZṚซึ่งจะส่งคืนผลลัพธ์ของฟังก์ชันเดียวกัน (หมุน 90 CCW) ที่ใช้กับตัวถูกดำเนินการด้านซ้าย ซึ่งตรงกับรูปแบบ+ ×และประเมินผลv+(λ×ρ)(เป็นv = v , (M ZṚ¥ n)ในกรณีนี้) อย่างไรก็ตามการใช้เพียงอย่างเดียว$ไม่ได้ผลเพราะไม่มี+ Fลวดลายในสายโซ่ย้อม
user202729

6

ภาษา Wolfram (Mathematica) , 73 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

ใช้ค่าแรกNแล้วเมทริกซ์Aเป็นอินพุต

Join@@Partition[#2,{#,#},1,1,-∞]ค้นพบทุก ๆNโดยNเมทริกซ์ย่อยของเมทริกซ์Aเบาะด้วยใน-∞กรณีที่จำเป็นเพื่อให้แน่ใจว่าเส้นที่วิ่งออกจากกริดจะไม่ทำงาน

สำหรับแต่ละช่วงนั้นเราคำนวณ Tr/@Join[#,#,{#,Reverse@#}] : การติดตาม (เช่นผลรวม) ของแต่ละแถวการติดตาม (เช่นผลรวม) ของแต่ละคอลัมน์การติดตาม ( อันที่จริงการติดตามเป็นครั้งแรกในประวัติศาสตร์ของการตีกอล์ฟ Mathematica) ของบล็อก และร่องรอยของบล็อกกลับด้าน เป็น#Transpose@#

จากนั้นเราจะพบกับ Maxสิ่งเหล่านี้ทั้งหมด


สำหรับอินพุตส่วนใหญ่ 57- ไบต์Max@BlockMap[Tr/@Join[#,#,{#,Reverse@#}]&,#2,{#,#},1]&ก็ใช้งานได้เช่นกัน แต่เราจำเป็นต้องเสริมด้วย-∞เพื่อจัดการกับกรณีที่Aมีน้อยกว่าNแถวหรือคอลัมน์และBlockMapไม่รองรับการขยาย
Misha Lavrov

1
สำหรับรุ่น TIO ง่าย (โหมดสคริปต์มาติกา): ตัวอักษร U + F3C7 ( \[Transpose]) \:f3c7สามารถพิมพ์ลงในขณะที่
user202729

3
นอกจากนี้ฉันเชื่อว่าไม่ใช่ครั้งแรกที่Trใช้เป็นการติดตาม
user202729

ขอบคุณ! และเมื่อฉันไม่ได้พูดเกินจริงฉันแน่ใจว่าใช้Trเป็นร่องรอยของเมทริกซ์ได้เกิดขึ้นก่อน แต่ก็ยังหายากและน่าแปลกใจ
Misha Lavrov

3
ฉันรู้ว่าฉันเคยบอกว่าก่อนหน้านี้ แต่รหัสที่ไม่ใช่ ASCII ควรใช้ได้ในตอนนี้ ลองออนไลน์!
เดนนิส

4

Mathematica, 135 123 ไบต์

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


ลองออนไลน์!


บางเพิ่มประสิทธิภาพ: Diagonal[s,#]การs~Diagonal~#และการ{{Transpose@#,#2},{Reverse@#,#2}} {#|#2,Reverse@#|#2}(ใน unprintable เป็น U + F3C7 = \[Transpose]; TIO ดูเหมือนจะไม่เป็นเช่นนี้แม้ว่าทางเลือก:. {Transpose@#|#2,Reverse@#|#2})
จองฮวานนาที

@JungHwanMin มันไม่ใช่ความผิดของ TIO Mathematica บน TIO นั้นทำงานในโหมดสคริปต์ซึ่งรองรับเฉพาะ ASCII เท่านั้น คุณต้องพิมพ์\[Transpose]หรือ\:f3c7(อย่างน้อยหลังจะสั้นกว่าThread@) อย่างไรก็ตามหากคำตอบคือ Mathematica REPL (ไม่ใช่สคริปต์ Mathematica) คุณสามารถใช้วิธีแก้ปัญหาแบบ 3 ไบต์
user202729

@ user202729 ขอบคุณไม่ทราบ!
JungHwan Min


3

JavaScript, 151 129 ไบต์

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

ฟังก์ชั่นแกงใช้เวลาสองข้อโต้แย้งแรกคืออาร์เรย์ของตัวเลขจำนวนที่สองคือจำนวน

ขอบคุณArnauldประหยัดกว่า 20 ไบต์


1/sแทนที่จะs==sทำงานได้ตามที่คาดหวัง
Arnauld

กำจัด eval ทั้งสอง: 130 bytes
Arnauld

@ Arnauld ขอบคุณ และเปลี่ยน(s=(g=...)(n))>m?s:mเป็น(g=...)(n)>m?g(n):mบันทึก 1 ไบต์
tsh

2

Jq 1.5 , 211 ไบต์

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

คาดว่าอินพุทNและAเช่น:

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

ขยาย

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

หมายเหตุความท้าทายนี้เป็นเช่นเดียวกับปัญหา Project Euler 11

ลองออนไลน์!


1

Python 2 , 208 184 183 176 ไบต์

  • บันทึก 24 ไบต์โดยใช้-float("inf")เพื่อแสดงว่าบรรทัดที่ถูกตรวจสอบมาถึงนอกเมทริกซ์แทนที่จะคำนวณผลรวมเชิงลบขององค์ประกอบเมทริกซ์ทั้งหมด
  • ที่บันทึกไว้ไบต์โดยกำหนดR,L=range,lenที่จะลดลงในตัวฟังก์ชั่นและการใช้แทนy in R(L(A))...R(L(A[y]))y,Y in e(A)...x,_ in e(Y)
  • ที่บันทึกไว้เจ็ดไบต์โดยการเล่นกอล์ฟไป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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

โซลูชันแบบเรียกซ้ำ สำหรับแต่ละองค์ประกอบ (i, j) ของเมทริกซ์จะส่งคืนค่าสูงสุดระหว่างผลรวมตามแถวผลรวมของคอลัมน์ผลรวมตามแนวทแยงมุมทั้งสองและผลลัพธ์ของฟังก์ชันที่ใช้กับ (i + 1, j) และ (ฉัน j + 1) ผลลัพธ์สำหรับกรณีทดสอบแสดงอยู่ใน TIO


ฉันหวังว่าฉันจะพลาด แต่ R ดูเหมือนจะขาดฟังก์ชั่นพื้นฐานในการคำนวณหาร่องรอยของเมทริกซ์จตุรัส
NofP

ยังไม่ได้ผลถ้ามันช่วยให้คุณประหยัดไบต์ แต่คุณสามารถใช้ผลรวม (diag (m)) สำหรับการติดตาม
2390246


0

จาวาสคริปต์ 170 ไบต์

ยังคงเช็ดในส่วนกอล์ฟเพิ่มอีก 4 ตัวอักษรเพราะฉันไม่ได้จัดการกรณีที่ค่าสูงสุดเป็นค่าลบและ 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 ฉันลบช่องว่าง แต่เพิ่มความคุ้มครองมากขึ้นซึ่งเพิ่มเข้ามาในตัวอักษรอื่น ๆ ทั้งหมด แต่ขอบคุณ :)
DanielIndie

164 ไบต์โดยลบบรรทัดใหม่ที่ไม่จำเป็นออก ( G=ไม่นับ)
Herman L

คุณไม่ทำไมใช้a||M,b||M,c||M,d||Mแทนa,b,c,d?
เฮอร์แมน L

@HermanLauenstein Math.max (NaN / undefined, 6) = NaN
DanielIndie

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.