Введение
Рассмотрим непустой список L целых чисел. С нулевой суммой срез из L представляет собой непрерывную подпоследовательность L , сумма которых равна 0. Например, [1, -3, 2] является нулевой суммой срез [-2, 4, 1, -3, 2, 2 , -1, -1] , но [2, 2] - нет (потому что оно не суммируется с 0), и нет [4, -3, -1] (потому что оно не является смежным).
Коллекция с нулевой суммой ломтиков L является нулевой суммой крышкой из L , если каждый элемент принадлежит , по меньшей мере , одного из слоев. Например:
L = [-2, 4, 1, -3, 2, 2, -1, -1]
A = [-2, 4, 1, -3]
B = [1, -3, 2]
C = [2, -1, -1]
Три с нулевой суммой нарезает , В и С образуют с нулевой суммой крышку L . Несколько копий одного среза могут появиться в обложке с нулевой суммой, например так:
L = [2, -1, -1, -1, 2, -1, -1]
A = [2, -1, -1]
B = [-1, -1, 2]
C = [2, -1, -1]
Конечно, не все списки имеют покрытие с нулевой суммой; некоторые примеры: [2, -1] (каждый срез имеет ненулевую сумму) и [2, 2, -1, -1, 0, 1] (крайний левый 2 не является частью среза с нулевой суммой).
Задание
Ваш ввод представляет собой непустой список целых чисел L , взятый в любом разумном формате. Ваш вывод должен быть истинным значением, если L имеет покрытие с нулевой суммой, и ложным значением, если нет.
Вы можете написать полную программу или функцию, и побеждает меньшее количество байтов.
Контрольные примеры
[-1] -> False
[2,-1] -> False
[2,2,-1,-1,0,1] -> False
[2,-2,1,2,-2,-2,4] -> False
[3,-5,-2,0,-3,-2,-1,-2,0,-2] -> False
[-2,6,3,-3,-3,-3,1,2,2,-2,-5,1] -> False
[5,-8,2,-1,-7,-4,4,1,-8,2,-1,-3,-3,-3,5,1] -> False
[-8,-8,4,1,3,10,9,-11,4,4,10,-2,-3,4,-10,-3,-5,0,6,9,7,-5,-3,-3] -> False
[10,8,6,-4,-2,-10,1,1,-5,-11,-3,4,11,6,-3,-4,-3,-9,-11,-12,-4,7,-10,-4] -> False
[0] -> True
[4,-2,-2] -> True
[2,2,-3,1,-2,3,1] -> True
[5,-3,-1,-2,1,5,-4] -> True
[2,-1,-1,-1,2,-1,-1] -> True
[-2,4,1,-3,2,2,-1,-1] -> True
[-4,-1,-1,6,3,6,-5,1,-5,-4,5,3] -> True
[-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3] -> True
[4,-9,12,12,-11,-11,9,-4,8,5,-10,-6,2,-9,10,-11,-9,-2,8,4,-11,7,12,-5] -> True
[2,2,-1,-1,0,1] -> False
должен быть правдивым, поскольку оба среза[2,-1,-1]
и[-1,0,1]
прибавляют к нулю, а все их элементы находятся в исходном списке?Ответы:
Желе ,
1312 байтПопробуйте онлайн!
Как это работает
источник
Mathematica,
6665 байтСохранено 1 байт, и, надеюсь, выучил новый трюк на будущее, благодаря ngenisis!
Две одинаково длинных альтернативы, обе из которых являются безымянными функциями, принимающими список целых чисел в качестве входных данных и возвращающих
True
илиFalse
:В обоих случаях
Tr@#[[i;;j]]
вычисляется сумма среза ввода от положенияi
к положениюj
(индексируется 1).Product[...,{i,k},{j,k,l}]
кратные вместе весь этот ломтик-суммирует, какi
диапазоны более индексы, которые в большинствеk
иj
диапазоны более индексы, которые , по крайней мереk
. (Обратите внимание, чтоl=Tr[1^#]
определяетсяl
как сумма1
всех степеней во входном списке, которая является просто длиной списка.) Другими словами, этот продукт равен 0 тогда и только тогда, когдаk
элемент th принадлежит срезу с нулевой суммой ,В первой версии каждый из этих продуктов сравнивается
0
иAnd@@
возвращаетсяTrue
точно, когда каждый отдельный продукт равен0
. Во второй версии на список товаров воздействует функцияNorm
(длинаl
-мерного вектора), которая равна0
тогда и только тогда, когда каждая запись равна0
.источник
Tr[1^#]
сохраняет1
байт изLength@#
.0^
работать вместо0==
? Не уверен, как Mathematica справится с этим. (вы бы вернулись1
/0
вместоtrue
/false
)Indeterminate
за0^0
. Кроме того, в Mathematica1
/ на0
самом деле не правдивые / ложные - он слишком сильно напечатан, чтобы осчастливить игроков в гольф :)Mathematica,
6564 байтаСпасибо ngenisis за сохранение 1 байта.
Я бы предпочел найти чистое решение для сопоставления с образцом, но оно оказалось сложным (а такие вещи
{___,a__,___}
всегда очень длинные).источник
Haskell, 94 байта
Пример использования:
g [-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3]
->True
.Как это работает (давайте использовать
[-1,1,5,-5]
для ввода):источник
powerslice
такое отличное имя функции.Рубин, 81 байт
Попробуйте онлайн
Упрощенное решение методом грубой силы; для каждого элемента массива попробуйте найти срез с нулевой суммой, который содержит его.
источник
J,
3635 байтДля каждой подгруппы я добавляю индексы элемента и сохраняю индексы, если подсумма есть,
0
а затем проверяю, присутствует ли каждый индекс.Уловка: основанные на 1 индексы списка могут быть сгенерированы с
#\
длиной каждого префикса.Использование:
Попробуйте это онлайн здесь.
источник
#\*/@e.&,]({:*0=1#.{.)@|:\.\@,.#\
JavaScript (ES6), 109 байт
Тестовый фрагмент
Показать фрагмент кода
источник
Python,
123120 байт-3 байта благодаря @Zgarb
Заполняет список того же размера, что и ввод, срезами с нулевой суммой и перезаписывает в соответствии с индексами, возвращая его равенство оригиналу в конце.
источник
0
в качестве заполнителя вместоNone
. Не будет ложных срабатываний, потому что каждый0
на входе всегда является частью или срезом с нулевой суммой.Скала, 49 байт
Попробуйте в Ideone
Использование:
Ungolfed:
Объяснение:
источник
%
в качестве имени параметра? Круто!.,;:()[]{}\"'
. Довольно полезно для игры в гольф, потому что они разбираются буквами при разборе, поэтому вы можете сэкономить свободное место.true
для второго ложного случая.Python, 86 байт
Истина = 1 Ложь = Нет
источник
1
для третьего теста.1
для всех тестовых случаев, кроме первых двух ложных.Clojure, 109 байт
Генерирует все разделы, которые суммируются с нулем, проверяет, имеет ли он различные индексы длины входного вектора.
источник
PHP, 104 байта
Грубая сила и еще более 99 байтов. :-(
принимает входные данные из аргументов командной строки,
1
для правды, пустое для ложных. Беги с-r
.сломать
$argv[0]
содержит имя файла; если запустить с-r
, это будет-
и оценивать0
для числовых операций.источник
JavaScript (ES6), 102 байта
Вычисляет частичные суммы для всех элементов
i..j
включительно, и сбрасывают соответствующие элементыb
из1
к ,0
когда он находит нулевую сумму, наконец , не проверяя , что нет1
ы остались.источник