Gere combinações ordenadas com repetição


9

Dada uma sequência de caracteres diferentes e um número n, gere todas as combinações ordenadas com repetição, de 1 a n, usando esses caracteres.

Outra maneira de defini-lo é ver os caracteres dados como dígitos "personalizados" na base (raiz) do número de caracteres; o programa deve gerar todos os "números" com 1 a n dígitos nessa base, levando, no entanto, "zeros" também estão incluídos.

As combinações devem ser ordenadas de acordo com seu tamanho (1 caractere primeiro, depois 2 etc.), mas, além disso, elas podem estar em qualquer ordem. Você pode escolher as formas mais convenientes de lidar com entrada e saída. O menor código vence.

Exemplos:

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


A sério? "Contagem"?
— Peter Taylor

@PeterTaylor, o que você quer dizer?
— aditsu saiu porque SE é MAU 21/03

2
Você reconhece no problema que está simplesmente pedindo às pessoas para contar. Você não acha isso um pouco ambicioso?
— Peter Taylor

3
@ PeterTaylor Bem, não é uma contagem simples, mesmo quando se usa dígitos da base 10. Gostaria de ver como fazê-lo no código mais curto. Não é para ser difícil. Também vi perguntas mais triviais e não acho que isso seja um problema.
— aditsu saiu porque SE é MAU 21/03

Além disso, há pelo menos alguns problemas nos quais eu posso aplicar isso :)
— aditsu encerrou porque SE é MAU 21/03/13

Respostas:



5

Python 2, 56 bytes

né o tamanho máximo e sespera-se que seja uma lista de caracteres. Não está claro para mim se n = 0 ou uma lista de caracteres vazia são entradas válidas, mas essa função também as manipula corretamente.

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

4

J, 41 caracteres

   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+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}

Uso: o argumento da esquerda é a string e o argumento da direita é o número, assim:

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

A saída é ordenada por comprimento, mas dentro dos grupos de comprimento eles são deslocados um para a esquerda, isso foi mais fácil.

Explicação:

  • ,/⍺∘{... }¨⍳⍵: para 1..⍵, aplique a função a ⍺ e junte os resultados.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: para cada número de 1 a (⍵ = (comprimento atual)) ^ (⍴⍺ = (quantidade de caracteres)), converta na base ⍴⍺ usando ⍵ dígitos.
  • 1+: adicione um porque as matrizes são indexadas 1.
  • ⍺[... ]: use-os como índices na string
  • ↓⍉: gire a matriz, para que os 'números' estejam nas linhas, e não nas colunas, e depois divida a matriz por linhas.

11
O APL possui uma codificação de byte único para seus símbolos?
— aditsu saiu porque SE é MAU 22/03

@aditsu: O Dyalog APL usa Unicode, eu acho que todos os outros APLs modernos fazem o mesmo. No entanto, antes que houvesse Unicode, você usaria uma página de códigos para que fosse possível.
— marinus

Estou perguntando principalmente porque estou preocupado com não. de bytes vs não. de caracteres. Não sei quantos símbolos diferentes o APL usa.
— aditsu saiu porque SE é MAU 24/03

A menos que eu tenha esquecido alguns ou tenha sido mal contado, o Dyalog APL possui 74 caracteres de função e operador, que caberiam em um byte juntamente com o ASCII de 7 bits. E há também alguma sobreposição entre esses e caracteres normais como ?!/\-+*~&=,.|e provavelmente um pouco mais. Existem codificações APL de byte único, mas o Unicode é mais fácil de usar.
— Marinus

3

Haskell, 34 caracteres

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

Uso direto da mônada da lista. O único golfe de verdade é o uso, em mapMvez do mais idiomático (e mais curto), replicateMque exigiria importação Control.Monad.

Uso

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

2

Python, 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]não pode ser reduzido, t+=[s]porque L e t apontariam para a mesma lista.

