最高のラインを見つける


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配列A、X、Y>0。配列の各要素には、正、ゼロ、または負の整数値が含まれます。必要に応じて、この配列を別の形式(1-D配列のリストなど)で受け入れることもできます。
  • 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 Sure、追加
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.

¥そこの良い虐待...
エリックアウトゴルファー

将来(新規)ユーザーの場合:$からモナドZṚ¥作成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]&も動作します。しかし、行または列よりも少なく、パディングをサポートしない-∞ケースを処理するにANBlockMapパディングする必要があります。
ミシャラヴロフ

1
TIO対応バージョン(Mathematicaスクリプトモード)の場合:文字U + F3C7(\[Transpose])はとして入力できます\:f3c7
user202729

3
またTr、トレースとして使用されるのは初めてではないと思います。
user202729

ありがとう!そして、私が誇張していないときTrは、マトリックスの痕跡が以前に出てきたので必ず使用しますが、それはまだまれで驚くべきことです。
ミシャラヴロフ

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,#]to s~Diagonal~#、および{{Transpose@#,#2},{Reverse@#,#2}}to {#|#2,Reverse@#|#2}。(印刷不可はU + F3C7 = \[Transpose]です。ただし、TIOはこれを好まないようです。代替:{Transpose@#|#2,Reverse@#|#2}
ジョンファンミン

@JungHwanMin TIOのせいではありません。TIO上のMathematicaは、ASCIIのみをサポートするスクリプトモードで実行されます。あなたは入力する必要はあり\[Transpose]\:f3c7(少なくとも、後者はより短いThread@答えはMathematicaのREPL(ないMathematicaのスクリプト)である場合は、3バイトのソリューションを取ることができるが)。
user202729

@ user202729ありがとう、知らなかった!
ジョンファンミン


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

カレー関数は2つの引数を取ります。1つ目は数値の配列の配列、2つ目は数値です。

Arnauldのおかげで、20バイト以上節約できます。


1/s代わりにs==s期待どおりに動作するはずです。
アーナルド

両方の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

この課題は、プロジェクトオイラー問題11と基本的に同じです。

オンラインでお試しください!


1

パイソン2208の 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

JavaScript 170バイト

最大が負で、Nが1より大きい場合を管理しなかったため、ゴルフパーツでまだ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 iスペースを削除しますが、より多くの文字を追加したカバレッジを追加しましたが、thx :)
DanielIndie

不要な改行を削除して164バイトG=カウントされません)
ハーマン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.