Listen Sie die Kombinationen von Elementen in einer Menge auf

10

Bei einer Reihe von nElementen besteht die Herausforderung darin, eine Funktion zu schreiben, die alle Kombinationen von kElementen in dieser Menge auflistet .

Beispiel

Set: [1, 7, 4]
Input: 2
Output: [1,7], [1,4], [7,4]

Beispiel

Set: ["Charlie", "Alice", "Daniel", "Bob"]
Input: 2
Output ["Daniel", "Bob"], ["Charlie", "Alice"], ["Alice", "Daniel"], ["Charlie", "Daniel"], ["Alice", "Bob"], ["Charlie",  "Bob"]

Regeln (bearbeitet)

  • Die Reihenfolge der Ausgabe ist Ihre Wahl.
  • Die Eingabe kann eine beliebige Art von Daten sein. Die Ausgabe sollte jedoch vom selben Typ sein wie die Eingabe. Wenn die Eingabe eine Liste von Ganzzahlen ist, sollte die Ausgabe auch eine Liste von Ganzzahlen sein. Wenn die Eingabe eine Zeichenfolge (Array von Zeichen) ist, sollte die Ausgabe ebenfalls eine Zeichenfolge sein.
  • Der Code sollte mit einer beliebigen Anzahl von Eingabevariablen funktionieren.
  • Sie können jede Programmiersprache verwenden.
  • Die Antwort sollte in der Lage sein, alles (string, int, double ...) als Eingabe und Ausgabe zu verwenden.
  • Alle integrierten Funktionen, die sich auf Kombinationen und Permutationen beziehen, sind verboten.
  • Der kürzeste Code gewinnt (in Bytes).
  • Tiebreaker: Stimmen.
  • Dauer: 1 Woche.

PS Achten Sie auf extreme Eingaben wie negative Zahlen, 0 usw.

Padawan
quelle
1
Obwohl codegolf.stackexchange.com/questions/6380/… eine zusätzliche Einschränkung aufweist, können die Antworten unverändert kopiert werden und sind immer noch schwer zu übertreffen.
Peter Taylor
1
Durch Die Eingabe kann eine beliebige Art von Daten sein. Meinen Sie irgendeine Art von iterierbaren Daten oder eine iterable, die mit irgendeiner Art von Daten gefüllt ist? zB ist combos('ab', 1) -> ['a', 'b']gültig?
Calvins Hobbys
1
Was soll der Ausgang sein, wenn der Eingang negativ ist?
Ypnypn
5
Ich sehe nicht, wie diese Frage ein Duplikat von "Generieren von Kombinationen ohne Rekursion" ist, wenn fast jede Antwort bisher Rekursion verwendet.
xnor
2
Die Aufhebung einer Beschränkung ist keine wesentliche Änderung. Es ist auch keine gute Idee, vorhandene Antworten zu verwenden, um festzustellen, was ein Duplikat ist oder nicht, da Sie Duplikate erst identifizieren können, wenn sie bereits beantwortet wurden. Manchmal muss man nur den Kopf benutzen.
Rainbolt

Antworten:

13

Haskell - 57 46 Bytes

Bring es an, Golfscripters.

0%_=[[]]
n%(x:y)=map(x:)((n-1)%y)++n%y
_%_=[]

Anwendungsfall (gleiche Funktion funktioniert polymorph):

2% [1,2,3,4] ➔ [[1,2], [1,3], [1,4], [2,3], [2,4], [3,4]]

3% "betrügen" ➔ ["che", "cha", "cht", "cea", "cet", "cat", "hea", "het", "hat", "eat"]

2% ["Charlie", "Alice", "Daniel", "Bob"] ➔ [["Charlie", "Alice"], ["Charlie", "Daniel"], ["Charlie", "Bob"] , ["Alice", "Daniel"], ["Alice", "Bob"], ["Daniel", "Bob"]]

ChaseC
quelle
1
Danke Mark, ich habe nicht einmal darüber nachgedacht, es zu einem Infix zu machen.
ChaseC
Was bedeutet übrigens "Bring it on" in Ihrem Dialekt? In meinem Fall bedeutet dies eine Herausforderung, aber das macht im Kontext keinen Sinn, da Ihre endgültige Version in der Frage, die dies dupliziert, immer noch länger ist als meine ursprüngliche Version .
Peter Taylor
7

Python (72)

f=lambda S,k:S and[T+S[:1]for T in f(S[1:],k-1)]+f(S[1:],k)or[[]]*(k==0)

Die Funktion fnimmt eine Liste Sund eine Nummer kund gibt eine Liste aller Unterlisten mit einer Länge kvon zurück S. Anstatt alle Teilmengen aufzulisten und dann nach Größe zu filtern, erhalte ich bei jedem Schritt nur die Teilmengen der erforderlichen Größe.

