주어진 요소 목록의 모든 조합을 정렬하여 생성


13

목록과 숫자를 입력으로 사용하고 숫자의 길이와 가능한 모든 조합을 생성하는 코드를 작성하십시오. 예를 들어 목록이 {0,1} 이고 숫자가 2 인 경우 :

00
01
10
11

프로그램은 {0,0,0,0,0,1,1,5,5} 와 같이 목록에서 문자를 두 번 이상 자주 기대하지 않아도됩니다.

목록 순서대로 조합을 정렬하여 인쇄하십시오.

목록 {0,1} 과 숫자 5로 (내 코드 중 일부에서 생성되었으므로 승리하기에는 너무 길다) :

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,0} 및 숫자 2 :

11
10
01
00

보시다시피, 역순 목록은 역순을 의미합니다.

구조를 살펴보면 마치 나무와 같습니다.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


3
중복 된 줄 알았는데 찾을 수 없습니다
Luis Mendo

1
입력 목록이 정렬되지 않은 경우 정렬은 어떻게 작동합니까?
JAD

@Jarko 나는 입력 의 인덱스 튜플이 출력에 정렬되어 있다고 가정합니다
Luis Mendo

1
@brad, OP가 다른 것을 말하지 않는 한 기본 대답은 예입니다.
Stewie Griffin

3
이해가 안됩니다 ... 내 자신의 이름을 사용자 이름으로 사용하면 무엇이 잘못됩니까?
Stewie Griffin

답변:


16

젤리 , 1 바이트

TryItOnline

직교 능력 내장 원자, 왼쪽 인수 항목과 오른쪽 인수 개수를 가진 2 차원 링크 또는 첫 번째 인수 항목 및 두 번째 인수 개수를 포함한 전체 프로그램.


1
1 바이트! 그것은 해결했다!
LMD

4
ZERO 바이트 답변을 제출하겠습니다! 자바에서! 그게 어때요? :) (진심으로, 좋은 골프.)
OldBunny2800

9

하스켈, 20 바이트

(mapM id.).replicate

사용 사례 :

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

replicaten2 매개 변수의 사본을하고 mapM id조합을 구축합니다. Btw는와 mapM id동일 sequence하지만 1 바이트가 적습니다.



6

Pyth, 2 바이트

^F

양식에 입력 list,number하고 목록 목록을 인쇄하는 프로그램입니다 .

테스트 스위트

작동 원리

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

이것은 그것을 해결하는 것처럼 보이지만 다른 누군가가 1 바이트로 이것을 할 수 있습니까?
LMD

그렇습니다. 다른 누군가가 이겼지 만 (젤리, 1 바이트), 좋은 해결책입니다
LMD

6

펄 6 , 15 바이트

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

설명:

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

Perl 6 의 공식 릴리스 이후 Rakudo 릴리스로 업그레이드 한 경우 Ideone 에서 이를 실행할 수 있습니다 .
Brad Gilbert b2gills

5

자바 스크립트 (Firefox 30+), 55 바이트

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

JavaScript 에서이 문제를 해결하는 가장 좋은 방법은 99 %입니다.


4

펄, 30 바이트

28 바이트의 코드 + -nl플래그.

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

그것을 실행하려면 :

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

나는 입력을 숫자 목록으로 취하는 것이 Perl에 논리적이라고 생각합니다. 그러나 판타지를 허용하고 괄호와 쉼표로 입력하면 (질문에 표시된대로) 20 바이트 로 줄일 수 있습니다 .

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

설명 : glob Perl의 초기 목적은 list이며 파일 이름을 반복하지만 인수에 중괄호가 포함되면 각 대괄호 그룹의 한 요소로 구성된 조합이 생성됩니다.
-a입력 공간을 자동 분할하고 결과를 @F배열 안에 넣습니다 .
$"리스트 구분자 : 문자열 안의리스트 요소 사이에 삽입 된 구분자입니다. 우리는에 설정 ,때문에, "{@F"}생산 {.,.}(경우 @F0과 1 포함).
그런 다음 x문자열 반복 연산자입니다 ( <>한 줄의 입력을받습니다).
마지막으로 say for생성 된 목록을 반복 glob하고 요소를 인쇄합니다.


4

Mathematica, 6 바이트

Tuples

아직도 젤리보다 나쁘다 :(

용법

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

파이썬, 57 바이트

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

반복

이름없는 함수는 개체 목록 o과 개수를 가져 와서 n조합 목록을 반환합니다.


3

퓨어 배쉬, 36

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

명령 줄 매개 변수로 입력-목록은 쉼표로 구분 된 괄호로 묶은 목록입니다. 예 :

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

입력 목록을 인용해야 호출 쉘이 너무 빨리 확장되지 않습니다.

Ideone .


작동하지 않는 것 같습니다.
Ipor Sircer

입력을 n 번만 반복하고 가능한 모든 조합을 인쇄하지는 않습니다.
Ipor Sircer

@IporSircer 필요한 입력 형식을 명확히했습니다. 그게 지금 당신을 위해 작동합니까?
디지털 외상

bash a.sh "{0,1}" 2-> {0,1}{0,1}(version 4.4.5 (1) -release)
Ipor Sircer

1
@IporSircer 아마도 TIO가 인수를 execve () 또는 유사한 호출에 넣는 것 같습니다. 인용 부호는 호출 쉘이 중괄호를 확장하지 못하도록하기 위해 다른 쉘에서 스크립트를 호출 할 때만 필요합니다. 나는 TIO 경우, 목록에는 따옴표가 필요하지 않습니다. tio.run/nexus/…
Digital Trauma

3

R , 53 45 바이트

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

온라인으로 사용해보십시오!

rev 요청 된 정확한 정렬 순서 (문제에 꼭 필요한 것으로 보이지는 않음)를 준수하고 5 바이트를 추가합니다.


그냥 rev위한 45 바이트 :
JayCe

마음에 행렬이 있었고 결과가 실제로 목록 (데이터 프레임)임을 잊었습니다.
ngm

1

라켓 123 바이트

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

언 골프 드 :

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

테스트 :

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

산출:

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 바이트

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

길이를 첫 번째 인수로 사용하고 목록을 추가 인수로 사용합니다.
다음과 같이 사용하십시오.

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

길이 0을 요청하면 "메모리 부족"치명적인 오류가 발생합니다.


길이 0을 처리 할 필요가 없습니다.
LMD

1

05AB1E , 2 개 1 바이트

ã

@Enigma 덕분에 -1 바이트 .

온라인으로 사용해보십시오.

로 입력 number\nlist 목록 목록으로 출력하십시오.

설명:

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

1
당신은 I여기 필요하지 않습니다 .
Emigna

물론 @Emigna Ah. 나는 I처음에 여러 입력을하는 방법을 알아 내려고하고 숫자와 목록을 뒤집어 놓았 기 때문에 가지고있었습니다. I거기 를 유지하는 꽤 바보 .. 감사합니다!
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.