Daftar kombinasi elemen dalam satu set

10

Diberikan satu set nelemen, tantangannya adalah menulis fungsi yang mencantumkan semua kombinasi kelemen dalam set ini.

Contoh

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

Contoh

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

Aturan (Diedit)

  • Urutan output adalah pilihan Anda.
  • Input dapat berupa semua jenis data. Tetapi output harus jenis yang sama dengan input. Jika input adalah daftar bilangan bulat, output juga harus berupa daftar bilangan bulat. Jika input adalah string (array karakter), output juga harus berupa string.
  • Kode harus bekerja dengan sejumlah variabel input.
  • Anda dapat menggunakan bahasa pemrograman apa pun.
  • Jawabannya harus bisa menggunakan apa saja (string, int, double ...) sebagai input dan output juga.
  • Fungsi bawaan apa pun yang terkait dengan kombinasi dan permutasi dilarang.
  • Kemenangan kode terpendek (dalam hal byte).
  • Tiebreaker: suara.
  • Durasi: 1 minggu.

PS Hati-hati dengan input ekstrim seperti angka negatif, 0, dll.

padawan
sumber
1
Meskipun codegolf.stackexchange.com/questions/6380/… memang memiliki batasan tambahan, jawabannya dapat disalin tidak berubah dan masih akan sulit dikalahkan.
Peter Taylor
1
Dengan Input mungkin semua jenis data. maksud Anda semua jenis data yang dapat diulang atau yang dapat diisi yang diisi dengan semua jenis data? misalnya apakah combos('ab', 1) -> ['a', 'b']valid?
Calvin Hobbies
1
Apa yang seharusnya menjadi output jika input negatif?
Ypnypn
5
Saya tidak melihat bagaimana pertanyaan ini merupakan duplikat dari "Menghasilkan kombinasi tanpa rekursi" ketika hampir setiap jawaban sejauh ini menggunakan rekursi.
xnor
2
Penghapusan pembatasan bukanlah perubahan signifikan. Juga, menggunakan jawaban yang ada untuk menentukan apa yang merupakan duplikat atau bukan bukanlah ide yang baik, karena Anda tidak akan dapat mengidentifikasi duplikat sampai mereka sudah dijawab. Terkadang Anda hanya perlu menggunakan kepala Anda.
Rainbolt

Jawaban:

13

Haskell - 57 46 byte

Bawa, penulis naskah golf.

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

Use case (fungsi yang sama berfungsi secara polimorfis):

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

3% "curang" ➔ ["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
sumber
1
Terima kasih Mark, saya bahkan tidak mempertimbangkan membuatnya infix.
ChaseC
Kebetulan, apa artinya "menghidupkan" dalam dialek Anda? Menurut saya itu menyiratkan tantangan, tetapi itu tidak masuk akal dalam konteks karena versi final Anda masih lebih panjang dari versi awal saya dalam pertanyaan yang duplikat ini.
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)

Fungsi fmengambil daftar Sdan nomor kdan mengembalikan daftar semua sublists panjang kdari S. Daripada mendaftar semua subset dan kemudian memfilter menurut ukuran, saya hanya mendapatkan subset dari ukuran yang dibutuhkan pada setiap langkah.

Saya ingin mulai S.pop()bekerja agar bisa bergaul S[:1]dengan orang S[1:]lain, tetapi sepertinya terlalu banyak mengkonsumsi daftarnya.

Untuk mencegah keberatan solusi Python seperti itu melanggar aturan bahwa "Kode harus bekerja di sejumlah variabel input" karena batas rekursi, saya akan perhatikan bahwa implementasi Stackless Python tidak memiliki batas rekursi (meskipun saya belum benar-benar menguji kode ini dengan itu).

Demonstrasi:

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 []
Tidak
sumber
3

Mathematica 10, 70 karakter

Hanya terjemahan dari jawaban Haskell.

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

Pemakaian:

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

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

alephalpha
sumber
3

Arang , 23 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

    ²                   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
sumber
2

Python - 129

s adalah daftar, k adalah ukuran kombinasi yang akan dihasilkan.

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)
CesiumLifeJacket
sumber
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]

Panggil c untuk menjalankan:

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

Ia mendapat semua permutasi dari daftar dan menyaring yang dengan panjang k.

Hobi Calvin
sumber
2

Pyth , 28

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

Ini (berat) didasarkan pada jawaban Haskell.

Penjelasan:

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)

Catatan: Sementara versi terbaru Pyth, 1.0.9, dirilis malam ini, dan karenanya tidak memenuhi syarat untuk tantangan ini, kode yang sama berfungsi dengan baik di 1.0.8.

isaacg
sumber
2

Haskell + Data.List , 44 byte

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

Cobalah online!


Jawaban 46 byte cukup sulit dikalahkan, tetapi jika Anda memiliki tailsdari Data.ListAnda dapat melakukan 44 byte.

Ad Hoc Garf Hunter
sumber
2

05AB1E , 14 13 byte

goLε¹ybRÏ}ʒgQ

Terinspirasi oleh jawaban @Neil 's Charcoal , jadi pastikan untuk mendukungnya!

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Jika builtin diizinkan, ini bisa jadi 2 byte :

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

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
sumber
2

APL (NARS), 80 karakter, 160 byte

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

tes dan cara menggunakannya:

  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│
└~─┘

outputnya tampaknya ok ... tapi bug mungkin terjadi ...

Dalam praktiknya mengembalikan kekosongan ditetapkan sebagai Zilde jika input alpha di luar jangkauan; jika alpha adalah 1, ia mengembalikan semua elemen dalam set (apakah itu benar?);

Ini di bawah ini tampaknya beberapa char kurang dari 2x lebih lambat di atas:

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

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

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

Kegilaan metode array

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
sumber
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)

Sayangnya, Tio / Mono tampaknya tidak mendukung deklarasi tipe T generik , jadi saya terpaksa kehilangan beberapa byte dengan tipe objek sebagai gantinya.

//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);

Cobalah online!

Innat3
sumber