Ich würde gerne zur S.pop()Arbeit gehen, um das Erhalten S[:1]mit dem S[1:]späteren Bestehen zu kombinieren , aber es scheint die Liste zu viel zu verbrauchen.

Um dem Einwand einer solchen Python-Lösung vorzubeugen, verstößt eine solche Python-Lösung aufgrund von Rekursionsbeschränkungen gegen die Regel "Der Code sollte in einer beliebigen Anzahl von Eingabevariablen funktionieren". Ich stelle fest, dass die stapellose Python-Implementierung keine Rekursionsbeschränkungen aufweist (obwohl ich sie nicht getestet habe diesen Code damit).

Demonstration:

S = [1, 2, 6, 8]
for i in range(-1,6):print(i, f(S,i))

#Output:    
-1 []
0 [[]]
1 [[1], [2], [6], [8]]
2 [[2, 1], [6, 1], [8, 1], [6, 2], [8, 2], [8, 6]]
3 [[6, 2, 1], [8, 2, 1], [8, 6, 1], [8, 6, 2]]
4 [[8, 6, 2, 1]]
5 []
xnor
quelle
3

Mathematica 10, 70 Zeichen

Nur eine Übersetzung der Haskell-Antwort.

_~f~_={};_~f~0={{}};{x_,y___}~f~n_:=Join[Append@x/@f[{y},n-1],{y}~f~n]

Verwendungszweck:

In [1]: = f [{1, 7, 4}, 2]

Out [1] = {{7, 1}, {4, 1}, {4, 7}}

Alephalpha
quelle
3

Holzkohle , 23 Bytes

EΦEX²Lθ⮌↨ι²⁼ΣιηΦ…θLι§ιμ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

    ²                   Literal 2
   X                    Raised to power
     L                  Length of
      θ                 Input array
  E                     Mapped over implicit range
         ι              Current index
        ↨               Converted to base
          ²             Literal 2
       ⮌                Reversed
 Φ                      Filtered on
            Σ           Digital sum of
             ι          Current base 2 value
           ⁼            Equal to
              η         Input `k`
E                       Mapped to
                 θ      Input array
                …       Chopped to length
                  L     Length of
                   ι    Current base 2 value
               Φ        Filtered on
                     ι  Current base 2 value
                    §   Indexed by
                      μ Current index
Neil
quelle
2

Python - 129

s ist eine Liste, k ist die Größe der zu erzeugenden Kombinationen.

def c(s, k):
    if k < 0: return []
    if len(s) == k: return [s]
    return list(map(lambda x: [s[0]]+x, c(s[1:], k-1))) + c(s[1:], k)
CäsiumLifeJacket
quelle
2

Python, 102

p=lambda s:p(s[1:])+[x+[s[0]]for x in p(s[1:])]if s else[s];c=lambda s,k:[x for x in p(s)if len(x)==k]

Rufen Sie c auf, um Folgendes auszuführen:

c ([5, 6, 7], 2) => [[6, 7], [5, 7], [5, 6]]

Es erhält alle Permutationen der Liste s und filtert diejenigen mit der Länge k.

Calvins Hobbys
quelle
2

Pyth , 28

DcGHR?+m+]'HdctGtHcGtHH*]Y!G

Dies basiert (stark) auf der Antwort von Haskell.

Erläuterung:

DcGH                           def c(G,H):
    R                          return
     ?                         Python's short circuiting _ if _ else _
       m+]'Hd                  map to [head(H)]+d
             ctGtH             c(G-1,tail(H))
       m+]'HdctGtH             map [head(H)]+d for d in c(tail(G),tail(H))
      +m+]'HdctGtHcGtH         (the above) + c(G,tail(H))
     ?                H        (the above) if H else (the below)
                       *]Y!G   [[]]*(not G)

Hinweis: Während die neueste Version von Pyth, 1.0.9, heute Abend veröffentlicht wurde und daher für diese Herausforderung nicht geeignet ist, funktioniert derselbe Code in 1.0.8 einwandfrei.

isaacg
quelle
2

Haskell + Data.List , 44 Bytes

0%_=[[]]
n%y=do{a:b<-tails y;(a:)<$>(n-1)%b}

Probieren Sie es online aus!


Die 46 - Byte - Antwort ist ziemlich schwer zu schlagen , aber wenn man tailsvon Data.ListIhnen 44 Bytes tun.

Ad-hoc-Garf-Jäger
quelle
2

05AB1E , 14 13 Bytes

goLε¹ybRÏ}ʒgQ

Inspiriert von @Neils Charcoal-Antwort , stimmen Sie ihn also unbedingt ab!

Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .

