すべてのサブリストパーティションを生成する


11

整数の空でないリストが与えられた場合、各パーティションが空でないサブリストであるリストの可能なパーティションをすべて出力します。

リスト[1, 2, 3, 4]の結果は次のとおりです。

[[1, 2, 3, 4]]
[[1, 2, 3], [4]]
[[1, 2], [3, 4]]
[[1, 2], [3], [4]]
[[1], [2, 3, 4]]
[[1], [2, 3], [4]]
[[1], [2], [3, 4]]
[[1], [2], [3], [4]]

出力内のリストの順序は重要ではないため、[[1, 2, 3, 4]]最初、最後、またはどこでもかまいません。要素の順序を保持する必要があります。

これはコードゴルフなので、最短の回答が勝ちです。


関連:リストを分割します!


2
[...]出力形式で周囲を省略できますか?(例えば、改行でパーティションが明確に区切られている限り。)
マーティン・エンダー

入力形式と出力形式は柔軟ですが、類似している必要があります。したがって、入力リストの要素が1行にある場合、出力リストも同じようになります。
mbomb007

それは私が言っていることではありません。Bashの回答をご覧ください。:リストのセパレータとして使用しますが、出力では、パーティション自体はの追加ペアでラップされません[...]
マーティンエンダー

または、別の質問:チャレンジの例の形式では、各行の最初[と最後を削除でき]ますか?
マーティンエンダー

回答:



13

網膜27 19バイト

バイトカウントはISO 8859-1エンコードを前提としています。

