Hasilkan semua kombinasi dari daftar elemen yang diberikan, diurutkan

13

Buat kode yang mengambil daftar dan angka sebagai input, dan menghasilkan semua kemungkinan kombinasi dengan panjang angka. Misalnya, dengan daftar {0,1} dan angka 2 :

00
01
10
11

Program Anda tidak harus mengharapkan karakter dua kali atau lebih sering dalam daftar, seperti {0,0,0,0,0,1,1,5,5}

Pastikan Anda mencetak kombinasi diurutkan, sesuai urutan daftar:

Dengan daftar {0,1} dan angka 5 (dihasilkan oleh beberapa kode saya, yang terlalu lama untuk dimenangkan):

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

Tetapi dengan daftar {1,0} dan angka 2 :

11
10
01
00

Seperti yang Anda lihat, daftar terbalik berarti urutan terbalik.

Lihatlah strukturnya, itu seperti pohon.

Ini adalah kode-golf, jadi kode terpendek dalam byte menang!

LMD
sumber
3
Saya pikir ini akan menjadi duplikat, tetapi saya tidak dapat menemukannya
Luis Mendo
1
Bagaimana cara penyortiran bekerja jika daftar input tidak diurutkan?
JAD
@Jarko Saya menganggap tupel indeks input diurutkan dalam output
Luis Mendo
1
@brad, jawaban standarnya adalah ya kecuali OP telah mengatakan sesuatu yang lain.
Stewie Griffin
3
Saya tidak mengerti ... apa yang salah dengan menggunakan nama saya sendiri sebagai nama pengguna?
Stewie Griffin

Jawaban:

16

Jelly , 1 byte

TryItOnline

Kekuatan bawaan Cartesian atom, sebagai hubungan diad dengan argumen kiri item dan argumen kanan hitungan, atau sebagai program lengkap dengan argumen pertama item dan argumen kedua hitungan.