Wenn Buildins erlaubt wären, könnten dies 2 Bytes sein :

Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .

Erläuterung:

g              # Get the length of the first (implicit) input-list
 o             # Take 2 to the power this length
  L            # Create a list in the range [1, 2**length]
   ε           # Map each integer `y` to:
    ¹          #  Push the first input-list again
     ybR       #  Convert integer `y` to binary, and reverse it
        Ï      #  And only keep values at truthy indices of `y` (so where the bit is a 1)
             # After the map: filter the list of lists by:
           g   #  Where the length of the inner list
            Q  #  Is equal to the (implicit) input-integer
               # (then the result is output implicitly)

             # Get all `b`-element combinations in list `a`,
               # where `b` is the first (implicit) input-integer,
               # and `a` is the second (implicit) input-list
               # (then the result is output implicitly)
Kevin Cruijssen
quelle
2

APL (NARS), 80 Zeichen, 160 Byte

{h←{0=k←⍺-1:,¨⍵⋄(k<0)∨k≥i←≢w←⍵:⍬⋄↑,/{w[⍵],¨k h w[(⍳i)∼⍳⍵]}¨⍳i-k}⋄1≥≡⍵:⍺h⍵⋄⍺h⊂¨⍵}

Test und wie man es benutzt:

  f←{h←{0=k←⍺-1:,¨⍵⋄(k<0)∨k≥i←≢w←⍵:⍬⋄↑,/{w[⍵],¨k h w[(⍳i)∼⍳⍵]}¨⍳i-k}⋄1≥≡⍵:⍺h⍵⋄⍺h⊂¨⍵}
  o←⎕fmt
  o 5 f 1 2 3 4
┌0─┐
│ 0│
└~─┘
  o 4 f 1 2 3 4 
┌1─────────┐
│┌4───────┐│
││ 1 2 3 4││
│└~───────┘2
└∊─────────┘
  o 3 f 1 2 3 4
┌4──────────────────────────────────┐
│┌3─────┐ ┌3─────┐ ┌3─────┐ ┌3─────┐│
││ 1 2 3│ │ 1 2 4│ │ 1 3 4│ │ 2 3 4││
│└~─────┘ └~─────┘ └~─────┘ └~─────┘2
└∊──────────────────────────────────┘
  o 2 f 1 2 3 4
┌6────────────────────────────────────────┐
│┌2───┐ ┌2───┐ ┌2───┐ ┌2───┐ ┌2───┐ ┌2───┐│
││ 1 2│ │ 1 3│ │ 1 4│ │ 2 3│ │ 2 4│ │ 3 4││
│└~───┘ └~───┘ └~───┘ └~───┘ └~───┘ └~───┘2
└∊────────────────────────────────────────┘
  o 1 f 1 2 3 4
┌4──────────────────┐
│┌1─┐ ┌1─┐ ┌1─┐ ┌1─┐│
││ 1│ │ 2│ │ 3│ │ 4││
│└~─┘ └~─┘ └~─┘ └~─┘2
└∊──────────────────┘
  o 0 f 1 2 3 4
┌0─┐
│ 0│
└~─┘
  o ¯1 f 1 2 3 4
┌0─┐
│ 0│
└~─┘
  o 3 f (0 0)(1 2)(3 ¯4)(4 ¯5)
┌4────────────────────────────────────────────────────────────────────────────────────────────────┐
│┌3────────────────────┐ ┌3────────────────────┐ ┌3─────────────────────┐ ┌3─────────────────────┐│
││┌2───┐ ┌2───┐ ┌2────┐│ │┌2───┐ ┌2───┐ ┌2────┐│ │┌2───┐ ┌2────┐ ┌2────┐│ │┌2───┐ ┌2────┐ ┌2────┐││
│││ 0 0│ │ 1 2│ │ 3 ¯4││ ││ 0 0│ │ 1 2│ │ 4 ¯5││ ││ 0 0│ │ 3 ¯4│ │ 4 ¯5││ ││ 1 2│ │ 3 ¯4│ │ 4 ¯5│││
││└~───┘ └~───┘ └~────┘2 │└~───┘ └~───┘ └~────┘2 │└~───┘ └~────┘ └~────┘2 │└~───┘ └~────┘ └~────┘2│
│└∊────────────────────┘ └∊────────────────────┘ └∊─────────────────────┘ └∊─────────────────────┘3
└∊────────────────────────────────────────────────────────────────────────────────────────────────┘
  o 4 f (0 0)(1 2)(3 ¯4)(4 ¯5)
