Partitionen einer Liste

9

Die Antwort auf diese Frage ist viel zu lang

Ihre Herausforderung besteht darin, eine Partitionierungsfunktion mit der geringsten Anzahl von Zeichen zu schreiben .

Eingabebeispiel

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

Ausgabebeispiel

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

Die Eingabe kann eine Liste / ein Array / eine Menge / eine Zeichenfolge usw. sein, was für Ihre Funktion am einfachsten zu verarbeiten ist

Sie können auch das Ausgabeformat auswählen, das zu Ihnen passt, solange die Struktur klar ist.

Ihre Funktion sollte für mindestens 6 Elemente in der Eingabe funktionieren

Gnibbler
quelle
Soll die leere Partition auch Teil der Ausgabe sein?
FUZxxl

Antworten:

3

GolfScript (43 Zeichen)

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

oder

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

Gleiches Eingabeformat, Ausgabeformat und Funktionsname wie bei Howard. Es gibt kein brutales Forcen: Dies erfordert den einfachen iterativen Ansatz, jedes Mal um die äußere Schleife ein Element aus der Eingabeliste zur Partition hinzuzufügen.

Peter Taylor
quelle
6

GolfScript, 51 Zeichen

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

Das Skript definiert eine Variable, Pdie ein Array vom oberen Rand des Stapels nimmt und eine Liste aller Partitionen zurückschiebt, z

[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"]]]

Es funktioniert auch bei größeren Listen:

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

Sie können eigene Tests online durchführen .

Howard
quelle
6

J, 51 Zeichen

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

Übernimmt Eingaben über die Tastatur, Elemente durch Leerzeichen getrennt:

   ([:<a:-.~])"1~.((>:@i.#:i.@!)#l)<@;/."1[l=:;:1!:1[1
a b c
+-----+------+------+------+-------+
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
||abc|||ab|c|||ac|b|||a|bc|||a|b|c||
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
+-----+------+------+------+-------+
Gareth
quelle
1

Haskell, 90 87 71 66

5 Bytes dank Nimi gespeichert .

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

Beispiel:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]
Alephalpha
quelle
Ein paar Bytes zum Speichern: Ordnen Sie die Klammern in der 2. Zeile von #: neu an :map(y:)(x#s)und verwandeln Sie das Lambda in eine punktfreie Version : foldr((=<<).(#))[[]].
Nimi