задача
Учитывая список разделенных пробелом целых чисел в качестве входных данных, выведите все уникальные непустые подмножества этих чисел, которые каждое подмножество суммирует в 0.
Прецедент
Вход: 8 −7 5 −3 −2
Выход:-3 -2 5
Критерий победы
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
3 3 -3 -3
?Ответы:
GolfScript, 41 символ
Если вам не нужен конкретный формат вывода, вы можете сократить код до 33 символов.
Пример (см. Онлайн ):
источник
Брахилог (2), 9 знаков
Попробуйте онлайн!
источник
Питон, 119 символов
Рекурсивно перечисляет все 2 ^ n подмножеств и проверяет каждое.
источник
Питон, 120
Я персонаж хуже, чем решение Кейта. Но ... это слишком близко, чтобы не публиковать. Одна из моих любимых особенностей code-golf - насколько могут быть разные решения одинаковой длины.
источник
Python (
128 137136)Черт возьми
itertools.permutations
, за такое длинное имя!Решение грубой силы. Я удивлен, что это не самое короткое: но я думаю,
itertools
разрушает решение.Ungolfed:
Гольф (безобразный выход):
Гольф (симпатичный выход) (183):
import itertools as i
: импорт модуля itertools и вызов егоi
x=map(int,input().split())
: разделяет ввод пробелами, а затем превращает элементы результирующих списков в целые числа (2 3 -5
->[2, 3, -5]
)set (
sorted(j)
для диапазона in (1, len (x) +1) для j в i.permutations (x, a) if sum (j) == 0):возвращает список всех подмножеств в
x
отсортированном виде, где сумма 0, а затем получает только уникальные предметы(
set(...)
)Могилы (`) вокруг
sorted(j)
- это сокращение от Pythonrepr(sorted(j))
. Причина этого заключается в том, что наборы в Python не могут обрабатывать списки, поэтому следующая лучшая вещь - это использовать строки со списком в качестве текста.источник
split()
создает список строк, но потом вы вызываетеsum
подмножества этого разбиения.from itertools import*
repr()
C # - 384 символа
Хорошо, функциональное программирование на C # не так уж и мало , но мне это нравится ! (Используя просто перебор, ничего лучше.)
Отформатирован и прокомментирован для большей читабельности:
источник
SWI-Пролог 84
Эта версия печатает список, вместо того, чтобы пытаться найти соответствующую привязку для термина в предикате.
Метод ввода
Для записи это версия, которая находит привязку для удовлетворения предиката:
Метод ввода
Предыдущая версия содержит неполное решение, которое не удалось удалить пустой набор.
источник
Mathematica
62 5738Код
Ввод введен как целые числа в массиве
x
.Выход
объяснение
x[[1, 1]]
преобразует входные данные в список целых чисел.Subsets
генерирует все подмножества из целых чисел.Select....Tr@# == 0
дает все те подмножества, которые имеют общее значение, равное 0.Grid
форматирует выбранные подмножества как разделенные пробелом целые числа.источник
Желе , 6 байт
Попробуйте онлайн!
Просто для полноты. Как и в Brachylog, Jelly также откладывает вызов, но теперь новые языки конкурируют нормально.
источник
05AB1E , 5 байтов
Попробуйте онлайн!
Если входные данные должны быть разделены пробелом,
#
единственное требуемое изменение - добавление к этому ответу.источник
J,
57535149 символовИспользование:
источник
(<@":@(#~0=+/)@#"1 _~2#:@i.@^#)
сохраняются 4 символа.Stax , 8 байтов CP437
Запускать и отлаживать онлайн!
объяснение
Использует распакованную версию (9 байт) для объяснения.
источник
Given a list of space-delimited integers as input
; вы - однако - берете список в качестве входных данных.J , 34 байта
Попробуйте онлайн!
как
".
преобразует вход в список. тогда:источник
Perl 6 , 51 байт
Попробуйте онлайн!
Возвращает список уникальных сумок, сумма которых равна 0. Сумка - это взвешенный набор.
Объяснение:
источник
Рубин, 110 байт
Добавлю ссылку TIO позже.
Принимает ввод из стандартного ввода в виде списка чисел, например
8 −7 5 −3 −2
Как это работает: преобразует входные данные в массив чисел. Получает все перестановки длин от 1 до длины массива. Он добавляет их в выходной массив, если их сумма равна 0. Он выводит массив без дубликатов.
Выход для образца ввода:
[[-3, -2, 5]]
источник