┌1──────────────────────────────┐
│┌4────────────────────────────┐│
││┌2───┐ ┌2───┐ ┌2────┐ ┌2────┐││
│││ 0 0│ │ 1 2│ │ 3 ¯4│ │ 4 ¯5│││
││└~───┘ └~───┘ └~────┘ └~────┘2│
│└∊────────────────────────────┘3
└∊──────────────────────────────┘
  o 1 f (0 0)(1 2)(3 ¯4)(4 ¯5)
┌4────────────────────────────────────┐
│┌1─────┐ ┌1─────┐ ┌1──────┐ ┌1──────┐│
││┌2───┐│ │┌2───┐│ │┌2────┐│ │┌2────┐││
│││ 0 0││ ││ 1 2││ ││ 3 ¯4││ ││ 4 ¯5│││
││└~───┘2 │└~───┘2 │└~────┘2 │└~────┘2│
│└∊─────┘ └∊─────┘ └∊──────┘ └∊──────┘3
└∊────────────────────────────────────┘
  o 2 f ('Charli')('Alice')('Daniel')('Bob')
┌6──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│┌2─────────────────┐ ┌2──────────────────┐ ┌2───────────────┐ ┌2─────────────────┐ ┌2──────────────┐ ┌2───────────────┐│
││┌6──────┐ ┌5─────┐│ │┌6──────┐ ┌6──────┐│ │┌6──────┐ ┌3───┐│ │┌5─────┐ ┌6──────┐│ │┌5─────┐ ┌3───┐│ │┌6──────┐ ┌3───┐││
│││ Charli│ │ Alice││ ││ Charli│ │ Daniel││ ││ Charli│ │ Bob││ ││ Alice│ │ Daniel││ ││ Alice│ │ Bob││ ││ Daniel│ │ Bob│││
││└───────┘ └──────┘2 │└───────┘ └───────┘2 │└───────┘ └────┘2 │└──────┘ └───────┘2 │└──────┘ └────┘2 │└───────┘ └────┘2│
│└∊─────────────────┘ └∊──────────────────┘ └∊───────────────┘ └∊─────────────────┘ └∊──────────────┘ └∊───────────────┘3
└∊──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  o ¯2 f ('Charli')('Alice')('Daniel')('Bob')
┌0─┐
│ 0│
└~─┘

Die Ausgabe scheint in Ordnung zu sein ... aber Fehler sind möglich ...

In der Praxis wird void als Zilde festgelegt zurückgegeben, wenn das eingegebene Alpha außerhalb des Bereichs liegt. Wenn Alpha 1 ist, werden alle Elemente in seiner Menge zurückgegeben (stimmt das?).

Dies unten scheint ein paar Zeichen weniger, aber 2x langsamer oben:

f←{(⍺>≢⍵)∨⍺≤0:⍬⋄1=⍺:,¨⍵⋄{w[⍵]}¨k/⍨{∧/</¨¯1↓{⍵,¨1⌽⍵}⍵}¨k←,⍳⍺⍴≢w←⍵}
RosLuP
quelle
1

JS - 117 188

(a,b,c=[])=>((d=(e,f,g=[])=>f*e?g.push(e)+d(e-1,f-1,g)+g.pop
()+d(e-1,f,g):f||c.push(g.map(b=>a[b-1])))(a.length,b),c)

(<Quellcode>) (['Bob', 'Sally', 'Jonah'], 2)

     [['Jonah', 'Sally'] ['Jonah', 'Bob'] ['Sally', 'Bob']]

Array-Methoden-Wahnsinn

combination = (arr, k) =>
    Array
        .apply(0, { length: Math.pow(k+1, arr.length) })
        .map(Number.call, Number)
        .map(a => a
              .toString(arr.length)
              .split('')
              .sort()
              .filter((a, b, c) => c.indexOf(a) == b)
              .join(''))
        .filter((a, b, c) => a.length == k && c.indexOf(a) == b)
        .map(x => x.split('').map(y => arr[+y]))
bebe
quelle
1

C # (Visual C # Interactive Compiler) , 141 Byte

l=>l.Any()?A(l.Skip(1)).Select(x=>l.Take(1).Union(x)).Union(A(l.Skip(1))):new object[][]{new object[]{}};B=(n,l)=>A(l).Where(x=>x.Count()==n)

Leider scheint Tio / Mono keine generische Typ- T- Deklaration zu unterstützen, daher bin ich gezwungen, stattdessen ein paar Bytes mit dem Objekttyp zu verlieren .

//returns a list of all the subsets of a list
A=l=>l.Any()?A(l.Skip(1)).Select(x=>l.Take(1).Union(x)).Union(A(l.Skip(1))):new object[][]{new object[]{}};

//return the subsets of the required size
B=(n,l)=>A(l).Where(x=>x.Count()==n);

Probieren Sie es online aus!

Innat3
quelle