Определение проблемы
Распечатайте powerset данного набора. Например:
[1, 2, 3] => [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
Каждый элемент должен быть напечатан в отдельной строке, поэтому приведенный выше пример будет напечатан так:
[]
[1]
[2]
...
[1, 2, 3]
Пример кода (в D, пример Python здесь ):
import std.stdio;
string[][] powerset(string[] set) {
if (set.length == 1) {
return [set, []];
}
string[][] ret;
foreach (item; powerset(set[1 .. $])) {
ret ~= set[0]~item;
ret ~= item;
}
return ret;
}
void main(string[] argv) {
foreach (set; powerset(argv[1 .. $]))
writeln(set);
}
вход
Элементы будут переданы в качестве аргументов. Например, приведенный выше пример будет передан программе, которая называется powerset
:
powerset 1 2 3
Аргументы будут буквенно-цифровыми.
правила
- Нет библиотек, кроме IO
- Выход не должен быть заказан
- Powerset не должен быть сохранен, только напечатан
- Элементы в наборе должны быть разделены (например
1,2,3
,[1,2,3]
и['1','2','3']
являются приемлемыми, но123
не- Конечные разделители в порядке (например
1,2,3, == 1,2,3
)
- Конечные разделители в порядке (например
- Лучший определяется на основе количества байтов
Лучшее решение будет принято не позднее, чем через 10 дней после первого представления.
code-golf
array-manipulation
combinatorics
beatgammit
источник
источник
lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])
.Ответы:
Mathematica 16
Код
Subsets
родом из Mathematica.Код (без столбца) можно проверить на WolframAlpha . (Мне пришлось использовать скобки вместо
@
; они означают одно и то же.использование
Этот метод (55 символов) использует подход, предложенный @ w0lf.
Сломать
Генерация кортежей, состоящих из
0
и1
длиныLength[s]
Умножьте исходный список (вектор) на каждый кортеж:
Удалить
0
.%
сокращение от «предыдущий вывод».% /. {0:> Последовательность []}
Показать в столбце:
источник
s
и поставить ввод в конце строки?Subsets/*Column
создает анонимную функцию, которая принимает список и возвращает отображение в столбцах.С,
118115Несмотря на то, что вы можете сэкономить около 20 символов с более простым форматированием, вы все равно не выиграете в условиях код-гольфа
Тестирование:
источник
main(a,s)char**s;{...}
)f|=x&1<<i&&printf
короче?:
.x+=2
(и кудаs[0]
делись). Действительно хороший трюк.GolfScript,
2218 символовЕще одна попытка в GolfScript с совершенно другим алгоритмом. Формат ввода такой же, как и в ответе w0lf. ( онлайн тест )
источник
GolfScript (43 символа)
Это может показаться довольно длинным, но это первое решение, которое следует спецификации: входные данные основаны на аргументах командной строки, а выходные - разделены новой строкой.
Например
источник
awk (82)
Предположим, сохранены в файле powerset.awk, использование
ps, если ваш awk не имеет функции and (), замените его на,
int(i/(2^j))%2
но добавьте два к счетчику.источник
(2^j)
->2^j
экономит 2 байта;.awk
файл также работает без завершающего\n
, так что вы могли бы сбрить другие байты.JavaScript, 98
К сожалению, хороший кусок тратится на форматирование вывода.
вход
Принимает массив JavaScript. (например, [1,2,3])
Выход
источник
Питон (
7470 символов)для ввода как
1,2,3
или[1,2,3]
, выход:источник
[a[0]]
=a[:1]
1,2,3
a[:1]
не работает. Кортеж + список не допускается. Существуйте лучшее решениеi,*a=a
i,*a=a
Python 3? Это не работает на моем 2.7.1.Python
7067 байтВвод принимается так же, как и для решения Угорена . Пример ввода / вывода:
источник
def p(a,*v)
а затемp(a[i:],n,*v)
. Вывод становится несколько уродливее, но все же в порядке.J, 19 символов
Бокс ascii в выводе называется
boxing
и обеспечивает сбор гетерогена (для различной длины массивов здесь).источник
Golfscript 48
Эта программа использует двоичные представления чисел от 0 до длины (входные) для генерации элементов powerset.
вход
Входной формат является Golfscript формат массива (пример:
[1 2 3]
)Выход
Вывод представляет собой набор массивов, разделенных символами новой строки, представляющих набор мощности. Пример:
Онлайн тест
Программу можно протестировать онлайн здесь .
источник
Хаскелл (96)
Если импорт
Control.Monad
не разрешен, это становится 100 символами:источник
Mathematica 53
источник
APL (26)
Читает ввод с клавиатуры, потому что нет
argv
эквивалента.Использование:
Объяснение:
T←⎕
: читать ввод, хранить вT
M←⍴T
: хранить длинуT
вM
(M/2)⊤⍳2*M
: Генерировать битовые шаблоны для1
ДО ,2^M
используяM
биты.↓⍉
: разделить матрицу так, чтобы каждая битовая комбинация была отдельной(/∘T)¨
: для каждого шаблона битов выберите эти подпункты изT
.↑⍕¨
: для вывода получите строковое представление каждого элемента (чтобы он заполнялся с использованием пробелов, а не нулей) и отформатировали в виде матрицы (чтобы каждый элемент находился на отдельной строке).источник
Скала, 81
источник
JavaScript ( ES6 ) 76
Частично скопировано с этого: /codegolf//a/51502/21348
Использование растрового изображения, поэтому оно ограничено не более чем 32 элементами.
Запустите фрагмент в Firefox для проверки.
источник
C # 164
Человек это трудно в C #!
источник
Python 2, 64 байта
Использование ввода через запятую:
Pyth, 4 байта (используя встроенный) или 14 байтов (без)
Как отметил @Jakube в комментариях, Pyth слишком свеж для этого вопроса. И все же вот решение, использующее встроенный оператор питания Pyth:
И вот один без него:
Вы можете попробовать оба решения здесь и здесь . Вот объяснение второго решения:
источник
мозговой трах, 94 байта
отформатирован:
Ожидает ввод формы
9,10,11
без завершающей строки и выводит подмножества в том же формате, иногда с запятой. Первая напечатанная строка всегда будет пустой, что означает пустой набор.Попробуйте онлайн.
Основная идея состоит в том, чтобы поместить бит рядом с каждым элементом, затем многократно увеличивать двоичное число, печатая соответствующее подмножество перед каждым увеличением. (Бит указывает, находится ли элемент в подмножестве.) Бит стража слева от массива используется для завершения программы. Эта версия на самом деле создает экспоненциальное количество часовых, чтобы сохранить несколько байтов; более эффективное 99-байтовое решение, в котором используется только один страж, можно найти в истории изменений.
Каждый бит кодируется как один плюс его значение; то есть, это может быть
1
или2
. Лента размещается с битом перед каждым элементом и одной нулевой ячейкой между соседними элементами. Запятая включена в ленту для не конечных элементов, поэтому мы можем просто печатать элементы, не выполняя никакой дополнительной работы с разделителями.источник
APL (Dyalog Classic) , 13 байтов
Попробуйте онлайн!
Выход:
В конце есть пустая строка, представляющая пустой набор.
Объяснение:
⎕
оцененный вклад⎕,¨⊂⊂⍬
добавить пустой числовой список после каждого элемента∘.,
Декартово произведение/
уменьшение (сгиб)⊃
раскрыть (необходимо после снижения APL)На этом этапе результат представляет собой n-мерный массив размером 2 на -...- на-2, где n - длина входных данных.
,
сплющить в вектор⍪
превратить вектор в прямую 2 n- by-1 матрицу, чтобы каждое подмножество находилось на отдельной строкеисточник
Haskell ,
8078 байтПопробуйте онлайн!
источник
Желе , 6 байт
Попробуйте онлайн!
ŒṘ€Y
форматирование строкисточник
Питон,
9387 символовPython упрощает форматирование, поскольку требуемый ввод / вывод соответствует его собственному формату.
Поддерживает только те элементы, которые являются литералами Python (например
1,2,'hello'
, нет1,2,hello
).Читает стандартный ввод, а не параметры.
источник
print f(input())
корочеlist
действительно может быть удален (если также заменить[[]]
на[()]
.print'\n'.join(f(input()))
сохраняет двух персонажейf()
содержит кортежи, а не строки.Руби, 39
источник
Haskell 89 символов
Получение параметров долго: /
источник
map(x:)(p y)++p y
а еще два - выше[(x:),id]<*>p y
. Видимо<*>
сейчас в прелюдии . (filterM
нет).R, 63
Здесь
v
представляет вектор.Использование :
источник
К, 14 байтов
Сгенерируйте все 0/1 векторов за время ввода, соберите индексы 1 с и используйте их для выбора элементов из входного вектора. На практике:
Это немного либерально с требованиями к выходу, но я думаю, что это законно. Наиболее сомнительной является то, что пустой набор будет представлен в виде, зависящем от типа;
!0
как K обозначает пустой числовой вектор:объяснение
(#x)#2
Строит вектор2
тех пор , пока на входе:Когда
!
к вектору применяется монадика, это «одометр»:Затем мы используем «где» (
&
) для каждого'
вектора ( ), чтобы собрать его индексы. Толстая кишка необходима для устранения неоднозначности между монадической и диадической формой&
:Если бы мы просто хотели комбинированные векторы, мы бы сделали, но нам нужно использовать их как индексы в исходном наборе. К счастью, оператор индексации K
@
может принять сложную структуру индексов и даст результат такой же формы:Элегантно, нет?
источник
{x@&:'+!(#x)#2}
. Несвязанный: более короткий эквивалент(#x)#2
IS2|~x
.Математика, 51
Больше обмана:
Используйте с
@{1,2,3}
.источник
JavaScript (ES6), 68 байт
демонстрация
Показать фрагмент кода
источник
alert
?Брахилог , 4 байта
Попробуйте онлайн!
источник
Комбинация методов Ruby Array (от 1.9) [50 символов]
источник