+1%`,
;$'¶$`];[
;
,

オンラインでお試しください!

説明

もちろん、これは文字列処理を使用してすべてのパーティションを計算します。基本的な考え方は,、リストを分割するかどうかを個別に決定することにより、すべてのパーティションを生成できるということです。この種の作業は、それぞれ,を順番に照合し、可能な出力の両方を提供する置換を使用することにより、Retinaで実行できます。

入力は基本ケースとして機能します。すべての要素がまだ単一のリストにあるパーティションです。

+1%`,
;$'¶$`];[

ここで、各行()で+最初の(1)コンマ(,)に繰り返し()一致します(%その行を$'、置換における `` $ 1 `に関連する個別の文字列として扱います)。

そのコンマは次のものに置き換えられます。

;   A semicolon. This is just a stand-in for the comma, so we know we've already
    processed it and it won't be substituted again by the next iteration.
$'  Everything after the match. This completes the first (unchanged) version of
    the current line.
¶   A linefeed. Since the next iteration will scan for all lines again, this doubles
    the number of strings we're working with.
$`  Everything before the match. This completes the second (split) version of
    the current line.
];[ A semicolon around which we split the list.

いずれにしても、マッチの前とマッチ後のすべてが文字列に残ることに注意してください。したがって、実際には完全な結果が得られ$`;$'¶$`];[$'、サフィックスとプレフィックスをこの順序で挿入する理由を説明します。

すべてのコンマがなくなると、このループは停止します。

;
,

最後に、入力形式に合わせてセミコロンを再度コンマに置き換えます。


10

ピュアバッシュ、28

eval echo [${1//:/{:,]:[\}}]

ここでは、リストはコロンで区切られ、角括弧で囲まれています。たとえば、質問の入力リストは次のように1:2:3:4なり、出力は次のようになります。

[1:2:3:4] [1:2:3]:[4] [1:2]:[3:4] [1:2]:[3]:[4] [1]:[2:3:4] [1]:[2:3]:[4] [1]:[2]:[3:4] [1]:[2]:[3]:[4]

オンラインでお試しください

  • ${1//:/REPLACEMENT}のコロン$1{:,]:[\}
  • これは、中括弧の展開を生成します [1{:,]:[}2{:,]:[}3{:,]:[}4]
  • eval(および慎重な\エスケープ)により、ブレースの展開が最後に行われ、目的の結果が得られます。

指定された[[ , , ...]]形式と正確に一致させる必要がある場合は、代わりにこれを実行できます。

ピュアバッシュ、47

eval printf '%s\\n' ${1//, /{\\,\\ ,]\\,\\ [\}}

オンラインでお試しください



6

05AB1E、5バイト

Œæʒ˜Q

オンラインでお試しください!

Œæʒ˜Q  Main link. Argument l
Œ      Get all sublists of l
 æ     Powerset of those lists
  ʒ˜Q  Filter: Keep the lists that when flattened equal the input

1
うわー、これは非常にきちんとした答えです!
アドナン

1
@Adnanありがとう、私もとても満足しています。それはすべて効率的ですが:)
kalsowerus

ビルトインがまだなかったときのいい答え、私からの+1!ただ、将来的にはここに来て、誰のためにこれを残したが、05AB1Eは今、すべてのパーティションを取得するには、2バイトの組み込みがありますオンラインそれを試してみてください。
ケビンクルーイッセン

4

Pythonの382の 72 66バイト

f=lambda l:[k+[l[i:]]for i in range(len(l))for k in f(l[:i])]or[l]

オンラインでお試しください!

@JonathanAllanのおかげで-5バイト


私のああ、私は^ vは再び:(私は実際にこのような何かを試したことができないと、それは仕事をしませんでしたが、私は間違ってどこかに消えていたんだろう。
ジョナサン・アランを


1
@JonathanAllanどうもありがとう!私は再利用することで、別のバイトを救うことができるl最後に
OVS

このソリューションはすでにここに存在します。質問を投稿した後、TNBで@feersumにメッセージを送信したので、彼はそれを投稿する機会を得ました。
mbomb007

私はあなたがそれを元に戻すべきだと言ったのではなく、あなたが彼にそれを打ち負かしたことを意味しただけです。もちろん、あなたの選択です。
mbomb007

4

Haskell59 55 49バイト

p[x]=[[[x]]]
p(x:r)=do a:b<-p r;[(x:a):b,[x]:a:b]

オンラインでお試しください!

再帰的なソリューション。使用例:をp [1,2,3]返します[[[1,2,3]],[[1,2],[3]],[[1],[2,3]],[[1],[2],[3]]]

xnorのおかげで-6バイト!


1
do記法で2行目を短く書くことができます:(do a:b<-p r;[(x:a):b,[x]:a:b]これによりリストの順序が変わります)。
-xnor

1
また、最初のラムダがパターンマッチを必要とするようだからよりも長い<*>ですが[\(a:b)->(x:a):b,([x]:)]<*>p r、あなたが望むことを正確にdo行います。
xnor

3

J、42バイト

<@(</."1)~<:@#_&(][:;<@(,~"{~0 1+>./)"1)0:

長さ1のパーティションサブリストのキーを作成し、入力リストの長さを反復処理することにより、すべてのサブリストパーティトンを生成します。次に、キーから選択することにより、各パーティションサブリストが形成されます。

たとえば、長さ4のリストのキーを作成するプロセスは次のとおりです。

例

オンラインでお試しください!



2

Brachylog、2バイト

~c

オンラインでお試しください!

ジェネレーターとして機能することにより出力を生成する関数の送信。(TIOリンクには、テスト目的でこれを完全なプログラムにするための追加コードが含まれています。)

ところで、ない技術的に組み込みが、これはとても一般的に)それはおそらく、シングルバイト表現に値すると、b)というBrachylogに使用されているc組み込み、そのに関するアサーションを作るためのパラメータ取ることができ、入力(ほとんどの組み込みコマンドを持つのに対し、パラメータを出力の生成方法について説明します)。

説明

~c
~     Find a value with the following properties:
 c      concatenating its elements produces {the input}

2

APL、26バイト

{⊂∘⍵¨1,¨↓⍉(X⍴2)⊤⍳2*X←⍴1↓⍵}

テスト:

      {⊂∘⍵¨1,¨↓⍉(X⍴2)⊤⍳2*X←⍴1↓⍵} 1 2 3 4
┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│┌─────┬─┐│┌───┬───┐│┌───┬─┬─┐│┌─┬─────┐│┌─┬───┬─┐│┌─┬─┬───┐│┌─┬─┬─┬─┐│┌───────┐│
││1 2 3│4│││1 2│3 4│││1 2│3│4│││1│2 3 4│││1│2 3│4│││1│2│3 4│││1│2│3│4│││1 2 3 4││
│└─────┴─┘│└───┴───┘│└───┴─┴─┘│└─┴─────┘│└─┴───┴─┘│└─┴─┴───┘│└─┴─┴─┴─┘│└───────┘│
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

説明:

  • X←⍴1↓⍵Xは、最初の要素が削除された(入力リスト)の長さです
  • ⍳2*X:数字[1..2 ^ X]
  • (X⍴2)⊤:これらの数値のベース2表現、X位置(つまり、Xそれ自体はに回り込む0)。
  • ↓⍉:行列を回転させ、行に沿って分割します(結果として列に沿った数字の行列が得られます)、ビットベクトルの配列を与えます
  • 1,¨:各ビットベクトルに1を追加します。
  • ⊂∘⍵¨:各ビットベクトルについて、各1 で分割します。


1

Python、90バイト

ovsによってアウトゴルフ(私は仕事をしようと思ったものを作る:p)

def f(a):r=[[a]];i=len(a)-1;exec("for s in f(a[:i]):s+=[a[i:]];r+=[s]\ni-=1\n"*i);return r

入力のスライスからパーティションのリストを作成する再帰関数。スライスの長さが1の場合、末尾に到達します。

オンラインでお試しください!

これは、2レベルのインデントではなく2 s のみを意味し、関数全体を1行にすることができるため(スライスの順序は関係ありません)、ループでexec4バイトを節約whileforます(下\n)。

def f(a):
 r=[[a]]
 for i in range(1,len(a)):
  for s in f(a[:i]):s+=[a[i:]];r+=[s]
 return r



1

ルビー62 57バイト

->l{(0..2**l.size).map{|x|l.chunk{1&x/=2}.map &:last}|[]}

オンラインでお試しください!

使い方:

  • パーティションの数は2 ^(n-1)です。その範囲の2進数を反復処理し、0と1のグループを取得して、初期リストのサブセットとしてマップします。
  • 範囲をいじる代わりに、それを二重にし、最後に重複を破棄します。また、最初の2進数を破棄して、チャンク関数を短くすることもできます。

0

JavaScript(ES6)、87バイト

([e,...a],b=[],c=[e],d=[...b,c])=>1/a[0]?[...f(a,b,[...c,a[0]]),...f(a,d,[a[0]])]:[d]

説明:bは前のサブリストのリスト、c現在のサブリスト(最初のサブリストにある必要があるため、配列の最初の要素から始まる)である一方d、すべてのサブリストのリストです。残りの配列要素は、再帰的に処理されます。それぞれの場合、2つのオプションがあります。次の要素が現在のサブリストに追加されるか、現在のサブリストが完了して次の要素が新しいサブリストを開始します。その後、再帰的な結果が連結されます。配列が使い果たされると、すべてのサブリストのリストのリストが結果になります。


0

APL(NARS)38文字、76バイト

{k←↑⍴⍵⋄x←11 1‼k k⋄y←⍵⋄∪{x[⍵;]⊂y}¨⍳↑⍴x}

これはNars関数11 1!kkを使用しますが、非常に遅く、既に9要素のarg配列には使用できません...

  P3←{k←↑⍴⍵⋄x←11 1‼k k⋄y←⍵⋄∪{x[⍵;]⊂y}¨⍳↑⍴x}

  ⍴∘P3¨{1..⍵}¨⍳8
1  2  4  8  16  32  64  128 
  P3 'abcd'
abcd    abc d    ab cd    a bcd    ab c d    a bc d    a b cd    a b c d

以下は、組み込みを使用しない関数です。

r←h w;k;i
   r←⊂,⊂w⋄k←↑⍴w⋄i←1⋄→B
A: r←r,(⊂⊂,i↑w),¨h i↓w⋄i+←1
B: →A×⍳i<k

  h 'abcd'
abcd    a bcd    a b cd    a b c d    a bc d    ab cd    ab c d    abc d
  ⍴∘h¨{1..⍵}¨⍳8
2  4  8  16  32  64  128 

結果ごとにタイプを選択します。

  o h ,1
┌──────┐
│┌1───┐│
││┌1─┐││
│││ 1│││
││└~─┘2│
│└∊───┘3
└∊─────┘
  o h 1 2
┌2───────────────────┐
│┌1─────┐ ┌2────────┐│
││┌2───┐│ │┌1─┐ ┌1─┐││
│││ 1 2││ ││ 1│ │ 2│││
││└~───┘2 │└~─┘ └~─┘2│
│└∊─────┘ └∊────────┘3
└∊───────────────────┘

私はそれがどのように機能するのかわかりません、それは唯一の発見的な試みです...

可能性があります私はいくつかのエラーを犯します。どちらの関数も、1 2 ... nだけでなく、入力に関係なくリストのパーティションを作成します。


0

公理、251バイト

C==>concat;A==>List Any;px(a:A):A==(k:=#a;r:=copy[a];k<=1=>r;i:=1;repeat(i>=k=>break;x:=a.(1..i);y:=a.((i+1)..k);z:=px(y);t:=[x,z.1];for j in 2..#z repeat(w:=(z.j)::A;m:=#w;v:=[x];for q in 1..m repeat v:=C(v,w.q);t:=C(t,[v]));r:=C(r,copy t);i:=i+1);r)

誰かがもっと良いものを見つけたら... ungofとテスト:

pp(a:List Any):List Any==
  k:=#a;r:=copy[a];k<=1=>r;i:=1
  repeat
    i>=k=>break
    x:=a.(1..i);y:=a.((i+1)..k);z:=pp(y);
    t:=[x,z.1]
    for j in 2..#z repeat
           w:=(z.j)::List Any
           m:=#w; v:=[x]
           for q in 1..m repeat 
                       v:=concat(v,w.q);
           t:=concat(t,[v])
    r:=concat(r,copy t);
    i:=i+1
  r

(7) -> px []
 (7)  [[]]
                                                           Type: List Any
(8) -> px [1]
 (8)  [[1]]
                                                           Type: List Any
(9) -> px [1,2]
 (9)  [[1,2],[[1],[2]]]
                                                           Type: List Any
(10) -> px [1,2,3]
 (10)  [[1,2,3],[[1],[2,3]],[[1],[2],[3]],[[1,2],[3]]]
                                                           Type: List Any
(11) -> px [1,2,3,4,5,6]
 (11)
[[1,2,3,4,5,6], [[1],[2,3,4,5,6]], [[1],[2],[3,4,5,6]],
 [[1],[2],[3],[4,5,6]], [[1],[2],[3],[4],[5,6]], [[1],[2],[3],[4],[5],[6]],
 [[1],[2],[3],[4,5],[6]], [[1],[2],[3,4],[5,6]], [[1],[2],[3,4],[5],[6]],
 [[1],[2],[3,4,5],[6]], [[1],[2,3],[4,5,6]], [[1],[2,3],[4],[5,6]],
 [[1],[2,3],[4],[5],[6]], [[1],[2,3],[4,5],[6]], [[1],[2,3,4],[5,6]],
 [[1],[2,3,4],[5],[6]], [[1],[2,3,4,5],[6]], [[1,2],[3,4,5,6]],
 [[1,2],[3],[4,5,6]], [[1,2],[3],[4],[5,6]], [[1,2],[3],[4],[5],[6]],
 [[1,2],[3],[4,5],[6]], [[1,2],[3,4],[5,6]], [[1,2],[3,4],[5],[6]],
 [[1,2],[3,4,5],[6]], [[1,2,3],[4,5,6]], [[1,2,3],[4],[5,6]],
 [[1,2,3],[4],[5],[6]], [[1,2,3],[4,5],[6]], [[1,2,3,4],[5,6]],
 [[1,2,3,4],[5],[6]], [[1,2,3,4,5],[6]]]
                                                           Type: List Any
(12) -> [[i,#px i] for i in [[],[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5,6]] ]
 (12)
[[[],1],[[1],1],[[1,2],2],[[1,2,3],4],[[1,2,3,4],8],[[1,2,3,4,5,6],32]]
                                                      Type: List List Any
(13) -> [#px(i) for i in [[],[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5,6]] ]
 (13)  [1,1,2,4,8,32]
                                            Type: List NonNegativeInteger

これが大きすぎる場合は、それを言って、例を削除します...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.