Разделы списка

9

Ответ на этот вопрос слишком длинный

Ваша задача - написать функцию разбиения с наименьшим количеством символов.

Пример ввода

['a', 'b', 'c']

Пример вывода

[(('a'),('b'),('c')),
 (('a', 'b'), ('c')),
 (('a', 'c'), ('b')),
 (('b', 'c'), ('a')),
 (('a', 'b', 'c'))]

Входные данные могут быть списком / массивом / множеством / строкой и т. Д. Все, что проще для вашей функции для обработки

Вы также можете выбрать выходной формат для себя, если структура ясна.

Ваша функция должна работать как минимум для 6 элементов на входе

gnibbler
источник
пустой раздел также будет частью вывода?
FUZxxl

Ответы:

3

GolfScript (43 символа)

{[[]]:E\{:v;{:^E+1/{^1$-\[~[v]+]+}/}%}/}:P;

или

{[[]]:E\{:v;{:^E+1/{^1$-\{[v]+}%+}/}%}/}:P;

Тот же формат ввода, формат вывода и имя функции, что и у решения Говарда. Нет грубого принуждения: для этого требуется простой итеративный подход - добавление одного элемента из списка ввода в раздел каждый раз вокруг внешнего цикла.

Питер Тейлор
источник
6

GolfScript, 51 символ

{[[]]\{[.;]`{1$[1$]+@@`1$`{[2$]-@@[+]+}++/}+%}/}:P;

Скрипт определяет переменную, Pкоторая берет массив из верхней части стека и возвращает список всех разделов, например

[1 2] P            # => [[[1] [2]] [[1 2]]]
["a" "b" "c"] P    # => [[["a"] ["b"] ["c"]] [["b"] ["a" "c"]] [["a"] ["b" "c"]] [["a" "b"] ["c"]] [["a" "b" "c"]]]

Он также работает с большими списками:

6, P ,p            # prints 203, i.e. Bell number B6
8, P ,p            # 4140

Вы можете выполнить собственные тесты онлайн .

Говард
источник
6

J, 51 символов

([:<a:-.~])"1~.((>:@i.#:i.@!)#l)<@;/."1[l=:;:1!:1[1

Берет ввод с клавиатуры, элементы разделяются пробелами:

   ([:<a:-.~])"1~.((>:@i.#:i.@!)#l)<@;/."1[l=:;:1!:1[1
a b c
+-----+------+------+------+-------+
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
||abc|||ab|c|||ac|b|||a|bc|||a|b|c||
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
+-----+------+------+------+-------+
Gareth
источник
1

Хаскелл, 90 87 71 66

Сохранено 5 байтов благодаря nimi .

x#[]=[[[x]]]
x#(y:s)=((x:y):s):map(y:)(x#s)
p=foldr((=<<).(#))[[]]

Пример:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]
alephalpha
источник
Несколько байтов для сохранения: переставить скобки во 2 - й линии #: :map(y:)(x#s)и превратить лямбда в точку свободной версии: foldr((=<<).(#))[[]].
Ними,