반복되는 순서 조합 생성


9

다른 문자의 문자열과 숫자 n이 주어지면 해당 문자를 사용하여 길이가 1에서 n까지의 반복 된 모든 정렬 조합을 생성하십시오.

그것을 정의하는 또 다른 방법은 주어진 문자를 문자 수의 기수 (기수)에서 "사용자 정의"자릿수로 보는 것입니다. 그러면 프로그램은 그 기저에서 1에서 n 자릿수의 모든 "숫자"를 생성해야합니다. "제로"도 포함되어 있습니다.

조합은 길이 (1 문자, 2 등) 순서로 정렬해야하지만, 순서는 상관 없습니다. 입력 및 출력을 처리하는 가장 편리한 방법을 선택할 수 있습니다. 가장 짧은 코드가 승리합니다.

예 :

ab, 3-> a,b,aa,ab,ba,bb,aaa,aab,aba,baa,abb,bab,bba,bbb
0123456789, 2->0,1,2,3,4,5,6,7,8,9,00,01,...,09,10,11,...,99


진심이야? "카운트"?
피터 테일러

@PeterTaylor 무슨 뜻인가요?
SE가 EVIL이기 때문에 Aditsu 종료

2
당신은 단순히 사람들에게 계산을 요구한다는 것을 p 문제에서 인식합니다. 조금 애매 모호하다고 생각하지 않습니까?
피터 테일러

3
@PeterTaylor 기본 10 자리 숫자를 사용하더라도 계산이 간단하지 않습니다. 가장 짧은 코드로 수행하는 방법을 알고 싶습니다. 어려운 것은 아닙니다. 나는 더 사소한 질문도 보았고 그것이 문제가 될 것이라고 생각하지 않습니다.
SE가 EVIL이기 때문에 Aditsu 종료

또한, 나는이 :)을 적용 할 수있는 문제의 적어도 몇 가지가 있습니다
SE 악이기 때문에 aditsu 종료

답변:



5

파이썬 2, 56 바이트

n최대 길이이며 s문자 목록 일 것으로 예상됩니다. n = 0 또는 빈 문자 목록이 유효한 입력 인지는 확실하지 않지만이 함수는 입력을 올바르게 처리합니다.

f=lambda s,n:n*s and s+[x+c for x in f(s,n-1)for c in s]

4