Entrada: 'ab', 3

Resultado:

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

2

Mathematica 29 19 28

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

Uso

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


É possível executar isso sem comprar o Mathematica? Além disso, você poderia "achatar" a saída para não ser agrupada por comprimento?
— aditsu saiu porque SE é MAU 21/03

Você precisa comprar o Mathematica. (Em princípio, o código pode ser testado no WolframAlpha.com, mas, por algum motivo, o vínculo não funciona corretamente.) #
— 187

Compra Mathematica? Desculpe, isso não vai acontecer: p O código não funciona sem modificação no wolframalpha, mas eu pude ver alguma saída de um dos links anteriores, então, de qualquer maneira, eu tento aceitar isso como a resposta mais curta.
— aditsu saiu porque SE é MAU 24/03

2

MATL, 9 8 bytes

x:"1G@Z^

Experimente no MATL Online!

(O MATL foi criado depois que esse desafio foi publicado, mas acredito que tudo bem por meta consenso nos dias de hoje.)

(-1 bytes graças a @Luis Mendo.)

x - excluir entrada de string da pilha (copia automaticamente para a área de transferência G)

:" - entrada implícita do número n, loop de 1 a n

1G - cole a sequência de entrada da área de transferência G na pilha

@ - pressione o índice de iteração do loop atual

Z^- poder cartesiano: produto cartesiano de entrada com ele próprio @número de vezes

Os resultados do poder cartesiano ( @"números" de dígitos na base fornecida) são acumulados na pilha e exibidos implicitamente no final.


11
Você pode salvar 1 byte comx:"1G@Z^
— Luis Mendo

@LuisMendo Atualizado (finalmente!). Obrigado.
— sundar - Restabelece Monica

1

Python - 106

A solução direta e não criativa. Se você encontrar melhorias significativas, poste como resposta separada.

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

Entrada: "ab",3
Saída:

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

1

Python, 100

Derivado da solução do @ 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

Entrada: 'ab', 3

Resultado:

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


1

Pitão, 6 bytes

s^LQSE

Espera o conjunto de caracteres como 1ª entrada, número de dígitos como 2ª. Um byte poderia ser salvo se houvesse um método de byte único para acessar repetidamente a segunda entrada, mas ...

Experimente online aqui .

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

Não faço ideia ... estou com preguiça.

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

Erlang 110

A versão do combinador Y (para shell):

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

Erlang 89 (118)

Versão do módulo:

-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)].

Caracteres contados sem escrituração obrigatória (módulo e exportação).




0

Gelatina , 6 bytes

WẋŒpƤẎ

Experimente online!

Função envio, tomando a lista de dígitos como o primeiro argumento e o número de dígitos como o segundo. Os dígitos em si podem ser qualquer um dos tipos de dados de Jelly, mas eu usei números inteiros no link TIO acima porque ele produz a melhor aparência do wrapper automático de "função → programa completo" do Jelly.

Explicação

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

O produto cartesiano efetivamente nos fornece todos os números com um determinado número de dígitos (de acordo com o prefixo com o qual estamos trabalhando). Portanto, terminamos com uma lista de listas de combinações (agrupadas por comprimento) e podemos nivelar esse nível para obter uma lista que não é agrupada (mas que ainda é classificada por comprimento, conforme a pergunta exige, como Ẏnão altere a ordem relativa dos elementos e Ƥtente prefixos mais curtos primeiro).


0

05AB1E , 6 bytes

「˜Ùé

Experimente online ou verifique todos os casos de teste .

Explicação:

ã         # 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

Alternativa de 6 bytes:

NOTA: Saída flexível: gera uma nova lista para todos os comprimentos, todos na mesma linha de impressão.
Convertê-lo em uma única lista levaria 2 bytes a mais: Lv²yã`})( Experimente online ).

Lv²yã?

Experimente online ou verifique todos os casos de teste .

Explicação:

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)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.