Jonathan Allan
sumber
1
Satu byte! Itu menyelesaikannya!
LMD
4
Anda tahu, saya akan mengirimkan jawaban NOL byte! Di JAWA! Bagaimana Anda suka itu, ya? :) (Serius, meskipun.
Bermain
9

Haskell, 20 byte

(mapM id.).replicate

Contoh penggunaan:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicatemembuat nsalinan dari parameter ke-2 dan mapM idmembuat kombinasi. Btw, mapM idsama dengan sequence, tetapi 1 byte lebih sedikit.

nimi
sumber
6

Pyth, 2 byte

^F

Program yang mengambil input dalam bentuk list,numberdan mencetak daftar daftar.

Suite uji

Bagaimana itu bekerja

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print
TheBikingViking
sumber
ini tampaknya menyelesaikannya, tetapi mungkin orang lain dapat melakukan ini dengan satu byte?
LMD
ya, orang lain menang (jelly, satu byte) tetapi solusi yang bagus, toh
LMD
6

Perl 6 , 15 byte

{[X] @^a xx$^b}

Penjelasan:

{[X] @^a xx$^b}

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111
Brad Gilbert b2gills
sumber
Jika mereka meng-upgrade ke rilis Rakudo dari setelah rilis resmi Perl 6 Anda akan dapat menjalankan ini di Ideone .
Brad Gilbert b2gills
5

JavaScript (Firefox 30+), 55 byte

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

Saya 99% rekursi tertentu adalah cara terbaik untuk melakukannya dalam JavaScript.

Produksi ETH
sumber
4

Perl, 30 byte

28 byte kode + -nlbendera.

$"=",";say for glob"{@F}"x<>

Untuk menjalankannya:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

Saya pikir mengambil input sebagai daftar angka adalah logis untuk Perl. Namun, jika kita mengizinkan fantasi, dan mengambil input dengan tanda kurung dan koma (seperti yang ditunjukkan dalam pertanyaan), kita bisa turun hingga 20 byte :

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

Penjelasan: glob tujuan awal di Perl adalah daftar dan beralih melalui nama file, tetapi ketika argumennya berisi kurung keriting, ia menghasilkan kombinasi yang dibentuk dari satu elemen dari setiap grup braket.
-aautosplit pada spasi input, dan letakkan hasilnya di dalam @Farray.
$"adalah pemisah daftar: pemisah yang disisipkan di antara elemen daftar di dalam string. Kami mengaturnya ,, jadi "{@F"}menghasilkan {.,.}(jika @Fberisi 0 dan 1).
Kemudian xadalah operator pengulangan string (dan <>mendapat satu baris input).
Dan akhirnya, say formengulangi daftar yang dihasilkan oleh globdan mencetak elemen.

Dada
sumber
4

Mathematica, 6 byte

Tuples

Masih lebih buruk dari Jelly :(

Pemakaian

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}

JungHwan Min
sumber
3

Python, 57 byte

from itertools import*
lambda o,n:list(product(*([o]*n)))

repl.it

Fungsi yang tidak disebutkan namanya mengambil daftar objek, odan menghitung, ndan mengembalikan daftar kombinasi.

Jonathan Allan
sumber
3

Pure Bash, 36

printf -vv %$2s
eval echo ${v// /$1}

Input oleh params baris perintah - Daftar ini adalah daftar yang dipisahkan koma dalam kurung, misalnya:

./elemcombo.sh "{0,1}" 2

Perhatikan daftar input perlu dikutip sehingga shell panggilan tidak memperluasnya terlalu dini.

Ideone .

Trauma Digital
sumber
Ini sepertinya tidak berhasil.
Ipor Sircer
Itu hanya mengulangi input n kali, tidak mencetak semua kombinasi yang mungkin.
Ipor Sircer
@IporSircer Saya mengklarifikasi format input yang diperlukan. Apakah itu berhasil untuk Anda sekarang?
Digital Trauma
bash a.sh "{0,1}" 2-> {0,1}{0,1}(versi 4.4.5 (1) -release)
Ipor Sircer
1
@IporSircer Sepertinya TIO mungkin menempatkan args ke dalam execve () atau panggilan serupa. Kutipan hanya diperlukan ketika skrip dipanggil dari shell lain untuk mencegah shell panggilan dari melakukan ekspansi kawat gigi. Saya kasus TIO, daftar tidak perlu penawaran. tio.run/nexus/…
Digital Trauma
3

R , 53 45 byte

function(x,n)rev(expand.grid(rep(list(x),n)))

Cobalah online!

rev ada di sana untuk menyesuaikan dengan urutan sortir yang diminta (yang tidak benar-benar tampak penting untuk masalah) dan menambahkan 5 byte.

ngm
sumber
Hanya revuntuk 45 byte :)
JayCe
Punya matriks pada pikiran dan lupa hasilnya sebenarnya daftar (frame data).
ngm
1

Racket 123 byte

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

Tidak Disatukan:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

Pengujian:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

Keluaran:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111
juga
sumber
1

PHP, 109 byte

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

Mengambil panjang sebagai argumen pertama dan daftar sebagai argumen lebih lanjut.
Gunakan seperti:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

Akan mengalami kesalahan fatal "kehabisan memori" jika ditanya panjang 0.

pengguna59178
sumber
Anda tidak harus menangani panjang 0.
LMD
1

05AB1E , 2 1 byte s

ã

-1 byte terima kasih @Enigma .

Cobalah online.

Masukkan sebagai number\nlist , keluaran sebagai daftar daftar.

Penjelasan:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times
Kevin Cruijssen
sumber
1
Anda tidak perlu di Isini.
Emigna
@Emigna Ah tentu saja. Saya punya Ikarena saya awalnya mencoba mencari cara untuk memiliki beberapa input dan nomor dan daftar dibalik. Sangat bodoh untuk tetap di Isana .. Terima kasih!
Kevin Cruijssen