J, 41 자

   f=.}:@;@({@(,&(<',')@(]#<@[))"1 0>:@i.@])

   'ab' f 3
a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb

3

APL (31)

{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}

사용법 : 왼쪽 인수는 문자열이고 오른쪽 인수는 숫자입니다.

    'ab'{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}3
b  a  ab  ba  bb  aa  aab  aba  abb  baa  bab  bba  bbb  aaa  

출력은 길이별로 정렬되지만 길이 그룹 내에서 왼쪽으로 하나씩 이동하면 가장 쉽습니다.

설명:

  • ,/⍺∘{... }¨⍳⍵: 1..⍵의 경우 ⍺에 함수를 적용하고 결과를 결합합니다.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: 1에서 (⍵ = (현재 길이)) ^ (⍴⍺ = (문자 수))까지의 각 숫자에 대해 ⍵ 숫자를 사용하여 기본 base로 변환하십시오.
  • 1+: 배열이 1 인덱싱되므로 하나를 추가하십시오.
  • ⍺[... ]: 문자열의 인덱스로 사용하십시오.
  • ↓⍉: 행렬을 회전하여 '숫자'가 열 대신 행에있는 다음 행렬을 행으로 나눕니다.

1
APL에 기호에 대한 단일 바이트 인코딩이 있습니까?
SE가 EVIL이기 때문에 Aditsu 종료

@aditsu : Dyalog APL은 유니 코드를 사용합니다. 다른 모든 현대 APL도 동일하게 작동합니다. 그러나 유니 코드가 있기 전에 코드 페이지를 사용하면 가능합니다.
marinus

나는 아니오에 대해 걱정하기 때문에 주로 묻습니다. 바이트 수 vs. 문자 APL이 얼마나 많은 다른 기호를 사용하는지 모르겠습니다.
SE가 EVIL이기 때문에 Aditsu 종료 11

일부를 잊어 버렸거나 잘못 계산하지 않은 경우 Dyalog APL에는 74 개의 함수 및 연산자 문자가 있으며 7 비트 ASCII와 함께 바이트에 잘 맞습니다. 그리고 그것들과 일반 문자 사이에는 겹치는 부분이 있습니다 ?!/\-+*~&=,.|. 단일 바이트 APL 인코딩이 있지만 유니 코드를 사용하는 것이 더 쉽습니다.
marinus

3

하스켈, 34 자

x%n=do k<-[1..n];mapM(\_->x)[1..k]

리스트 모나드의 간단한 사용. 유일한 실제 골프는 수입을 요구 mapM하는 더 관용적 인 (그리고 더 짧은) 대신 사용 replicateM하는 것 Control.Monad입니다.

용법

> "ab" % 3
["a","b","aa","ab","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb"]

2

파이썬, 97 94

from itertools import*
s,n=input()
L=t=[]
exec"t=t+[s];L+=map(''.join,product(*t));"*n
print L

t=t+[s]t+=[s]L과 t가 같은 목록을 가리 키기 때문에 단축 할 수 없습니다 .

입력: 'ab', 3

산출:

['a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bb
a', 'bbb']

2

매스 매 티카 29 19 28

Join@@(i~Tuples~#&/@Range@n)

용법

i={a, 4, 3.2};n=3;

Join@@(i~Tuples~#&/@Range@n)

{{a}, {4}, {3.2}, {a, a}, {a, 4}, {a, 3.2}, {4, a}, {4, 4}, {4, 3.2}, { 3.2, a}, {3.2, 4}, {3.2, 3.2}, {a, a, a}, {a, a, 4}, {a, a, 3.2}, {a, 4, a}, { a, 4, 4}, {a, 4, 3.2}, {a, 3.2, a}, {a, 3.2, 4}, {a, 3.2, 3.2}, {4, a, a}, {4, a, 4}, {4, a, 3.2}, {4, 4, a}, {4, 4, 4}, {4, 4, 3.2}, {4, 3.2, a}, {4, 3.2, 4}, {4, 3.2, 3.2}, {3.2, a, a}, {3.2, a, 4}, {3.2, a, 3.2}, {3.2, 4, a}, {3.2, 4, 4} , {3.2, 4, 3.2}, {3.2, 3.2, a}, {3.2, 3.2, 4}, {3.2, 3.2, 3.2}}


Mathematica를 구매하지 않고도 이것을 실행할 수 있습니까? 또한 출력을 "평평하게"하여 길이별로 그룹화하지 않습니까?
SE가 EVIL이기 때문에 Aditsu 종료

Mathematica를 구매해야합니다. (원칙적으로 코드는 WolframAlpha.com에서 테스트 할 수 있지만 어떤 이유로 연결이 제대로 작동하지 않습니다.)
DavidC

Mathematica를 구매 하시겠습니까? wolframalpha에서 코드가 수정되지 않았지만 이전 링크 중 하나에서 일부 출력을 볼 수 있으므로 어쨌든 가장 짧은 답변으로 받아들입니다.
SE가 EVIL이기 때문에 aditsu가 종료했습니다

2

MATL, 9 8 바이트

x:"1G@Z^

MATL Online에서 사용해보십시오!

(MATL은이 챌린지가 게시 된 이후에 만들어졌지만 요즘 메타 합의에 따르면 괜찮습니다.)

(@Luis Mendo 덕분에 1 바이트)

x -스택에서 문자열 입력 삭제 (클립 보드 G에 자동으로 복사)

:" -숫자 n의 암시 적 입력, 1에서 n까지 루프

1G -클립 보드 G의 입력 문자열을 스택에 다시 붙여 넣습니다.

@ -현재 루프 반복 인덱스를 푸시

Z^-데카르트 힘 : 자체 입력 @횟수를 가진 데카르트 곱

데카르트 검정력 결과 ( @주어진 기준에서-자리 "숫자")가 스택에 누적되고 끝에 암시 적으로 표시됩니다.


1
1 바이트를 절약 할 수 있습니다x:"1G@Z^
Luis Mendo

@LuisMendo 업데이트되었습니다 (최종!). 감사.
sundar-복원 모니카

1

파이썬-106

간단하고 독창적 인 솔루션. 크게 개선 된 내용이 있으면 별도의 답변으로 게시하십시오.

s,n=input()
l=len(s)
for i in range(1,n+1):
 for j in range(l**i):t='';x=j;exec't+=s[x%l];x/=l;'*i;print t

입력 : "ab",3
출력 :

a
b
aa
ba
ab
bb
aaa
baa
aba
bba
aab
bab
abb
bbb

1

파이썬, 100

@aditsu의 솔루션 에서 파생되었습니다 .

s,n=input()
L=len(s)
i=0
while i<n:i+=1;j=0;exec"x=j=j+1;t='';exec't+=s[x%L];x/=L;'*i;print t;"*L**i

입력: 'ab', 3

산출:

b
a
ba
ab
bb
aa
baa
aba
bba
aab
bab
abb
bbb
aaa


1

Pyth, 6 바이트

s^LQSE

문자 집합을 첫 번째 입력으로, 자릿수를 두 번째로 예상합니다. 두 번째 입력에 반복적으로 액세스하는 단일 바이트 방법이 있다면 바이트를 저장할 수 있지만 아아 ...

여기에서 온라인으로 사용해보십시오 .

s^LQSE   Implicit: Q=input 1, E=evaluate next input
    SE   Range [1,2,...,E]
 ^LQ     Perform repeated cartesian product of Q for each element of the above
s        Flatten


0

PHP 180

나도 몰라 ... 게으른 느낌이야.

<?php $f=fgetcsv(STDIN);$l=strlen($f[1]);$s=str_split($f[1]);for($i=1;$i<=$f[0];$i++)for($j=0;$j<pow($l,$i);$j++){$o="";$x=$j;for($q=0;$q<$i;$q++){$o.=$s[$x%$l];$x/=$l;}echo"$o ";}

0

에를 랑 110

Y 조합기 버전 (쉘용) :

fun(X, N)->F=fun(_,_,0)->[[]];(G, X, Y)->[[A|B]||A<-X,B<-G(G,X,Y-1)]end,[V||Y<-lists:seq(1,N),V<-F(F,X,Y)]end.

0

엘랑 89 (118)

모듈 버전 :

-module(g).
-export([g/2]).
h(_,0)->[[]];h(X,N)->[[A|B]||A<-X,B<-h(X,N-1)].
g(X,N)->[V||Y<-lists:seq(1,N),V<-h(X,Y)].

필수 부기 (모듈 및 내보내기)없이 계산됩니다.




0

젤리 , 6 바이트

WẋŒpƤẎ

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

함수 제출 : 숫자 목록을 첫 번째 인수로 사용하고 자릿수를 두 번째 인수로 사용합니다. 숫자 자체는 Jelly의 데이터 유형 중 하나 일 수 있지만, 위의 TIO 링크에서 정수를 사용했습니다. Jelly의 자동 "기능 → 전체 프로그램"랩퍼에서 가장 잘 보이는 출력을 생성하기 때문입니다.

설명

WẋŒpƤẎ                      (called with arguments, e.g. [1,2,5], 3)
Wẋ       Make {argument 2} copies of {argument 1}  (e.g. [[1,2,5],[1,2,5],[1,2,5])
    Ƥ    For each prefix:                          (e.g. 1-3 copies of [1,2,5])
  Œp       take Cartesian product of its elements
     Ẏ   Flatten one level

카티 전 곱은 주어진 숫자로 된 모든 숫자를 효과적으로 제공합니다 (우리가 사용하는 접두사에 따라). 우리는 (길이별로 그룹화) 조합의 목록의 목록 결국, 그룹화되지 않은 목록을 얻기 위해 하나 개 수준을 평평하게 할 수 있습니다 (그러나 이는 여전히 그래서 분류 질문이 요구하는만큼, 길이 아무튼 '요소의 상대 순서를 변경하지 않고 Ƥ더 짧은 접두사를 먼저 시도하십시오).


0

05AB1E , 6 바이트

「˜Ùé

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

ã         # Cartesian product of the second input repeated the first input amount of times
          #  i.e. 3 and 'ab' → ['aaa','aab','aba','abb','baa','bab','bba','bbb']
 €Œ       # Take all the substrings for each of those results
          #  i.e. 'aba' → ['a','ab','aba','b','ba','a']
   ˜      # Flatten the list of lists
    Ù     # Remove all duplicated values
     é    # Sort the list by length

6 바이트 대안 :

참고 : 유연한 출력 : 모든 길이에 대해 모두 동일한 인쇄 라인에 새 목록을 출력합니다.
단일 목록으로 변환하면 2 바이트가 길어집니다 Lv²yã`})( 온라인 시도 ).

Lv²yã?

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Lv        # Loop `y` in the range [1, integer_input]
  ²yã     #  Take the second input and create an `y` times repeated cartesian product of it
          #   i.e. y=2 and 'ab' → ['aa','ab','ba','bb']
     ?    #  Print this list (without new-line)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.