가장 큰 줄 찾기


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

참고 : 선이 배열의 가장자리를 감싸지 않을 수 있습니다.

입력

  • X, Y> 0 인 Y에 의한 AX 2 차원 배열 A. 배열의 각 요소는 양수, 0 또는 음수 일 수있는 정수 값을 포함합니다. 원하는 경우이 배열을 다른 형식 (예 : 1D 배열 목록)으로 사용할 수 있습니다.
  • max (X, Y)보다 크지 않은 단일 양의 정수 N

산출

  • 배열에서 찾을 수있는 최대 선 합을 나타내는 단일 값입니다. 해당 라인의 개별 요소 나 위치를 제공 할 필요 는 없습니다 .

테스트 사례

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 

결과 출력이 음수 인 테스트 케이스를 추가 할 수 있습니까? 처럼 [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5( 4 + -7 + -2)
케빈 크루이 센

@KevinCruijssen Sure, added
user2390246

1
그건 그렇고 : 설명이있는 모든 대답은 나에게서 찬성을 얻지 만 그렇지 않으면 나는 익숙하지 않은 언어를 판단 할 수있는 방법이 없습니다 (그리고 대부분).
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.

¥거기에 좋은 학대 ...
Outgolfer Erik

향후 (신규) 사용자의 경우 : $에서 모나드 ZṚ¥생성 ZṚ하고 왼쪽 피연산자에 적용된 동일한 함수 (90 CCW 회전)의 결과를 리턴 하는 다이어 드 를 작성합니다 . 패턴 + ×과 일치 하고 평가합니다 v+(λ×ρ)( v = v , (M ZṚ¥ n)이 경우). 그러나 Dyadic 체인에 패턴 $이 없기 때문에 사용 이 작동하지 않습니다 + F.
user202729 년

6

Wolfram Language (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]&도 작동합니다. 그러나 행이나 열 보다 적고 패딩을 지원하지 않는 -∞경우를 처리 하기 위해 채울 필요가 있습니다. ANBlockMap
Misha Lavrov

1
TIO 친화적 인 버전 (Mathematica 스크립트 모드) : 문자 U + F3C7 ( \[Transpose]) 은로 입력 할 수 있습니다 \:f3c7.
user202729 년

3
또한 처음 Tr으로 추적으로 사용 되지 않는다고 생각합니다 .
user202729 년

감사! 그리고 과장하지 않을 때 Tr, 매트릭스의 흔적이 전에 나온 것처럼 사용 하지만, 여전히 드물고 놀라운 것입니다.
Misha Lavrov

3
이전에 말했지만 ASCII가 아닌 코드는 이제 제대로 작동합니다. 온라인으로 사용해보십시오!
Dennis

4

매스 매 티카, 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,#]to s~Diagonal~#{{Transpose@#,#2},{Reverse@#,#2}}to {#|#2,Reverse@#|#2}. (인쇄 할 수없는이 U + F3C7은 =이다 \[Transpose],하지만 TIO,이 같은하지 않는 것 대안 :. {Transpose@#|#2,Reverse@#|#2})
JungHwan 분은

@JungHwanMin TIO의 잘못이 아닙니다. TIO의 Mathematica는 ASCII 만 지원하는 스크립트 모드에서 실행됩니다. 입력해야 \[Transpose]하거나 \:f3c7(적어도 후자는보다 짧습니다 Thread@) 답변이 Mathematica REPL (Mathematica 스크립트 아님) 인 경우 3 바이트 솔루션을 가정 할 수 있습니다.
user202729 년

@ user202729 감사합니다, 몰랐습니다!
JungHwan Min


3

자바 스크립트, 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 바이트
Arnauld

@Arnauld 감사합니다. 그리고 1 바이트 (s=(g=...)(n))>m?s:m(g=...)(n)>m?g(n):m저장 하도록 변경하십시오 .
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

파이썬 (2) , 208 (184) 183 176 바이트

  • -float("inf")모든 행렬 요소의 음수 합계를 계산하는 대신 확인 된 행이 행렬 외부에 도달했음을 나타 내기 위해 24 바이트를 절약 했습니다.
  • R,L=range,len내장 함수를 단축하고 y in R(L(A))...R(L(A[y]))대신을 사용하여 바이트를 저장했습니다 y,Y in e(A)...x,_ in e(Y).
  • 에 골프 float("inf")를 치고 7 바이트를 절약 했습니다 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)에 적용된 함수의 결과 사이의 최대 값을 반환합니다. (i, j + 1). 테스트 사례에 대한 결과는 TIO에 표시됩니다.


나는 그것을 놓쳤기를 희망하지만 R에는 사각형 행렬의 흔적을 계산하는 기본 함수가없는 것 같습니다.
NofP

바이트를 절약 할 수는
없었지만


0

자바 스크립트 170 바이트

최대 부분이 음수이고 N이 1보다 큰 경우를 관리하지 않았기 때문에 여전히 골프 부분에서 wip에 4 문자를 더 추가했습니다.

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 나는 공백을 제거하지만 더 많은 문자를 추가하지만 더 많은 커버리지를 추가했지만 thx :)
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 2009 년

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.