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
fonte
Respostas:
APL (Dyalog Unicode) , SBCS de 13 bytes
Experimente online!
nunca perca a oportunidade de usar uma digitalização :)
solicita uma sequência de "dígitos" e, em seguida,
n
obrigado @ Adám por me dizer como ativar
]box
no TIOfonte
Python 2, 56 bytes
n
é o tamanho máximo es
espera-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.fonte
J, 41 caracteres
fonte
APL (31)
Uso: o argumento da esquerda é a string e o argumento da direita é o número, assim:
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.fonte
?!/\-+*~&=,.|
e provavelmente um pouco mais. Existem codificações APL de byte único, mas o Unicode é mais fácil de usar.Haskell, 34 caracteres
Uso direto da mônada da lista. O único golfe de verdade é o uso, em
mapM
vez do mais idiomático (e mais curto),replicateM
que exigiria importaçãoControl.Monad
.Uso
fonte
Python,
9794t=t+[s]
não pode ser reduzido,t+=[s]
porque L e t apontariam para a mesma lista.Entrada:
'ab', 3
Resultado:
fonte
Mathematica
29 1928Uso
fonte
MATL,
98 bytesExperimente 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 n1G
- cole a sequência de entrada da área de transferência G na pilha@
- pressione o índice de iteração do loop atualZ^
- poder cartesiano: produto cartesiano de entrada com ele próprio@
número de vezesOs resultados do poder cartesiano (
@
"números" de dígitos na base fornecida) são acumulados na pilha e exibidos implicitamente no final.fonte
x:"1G@Z^
Python - 106
A solução direta e não criativa. Se você encontrar melhorias significativas, poste como resposta separada.
Entrada:
"ab",3
Saída:
fonte
Python, 100
Derivado da solução do @ aditsu .
Entrada:
'ab', 3
Resultado:
fonte
Perl 5 +
-nlF -M5.010 -MList::Util+(uniq)
, 41 bytesExperimente online!
-1 byte graças a @Xcali !
fonte
Pitão, 6 bytes
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 .
fonte
Perl 6 , 33 bytes
Experimente online!
Bloco de código anônimo que pega uma sequência e um número e retorna uma lista de sequências.
fonte
PHP 180
Não faço ideia ... estou com preguiça.
fonte
Erlang 110
A versão do combinador Y (para shell):
fonte
Erlang 89 (118)
Versão do módulo:
Caracteres contados sem escrituração obrigatória (módulo e exportação).
fonte
Ruby , 73 bytes
Experimente online!
fonte
Japonês , 9 bytes
Explicações a seguir.
Tente
Tente
fonte
Gelatina , 6 bytes
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
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).fonte
05AB1E , 6 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
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 ).Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
K (ngn / k) , 17 bytes
Experimente online!
fonte