Неперекрывающаяся матричная сумма
Для заданных k массивов длины n выведите максимально возможную сумму, используя один элемент из каждого массива, чтобы не было двух элементов с одинаковым индексом. Гарантируется, что k <= n.
вход
Непустой список непустых массивов целых чисел.
Выход
Целое число, представляющее максимальную сумму.
Примеры
Input -> Output
[[1]] -> 1
[[1, 3], [1, 3]] -> 4
[[1, 4, 2], [5, 6, 1]] -> 9
[[-2, -21],[18, 2]] -> 0
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 15
[[1, 2, 3, 4], [5, 4, 3, 2], [6, 2, 7, 1]] -> 16
[[-2, -1], [-1, -2]] -> -2
code-golf
array-manipulation
Quintec
источник
источник
Ответы:
Желе ,
106 байтПопробуйте онлайн!
(4 байта, сохраненные @Dennis, который указал, что у Jelly была встроенная «сумма главной диагонали». Я не ожидал, что у него будет один из них; предыдущее решение реализовало операцию без использования встроенной функции.
Æṭ
, определяется как «трассировка», но трассировка определяется только для квадратных матриц; Jelly также осуществляет обобщение для прямоугольных матриц.)Улучшение по сравнению с другими ответами в основном за счет более простого (а значит, более выразительного) алгоритма; эта программа изначально была написана в Brachylog v2 (
{\p\iᶠ∋₎ᵐ+}ᶠot
), но у Jelly есть некоторые встроенные функции для частей программы, которые должны быть прописаны в Brachylog, так что это оказалось короче.объяснение
Должно быть ясно, что для любого решения проблемы мы можем переставить столбцы исходной матрицы, чтобы поместить это решение на основную диагональ. Таким образом, это решение просто переворачивает это, находя все возможные главные диагонали перестановок.
Обратите внимание, что операция «перестановка столбцов» выполняется как «транспонировать, переставлять строки», не заботясь о транспонировании назад; остальная часть алгоритма оказывается симметричной относительно главной диагонали, поэтому нам не нужно отменять транспонирование и, таким образом, можно сохранить байт.
источник
ZŒ!ÆṭṀ
сохраняет четыре байта. Попробуйте онлайн!ZŒ!ŒD§ṀḢ
прежде чем вспомнить, что этоÆṭ
была вещь.J , 28 байт
Попробуйте онлайн!
Здесь выполняется рекурсивный вызов,
$:
который представляет наибольшую анонимную функцию, содержащую ее. Нам повезло, что в J есть примитивx u\. y
, который применяетсяu
к последовательным «наложениям»,y
полученным путем подавления последовательных инфиксов длиныx
элементов вy
; здесь мы хотим превзойти последовательные столбцы, чтобы получить «миноры», поэтому мы транспонируем|:
нижние строки (или хвост}.
)y
, а затем возвращаемся к транспонированию их дополнений.источник
Python 3 ,
94 90 89 8480 байт-4 байта благодаря xnor (используя наборы вместо списков)!
Попробуйте онлайн!
источник
y
набор , чтобы сократить проверки членства:f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y)
.-1
трюк очень умный :) Большое спасибо!Шелуха ,
12 119 байтПопробуйте онлайн!
Спасибо BMO за предложение порта ответа ais523 и 2-байтового сохранения, которое мне удалось улучшить в дальнейшем, и, в свою очередь, BMO сбило еще 2 байта.
Предыдущее решение (14 байт)
Попробуйте онлайн!
Я не смог сделать тестовый набор, потому что этот ответ использует явно первую команду аргумента командной строки . Но Husk вообще не использует STDIN, поэтому я включил все тестовые примеры, так что вы можете просто скопировать вставить в поле аргумента, чтобы проверить его. Также обратите внимание, что массивы в Husk могут не содержать пробелов между элементами при вводе.
Как это работает?
Разбивка кода
пример
Нужно выбрать ровно один индекс из каждого так, чтобы никакие два индекса не соответствовали. Итак, мы генерируем диапазоны длин строк и оставляем только те, у которых нет дубликатов, получая следующие комбинации (каждая комбинация представляет собой столбец вместо строки для экономии места):
Затем программа индексирует во входных списках каждый элемент комбинации, возвращая:
источник
JavaScript (ES6),
7471 байтСпасибо @tsh за выявление 2 бесполезных байтов, которые были использованы для исправления ошибки.
Сохранено 3 байта благодаря @tsh
Попробуйте онлайн!
источник
0
из входного массива,-1+(-1)
это-2
и есть правильный ответ.f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0
Это странно, ноMath.max
сохраняет байты ...Желе ,
1312 байтПопробуйте онлайн!
Альтернативная версия, 11 байт
Это использует недавно добавленный
œ!
встроенная функция, которая генерирует все перестановки заданной длины.Попробуйте онлайн!
Как это работает
источник
XLṗL
вместоJ€Œp
.Haskell , 65 байт
Попробуйте онлайн!
Объяснение и Унгольфед
Функция
take i<>drop(i+1)
берет список и удаляет элемент в позицииi
.Функция
f
получает каждый возможный элементe
в позицииi
, удаляет элементы в позицииi
из оставшихся элементов и добавляетe
к рекурсивно вычисленному оптимуму:И базовый вариант для пустого списка просто
0
:источник
Брахилог , 18 байт
Попробуйте онлайн!
объяснение
источник
Perl 6 ,
5049 байтовПопробуйте онлайн!
Достойно короткий, даже несмотря на длинный
permutations
звонок. Это блок анонимного кода, который принимает список списков и возвращает число.Объяснение:
источник
К (ок) ,
40, 32, 28,19 байтов-13 байт благодаря ngn!
Попробуйте онлайн!
Начальное решение:
Попробуйте онлайн!
Примечание: не работает для первого теста [[1]]
Объяснение:
{ }
- функция с аргументомx
источник
prm
может быть применена непосредственно к списку для генерации его перестановок=
, но результат был длиннее. Есть лиflatten
в ОК?flatten
в каком смысле?(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
,/
или если вы хотите, чтобы это,//
Haskell , 65 байт
Попробуйте онлайн!
71 байт
Попробуйте онлайн!
В
[x|x<-a,y<-a,x==y]==a
проверяет , что элементыa
различны. Это использует удивительное количество символов, но я не видел более короткого пути.источник
Pyth,
1512 байтПопробуйте это онлайн здесь .
Редактировать: сохранено 3 байта предоставлено issacg
источник
.PUlhQl
можно заменить на.plh
.V
неявно игнорирует любые дополнительные записи.05AB1E ,
1813 байтУ меня такое ощущение, что он слишком длинный, но я не уверен, как эффективно выполнять векторизованное индексирование байтов в 05AB1E ..И я действительно был прав, что он был слишком длинным .. -5 байт благодаря @Emigna .Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Пример выполнения:
[[1,4,2],[5,6,1]]
нgL
):[1,2,3]
œ
):[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
ε‚
):[[[[1,4,2],[5,6,1]],[1,2,3]],[[[1,4,2],[5,6,1]],[1,3,2]],[[[1,4,2],[5,6,1]],[2,1,3]],[[[1,4,2],[5,6,1]],[2,3,1]],[[[1,4,2],[5,6,1]],[3,1,2]],[[[1,4,2],[5,6,1]],[3,2,1]]]
ø
):[[[[1,4,2],1],[[5,6,1],2]],[[[1,4,2],1],[[5,6,1],3]],[[[1,4,2],2],[[5,6,1],1]],[[[1,4,2],2],[[5,6,1],3]],[[[1,4,2],3],[[5,6,1],1]],[[[1,4,2],3],[[5,6,1],2]]]
ε`è]
):[[4,1],[4,5],[2,6],[2,5],[1,6],[1,1]]
(ПРИМЕЧАНИЕ: 05AB1E индексируется 0 (с автоматическим переносом), поэтому индексация3
в[5,6,1]
результаты5
.)O
):[5,9,8,7,7,2]
à
):9
источник
нgLœε‚øε
è] OZ` на 13 .Haskell, 84 байта
Попробуйте онлайн!
источник
Рубин ,
747269 байтПопробуйте онлайн!
источник
05AB1E , 7 байтов
Ответ от Jelly CW от @ ais523 , так что не забудьте также заявить об этом!
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник