Введение:
Вдохновленные этими двумя SO-вопросами (без сомнения, из одного и того же класса): выведите элементы в подмассиве максимальной суммы без смежных элементов java и максимальной суммы несмежных элементов массива, которые будут напечатаны .
Вызов:
Учитывая список целых чисел, выведите подпоследовательность, состоящую из несмежных элементов, которые имеют наибольшую сумму. Вот несколько примеров:
[1,2,3,-1,-3,2,5]
приведет к[1,3,5]
(с суммой9
) на основе индексов 0[0,2,6]
.[4,5,4,3]
приведет к либо[4,4]
(с суммой8
) в индексах на основе 0,[0,2]
либо[5,3]
(также с суммой8
) в индексах на основе 0[1,3]
.[5,5,10,100,10,5]
приведет к[5,100,5]
(с суммой110
) либо на основе индексов 0[0,3,5]
или[1,3,5]
.
Что наиболее важно в приведенных выше примерах, индексы, содержащие элементы, по крайней мере, 2 расположены друг от друга. Если мы посмотрим на пример [5,5,10,100,10,5]
более подробно: у нас есть следующая потенциальная подпоследовательность, содержащая несмежные элементы; с их индексами ниже; с их суммами ниже этого:
[[5],[10],[100],[10],[5],[5],[100,5],[10,5],[10,10],[5,5],[5,10],[5,100],[5,5],[5,10],[5,100],[5,10],[5,100,5],[5,100,5],[5,10,5],[5,10,10]] // non-adjacent subsequences
[[5],[ 4],[ 3],[ 2],[1],[0],[ 3,5],[ 2,5],[ 2, 4],[1,5],[1, 4],[1, 3],[0,5],[0, 4],[0, 3],[0, 2],[1, 3,5],[0, 3,5],[0, 2,5],[0, 2, 4]] // at these 0-based indices
[ 5, 10, 100, 10, 5, 5, 105, 15, 20, 10, 15, 105, 10, 15, 105, 15, 110, 110, 20, 25] // with these sums
^ ^ // and these two maximums
Поскольку максимальные суммы равны 110
, мы выводим [5,100,5]
результат.
Правила соревнований:
- Вам разрешено выводить пары ключ-значение индекса + значение. Таким образом, вместо
[5,100,5]
вы можете выводить[[0,5],[3,100],[5,5]]
или[[1,5],[3,100],[5,5]]
как результат (или[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
когда используется индексация на основе 1 вместо 0 на основе).- Если вы используете пары ключ-значение, они также могут быть в обратном или случайном порядке, поскольку ясно, какие значения подразумеваются из-за парного индекса.
- Вывод только индексов без значений не допускается. Он должен либо выводить значения, либо значения / индексы в виде пар ключ-значение (или двух разделенных списков для «ключей» и «значений» одинакового размера, если пары ключ-значение невозможны на выбранном вами языке).
- Вам разрешено выводить все возможные подпоследовательности с максимальной суммой вместо одной.
- Как видно из примеров, список ввода может содержать как отрицательные, так и дублированные значения. Можно предположить, что входные целые числа находятся в диапазоне .
- Выходной список не может быть пустым и всегда должен содержать хотя бы один элемент (если список будет содержать только отрицательные значения, то в качестве результата будет выведен список, содержащий единственное наименьшее отрицательное значение - см. Последние два теста).
- Если есть один возможный вывод, но для нескольких разных индексов, разрешается выводить оба из них, даже если они выглядят дубликатами. (т.е. приведенный выше пример может выводить
[[5,100,5],[5,100,5]]
обе возможные комбинации индексов).
Тестовые случаи:
Input: Possible outputs: At 0-based indices: With sum:
[1,2,3,-1,-3,2,5] [1,3,5] [0,2,6] 9
[4,5,4,3] [4,4]/[5,3] [0,2]/[1,3] 8
[5,5,10,100,10,5] [5,100,5] [0,3,5]/[1,3,5] 110
[10] [10] [0] 10
[1,1,1] [1,1] [0,2] 2
[-3,7,4,-2,4] [7,4] [1,4] 11
[1,7,4,-2] [7] [1] 7
[1,2,-3,-4,5,6,-7] [2,6] [1,5] 8
[800,-31,0,0,421,726] [800,726]/[800,0,726] [0,5]/[0,3,5]/[0,2,5] 1526
[-1,7,8,-5,40,40] [8,40] [2,4]/[2,5] 48
[-5,-18,-3,-1,-10] [-1] [3] -1
[0,-3,-41,0,-99,-2,0] [0]/[0,0]/[0,0,0] [0]/[3]/[6]/[0,3]/
[0,6],[3,6]/[0,3,6] 0
источник
[5,100,5]
дважды для вашего третьего примера.powerset
это набор подмножеств, не так ли? но похоже, что вы возвращаете набор подпоследовательностей? [4,5,4,3] привело бы к [4,4], где [4,4] явно не является набором.Ответы:
Шелуха , 11 байт
Попробуйте онлайн!
объяснение
источник
Haskell , 60 байт
Попробуйте онлайн!
Вспомогательная функция
%
рекурсивно разветвляется при выборе: включить первый элемент и отбросить второй или пропустить первый элемент. Он принимает максимум всех результатов, которые являются кортежами, первый элемент которых является суммой, а второй элемент - соответствующим списком, который извлекается для вывода.Чтобы справиться с правилом, согласно которому пустой список запрещен, даже если он будет иметь наименьшую хитрость, мы пишем симпатичный трюк,
sum r<$r
а не.sum r
Это создает список, все элементыsum r
которого и длина которого равнаr
. Таким образом, когда мы выбираем максимум, мы отдаем приоритет любому списку над пустымr
, но в противном случае сравнения зависят от первого элемента, который естьsum r
.источник
R ,
136125 байтПопробуйте онлайн!
-6 байт благодаря digEmAll , который, кстати, тоже превзошел меня .
Возвращает самую короткую подпоследовательность как a
list
, разрывая связи по лексикографически сначала по индексам.Грубая сила генерирует все подпоследовательности индекса, затем
Filter
s для несмежных, т. Е. Гдеall(diff(x)>1)
. Тогда подмножества[
вl
использовании этих индексов, выбирая[[
первую , где сумма является макс (which.max
).Я уверен, что это первый ответ R, который я когда-либо писал, который используетгрустно,Filter
!Filter
нечестно, не удивительно, что я никогда не использовал его ...источник
05AB1E , 14 байтов
Сохранено 1 байт благодаря Кевину Круйссену
Попробуйте онлайн! или как тестовый набор
объяснение
источник
¤ª
наĆ
.Brachylog (v2), 14 байт
Попробуйте онлайн!
Подчинение функции; ввод слева, вывод справа, как обычно. Очень медленно; список из пяти элементов, вероятно, является максимальным для тестирования на TIO.
Результаты, которые мы получаем из префиксов, не являются неверными, но также не интересны; все возможные результаты генерируются с помощью суффикса (который, возможно, является самим списком, но не может быть пустым), но «суффикс» в Brachylog более многословен, чем «префикс или суффикс», поэтому я выбрал версию, которая более краткая (и менее эффективный но все же правильный). Основная идея состоит в том, что для каждого элемента, который мы хотим в выходном списке, разделение на смежные подсписки должно поместить этот элемент и элемент в один и тот же подсписок (потому что элемент является вторымэлемент подсписка), поэтому два последовательных элемента не могут появиться в результате. С другой стороны, совершенно очевидно, что в результате может появиться любой список без двух последовательных элементов. Поэтому, когда у нас есть все возможные списки кандидатов, мы можем просто взять суммы всех из них и посмотреть, какой из них самый большой.
источник
Желе ,
1614 байтовПопробуйте онлайн!
Спасибо @EriktheOutgolfer за сохранение 2 байтов!
источник
JavaScript (ES6),
138 132 130 129126 байтовВывод пар ключ-значение.
Попробуйте онлайн!
Шаг 1
Шаг 2
Затем мы ищем максимальную суммум среди этих наборов отбрасывают наборы, по меньшей мере, с двумя смежными элементами. Лучший набор хранится вр ,
источник
Haskell,
8180 байтПопробуйте онлайн!
f
создает все допустимые подпоследовательности, пропуская следующий элемент (f(b:c)
) или используя его и пропуская next (map(a:)(f c)
), и рекурсивно работает с остальными. Для результата создайте все подпоследовательности (f
), удалите пустую подпоследовательность (которая появляется первой в списке:)tail
, сделайте пары(<sum>,<subsequence>)
(map((,)=<<sum)
), найдите максимум (пары сравниваются в лексикографическом порядке) ->maximum
) и отбросьте сумму (snd
).Редактировать: -1 байт благодаря @Lynn.
источник
map(:[])a
на байт короче(pure<$>a)
^^J , 47 байт
Попробуйте онлайн!
-7 байт благодаря FrownyFrog
оригинал
J 54 байта
Попробуйте онлайн!
источник
T-SQL,
122119118 байтВвод является табличной переменной.
Этот запрос выбирает все элементы из табличной переменной, комбинируя их со всеми несмежными элементами с более высокими значениями позиции и показывает текст, сгенерированный для наибольшей суммы этих значений.
Попробуйте онлайн ungolfed
источник
Wolfram Language (Mathematica) , 144 байта
Попробуйте онлайн!
источник
Pyth, 19 байт
Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
источник
Gaia , 24 байта
Попробуйте онлайн!
Тьфу,
E‡
делают некоторые странные вещи ... в соответствии с документацией, он должен сделать что - то вроде «заданной длинойi
множества списковX
и длинойj
набора индексовY
, возвращенияX[i][Y[j]]
», но вместо этого возвращается ,[X[i][Y[j]] X[i][Y[-j]]
где отрицательное индексирование представляет дополнение, так что мы должны сделать ,ev2%
чтобы извлекать только те, которые мы хотим.источник
]]
вместо одного?[[1] [2]]
печатается,[[1]] [2]]]]
что затрудняет чтение / отладку вывода списка.re.sub(" ?$","]",result)
в интерпретаторе, которое должно быть,re.sub(" +$","]",result)
но мой питон очень плохой.R ,
108107 байтПопробуйте онлайн!
-1 благодаря @Giuseppe
источник
Wolfram Language (Mathematica) ,
7063 байтаПопробуйте онлайн!
Поиск высокого уровня
,1
требуется, чтобы непреднамеренно не возвращать недопустимые наборы (в противном случае, например, ввод в{1,1,1}
результате приведет к выводу{{1,1},{1,1},{1,1}}
)источник
Haskell ,
300168 байтПопробуйте онлайн!
-132 байта благодаря всем отзывам от @nimi :)
оригинал
Ungolfed (оригинал)
источник
f
:,f x=zip[0..length x]x
такf
становитсяf=zip[0..]
.g
это простоg=map unzip
. Функция для фильтрации с помощьюj
ish.fst
(<- перевернутые пары!).j=filter(h.fst)
,foldl1+
Отk
этоsum
и с pointfree пары решенийk=map((,)=<<sum.snd)
.sortBy(...)
может быть заменен наsortOn fst
:l=snd.last.sortOn fst
. Наконец, поскольку вы используете все функции только один раз, вы можете встроить их в одно выражение без точек:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
больше импортировать .h
: мы ищем несмежные элементы, т.е. разница смежных индексов должна быть>1
.zipWith(-)=<<tail
строит такой список различий, но не выполняется для пустого списка, так что нам нужно дополнительноtail
на ,subsequences
чтобы избавиться от него. Снова в строке. Попробуйте онлайн!Древесный уголь , 46 байт
Попробуйте онлайн!Ссылка на подробную версию кода. Объяснение:
Переменная
u
предопределена с пустым списком. Это помещено в список, который назначенh
. Эти переменные действуют как аккумуляторы.u
содержит подсписки, которые включают самый последний элемент ввода, вq
то время какh
содержит подсписки, которые этого не делают (и, следовательно, подходят для добавления следующего элемента ввода).Цикл по элементам ввода.
Сохраните список подсписков, которые содержат предыдущий элемент.
Возьмите все подсписки, которые не содержат предыдущий элемент, добавьте текущий элемент и сохраните результат как список подсписков, которые содержат текущий элемент. (Я не использую
Push
здесь, поскольку мне нужно клонировать список.)Объединить оба предыдущих подсписка в новый список подсписков, которые не содержат текущий элемент.
Объедините подсписки в последний раз и удалите исходный пустой список (который в любом случае уголь не может суммировать).
Вычислите суммы всех подсписков.
Найдите индекс наибольшей суммы и выведите соответствующий подсписок.
источник
Japt
-h
, 22 байтаПопытайся
источник
Japt
-h
, 21 байтУ вас когда-нибудь возникали проблемы, когда вы совершенно забыли, как играть в гольф ?!
Попытайся
источник
Python 2 ,
637065 байтПопробуйте онлайн!
5 байтов, спасибо ArBo
источник
[1, 7, 4, -2] [1, 4] 5 7
дает неправильный ответ.