Tạo tất cả các kết hợp của danh sách các yếu tố nhất định, được sắp xếp


13

Tạo một mã lấy danh sách và số làm đầu vào và tạo tất cả các kết hợp có thể có với độ dài của số. Ví dụ: với danh sách {0,1} và số 2 :

00
01
10
11

Chương trình của bạn không phải mong đợi các ký tự hai lần hoặc nhiều hơn trong danh sách, chẳng hạn như {0,0,0,0,0,1,1,5,5}

Hãy chắc chắn rằng bạn in các kết hợp ra được sắp xếp, theo thứ tự của danh sách:

Với danh sách {0,1} và số 5 (được tạo bởi một số mã của tôi, đây là một cách quá dài để giành chiến thắng):

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

Nhưng với danh sách {1,0} và số 2 :

11
10
01
00

Như bạn có thể thấy, danh sách đảo ngược có nghĩa là thứ tự đảo ngược.

Hãy nhìn vào cấu trúc, nó giống như một cái cây.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


3
Tôi nghĩ rằng điều này sẽ trùng lặp, nhưng tôi không thể tìm thấy một
Luis Mendo

1
Làm thế nào để sắp xếp hoạt động nếu danh sách đầu vào không được sắp xếp?
JAD

@Jarko Tôi giả sử các bộ chỉ số của đầu vào được sắp xếp trong đầu ra
Luis Mendo

1
@brad, câu trả lời mặc định là có trừ khi OP đã nói điều gì khác.
Stewie Griffin

3
Tôi không hiểu ... có gì sai khi sử dụng tên riêng của mình làm tên người dùng?
Stewie Griffin

Câu trả lời:


16

Thạch , 1 byte

Dùng thử

Nguyên tử tích hợp của Cartesian, như một liên kết dyadic với đối số bên trái các mục và đối số bên phải đếm, hoặc như một chương trình đầy đủ với đối số thứ nhất là các mục và đối số thứ hai là đếm.


1
Một byte! Điều đó đã giải quyết nó!
LMD

4
Bạn biết những gì, tôi sẽ gửi một câu trả lời byte ZERO! Trong JAVA! Làm thế nào để bạn thích điều đó, phải không? :) (Nghiêm túc, mặc dù.
Chơi

9

Haskell, 20 byte

(mapM id.).replicate

Sử dụng exaple:

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

replicatetạo các nbản sao của tham số thứ 2 và mapM idxây dựng các kết hợp. Btw, mapM idgiống như sequence, nhưng ít hơn 1 byte.



6

Bình thường, 2 byte

^F

Một chương trình lấy đầu vào trong biểu mẫu list,numbervà in một danh sách các danh sách.

Bộ kiểm tra

Làm thế nào nó hoạt động

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print

điều này dường như để giải quyết nó, nhưng có lẽ ai đó khác có thể làm điều này với một byte?
LMD

vâng, dù sao thì ai đó đã thắng (thạch, một byte) nhưng giải pháp tốt, dù sao đi nữa
LMD

6

Perl 6 , 15 byte

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

Giải trình:

{[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

Nếu họ từng nâng cấp lên bản phát hành Rakudo từ sau khi phát hành chính thức Perl 6, bạn sẽ có thể chạy bản này tại 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]]:[[]]

Tôi là đệ quy nhất định 99% là cách tốt nhất để giải quyết vấn đề này trong JavaScript.


4

Perl, 30 byte

28 byte mã + -nlcờ.

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

Để chạy nó:

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

Tôi nghĩ rằng việc lấy đầu vào làm danh sách các số là hợp lý cho Perl. Tuy nhiên, nếu chúng tôi cho phép một số ảo mộng và lấy đầu vào bằng dấu ngoặc và dấu phẩy (như được hiển thị trong câu hỏi), chúng tôi có thể giảm xuống còn 20 byte :

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

Giải thích: glob mục đích ban đầu trong Perl là liệt kê và lặp qua tên tệp, nhưng khi đối số của nó chứa dấu ngoặc nhọn, nó tạo ra các kết hợp được tạo thành từ một thành phần của mỗi nhóm khung.
-aautosplit trên khoảng trắng đầu vào và đặt kết quả vào trong @Fmảng.
$"là dấu phân cách danh sách: đó là dấu phân cách được chèn giữa các phần tử của danh sách bên trong chuỗi. Chúng tôi đặt nó thành ,, do đó "{@F"}tạo ra {.,.}(nếu @Fchứa 0 và 1).
Sau đó xlà toán tử lặp lại chuỗi (và <>nhận một dòng đầu vào).
Và cuối cùng, say forlặp qua danh sách được tạo bởi globvà in các phần tử.


4

Toán học, 6 byte

Tuples

Vẫn tệ hơn Jelly :(

Sử dụng

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}}


3

Python, 57 byte

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

thay thế

Hàm không tên lấy danh sách các đối tượng ovà đếm nvà trả về danh sách các kết hợp.


3

Bash thuần khiết, 36

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

Nhập theo thông số dòng lệnh - Danh sách là danh sách được phân tách bằng dấu phẩy trong dấu ngoặc nhọn, ví dụ:

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

Lưu ý danh sách đầu vào cần được trích dẫn để shell gọi không mở rộng quá sớm.

Ideone .


Điều này dường như không hoạt động.
Ipor Sircer

Nó chỉ lặp lại đầu vào n lần, không in tất cả các kết hợp có thể.
Ipor Sircer

@IporSircer Tôi đã làm rõ định dạng đầu vào cần thiết. Điều đó có làm việc cho bạn bây giờ không?
Chấn thương kỹ thuật số

bash a.sh "{0,1}" 2-> {0,1}{0,1}(phiên bản 4.4.5 (1) - phát hành)
Ipor Sircer

1
@IporSircer Có vẻ như TIO có thể đang đưa các đối số vào một cuộc gọi execve () hoặc tương tự. Các trích dẫn chỉ cần thiết khi tập lệnh được gọi từ shell khác để ngăn shell gọi thực hiện mở rộng dấu ngoặc. Tôi là trường hợp TIO, danh sách không cần báo giá. tio.run/nexus/ từ
Chấn thương kỹ thuật số

3

R , 53 45 byte

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

Hãy thử trực tuyến!

rev có phù hợp với thứ tự sắp xếp chính xác được yêu cầu (điều này không thực sự cần thiết cho vấn đề) và thêm 5 byte.


Chỉ revvới 45 byte :)
JayCe

Có ma trận trong tâm trí và quên kết quả thực sự là một danh sách (khung dữ liệu).
ngm

1

Vợt 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))))

Ung dung:

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

Kiểm tra:

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

Đầu ra:

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

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

Lấy độ dài làm đối số đầu tiên và danh sách như bất kỳ đối số nào khác.
Sử dụng như:

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

Sẽ gặp phải lỗi nghiêm trọng "hết bộ nhớ" nếu được yêu cầu độ dài 0.


Bạn sẽ không phải xử lý độ dài 0.
LMD

1

05AB1E , 2 1 byte s

ã

-1 byte nhờ @Enigma .

Hãy thử trực tuyến.

Nhập như number\nlist , đầu ra như danh sách danh sách.

Giải trình:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times

1
Bạn không cần Iở đây.
Emigna

@Emigna À tất nhiên rồi. Tôi đã có Ibởi vì ban đầu tôi đã cố gắng tìm ra làm thế nào để có nhiều đầu vào và số lượng và danh sách bị đảo ngược. Khá ngu ngốc để giữ Iở đó .. Cảm ơn!
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.