Найдите самую большую линию

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. Каждый элемент массива содержит целочисленное значение, которое может быть положительным, нулевым или отрицательным. Вы можете принять этот массив в альтернативном формате (например, список 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 
user2390246
источник
Не могли бы вы добавить тестовый пример, в котором результат будет отрицательным? Лайк [[-10, -5, 4],[-3, 0, -7],[-11,-3,-2]]-> -5( 4 + -7 + -2)
Кевин Круйссен
@KevinCruijssen Конечно, добавлено
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
Для будущих (новых) пользователей: $создает монаду из ZṚ, в то время как ¥создает диаду, из ZṚкоторой возвращает результат той же функции (поворот на 90 против часовой стрелки), примененной к его левому операнду. Который соответствует шаблону + ×и оценивает v+(λ×ρ)(именно v = v , (M ZṚ¥ n)в этом случае). Однако просто использование $не работает, потому что + 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]&также работает. Но нам нужно дополнить его -∞для обработки случаев, когда в Aнем меньше Nстрок или столбцов, и BlockMapон не поддерживает заполнение.
Миша Лавров
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}]&


Попробуйте онлайн!

J42161217
источник
Некоторые оптимизации: Diagonal[s,#]до s~Diagonal~#и {{Transpose@#,#2},{Reverse@#,#2}}в {#|#2,Reverse@#|#2}. (Непечатаемая является U + F3C7 = \[Transpose]; TIO , кажется, не так, хотя альтернатива:. {Transpose@#|#2,Reverse@#|#2})
JungHwan Мин
@JungHwanMin Это не вина TIO, Mathematica на TIO работает в режиме сценария, который поддерживает только ASCII. Вам нужно ввести \[Transpose]или \:f3c7(по крайней мере, последний короче Thread@). Однако, если ответ - Mathematica REPL (не скрипт Mathematica), вы можете принять 3-байтовое решение.
user202729
@ user202729 Спасибо, не знал!
JungHwan Мин
3

Желе , 16 байт

µ;Z;Uµ;ŒDðṡ€ẎS€Ṁ

Попробуйте онлайн!

HyperNeutrino
источник
Вау, наши решения почти идентичны ... Мое былоµ;Z;UŒD$;ŒDṡ€⁴ẎS€Ṁ
г-н Xcoder
@ Mr.Xcoder Ого, круто: P
HyperNeutrino
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 принимает два аргумента, первый - массив массивов чисел, второй - число.

Благодаря Арно , сэкономьте 20+ байтов.

ТТГ
источник
1/sвместо s==sдолжен работать как положено.
Арно
Избавление от обоих Eval's: 130 байтов
Арно
@ Arnauld Спасибо. И изменить, (s=(g=...)(n))>m?s:mчтобы (g=...)(n)>m?g(n):mсохранить 1 байт.
17
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

Попробуйте онлайн!

jq170727
источник
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) матрицы он возвращает max между суммой по строке, суммой по столбцу, суммой по диагонали и результатом функции, примененной к (i + 1, j), и (I, J + 1). Результаты для тестовых случаев показаны в TIO.

NofP
источник
Я надеюсь, что пропустил это, но R, похоже, не хватает базовой функции для вычисления трассы квадратной матрицы.
NofP
Не удалось решить, сэкономит ли это вам байты, но вы можете использовать сумму (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)

DanielIndie
источник
@HermanLauenstein я удалил пробелы, но добавил больше освещения, которое добавило в целом больше символов, но
спасибо
164 байта , удаляя ненужные символы новой строки ( G=не учитывается)
Герман Л
Почему вы использовали a||M,b||M,c||M,d||Mвместо a,b,c,d?
Герман Л
@HermanLauenstein Math.max (NaN / не определено, 6) = NaN
DanielIndie
0

Python 2 , 222 218 байт

n,a=input()
W=len(a[0]);Q=['']*W;R=range;a+=[Q]*n
for l in a:l+=Q
print max(sum(x)for y in[zip(*[(a[j][i+k],a[j+k][i],a[j+k][i+k],a[j+k][i+n+~k])for k in R(n)])for j in R(len(a)-n)for i in R(W)]for x in y if''not in x)

Попробуйте онлайн!

TFeld
источник
Возможно 219 байт .
Джонатан Фрех
Возможно 218 байт .
Джонатан Фрех