找到最伟大的路线


14

您将得到一个由整数组成的二维数组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数组A,且X,Y>0。数组的每个元素都包含一个整数值,该值可以为正,零或负。如果愿意,您可以采用其他格式(例如一维数组列表)接受此数组。
  • 一个不大于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]]-> -54 + -7 + -2
凯文·克鲁伊森

@KevinCruijssen当然可以,添加
user2390246

1
顺便说一句:所有带有解释的答案都将对我有所帮助,但否则,我无法判断我不熟悉的语言(其中多数是这些语言)。
user2390246 '17

Answers:


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 '17

对于将来的用户(新用户):$从创建一个monad ZṚ,同时从其¥创建一个dyad,从其ZṚ返回应用于其左侧操作数的相同函数(旋转90 CCW)的结果。匹配模式+ ×并评估v+(λ×ρ)v = v , (M ZṚ¥ n)在这种情况下)。但是,仅使用$不起作用,因为+ F二进位链中没有模式。
user202729 '17

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少于NBlockMap且不支持填充的情况。
米沙·拉夫罗夫

1
对于TIO友好版本(Mathematica脚本模式):\[Transpose]可以将U + F3C7()字符键入为\:f3c7
user202729

3
我也相信这不是第一次Tr被用作跟踪。
user202729 '17

谢谢!而且,当我不夸张地说时,我肯定会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}。(无法打印的字样是U + F3C7 = \[Transpose];不过TIO似乎不喜欢这样。{Transpose@#|#2,Reverse@#|#2}):
JungHwan Min

@JungHwanMin不是TIO的错,TIO上的Mathematica在脚本模式下运行,仅支持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

Curry函数有两个参数,第一个是数字数组,第二个是数字。

多亏了Arnauld,节省了20多个字节。


1/s而不是s==s应该按预期工作。
Arnauld

摆脱两个评估:130个字节
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

请注意,此挑战与欧拉计划问题11基本相同

在线尝试!


1

Python 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)
  • 通过高尔夫保存7个字节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)和(i,j + 1)。测试用例的结果显示在TIO中。


我希望我错过了它,但是R似乎缺少计算方阵轨迹的基本函数。
NofP

还没有解决是否可以节省字节的问题,但是您可以使用sum(diag(m))进行跟踪
user2390246


0

JavaScript 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我删除了空格,但是增加了覆盖范围,总共增加了更多字符,但谢谢:)
DanielIndie17年

通过删除不必要的换行符G=来计算164个字节(不计)
Herman L

为什么用a||M,b||M,c||M,d||M代替a,b,c,d
赫尔曼L

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.