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


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 

Не могли бы вы добавить тестовый пример, в котором результат будет отрицательным? Лайк [[-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}]&


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


Некоторые оптимизации: 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

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

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


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.


Я надеюсь, что пропустил это, но 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)


@HermanLauenstein я удалил пробелы, но добавил больше освещения, которое добавило в целом больше символов, но
спасибо

164 байта , удаляя ненужные символы новой строки ( G=не учитывается)
Герман Л

Почему вы использовали a||M,b||M,c||M,d||Mвместо a,b,c,d?
Герман Л

@HermanLauenstein Math.max (NaN / не определено, 6) = NaN
DanielIndie

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.