Você recebe uma string, que conterá caracteres az comuns. (Você pode assumir que isso sempre será o caso em qualquer teste e assumir que todas as letras também serão minúsculas). Você deve determinar quantas combinações únicas podem ser feitas dos caracteres individuais na sequência e imprimir esse número.
No entanto, letras duplicadas podem ser ignoradas na contagem das combinações possíveis. Em outras palavras, se a sequência fornecida for "olá", simplesmente mudar as posições dos dois l
s não conta como uma frase única e, portanto, não pode ser contada no total.
O menor número de bytes vence, ansioso para ver algumas soluções criativas em idiomas que não são de golfe!
Exemplos:
hello -> 60
aaaaa -> 1
abcde -> 120
Respostas:
Python 2 ,
5048 bytesExperimente online!
Sem built-ins chatos! Para minha surpresa, isso é ainda mais curto que a abordagem da força bruta, calculando todas as permutações com
itertools
e tomando o comprimento.Esta função usa a fórmula
e calcula em tempo real. O fatorial no numerador é calculado multiplicando por
len(s)
em cada chamada de função. O denominador é um pouco mais sutil; em cada chamada, dividimos pelo número de ocorrências desse elemento no que resta da string, garantindo que, para cada caracterec
, todos os números entre 1 e a quantidade de ocorrências dec
(inclusive) sejam divididos exatamente uma vez. Como dividimos apenas no final, garantimos que não temos problemas com a divisão de piso padrão do Python 2.fonte
05AB1E , 3 bytes
Experimente online!
Explicação
fonte
CJam , 4 bytes
Experimente online!
Explicação
Leia a linha como uma string (
l
), permutações exclusivas como uma matriz de strings (e!
), length (,
), exibição implícita.fonte
R ,
6965 bytesExperimente online!
4 bytes salvos graças a Zahiro Mor nas duas respostas.
Calcula o coeficiente multinomial diretamente.
R ,
7268 bytesExperimente online!
Usa a função de distribuição multinomial fornecida por
dmultinom
para extrair o coeficiente multinomial.Observe que o habitual (golfista)
x<-table(strsplit(s,""))
não funciona dentro dadmultinom
chamada por um motivo desconhecido.fonte
function(s,
!=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
vai funcionar. o el () é reduntant - Mesa sabe olhar para os elementos ....JavaScript (Node.js) , 49 bytes
t=t*
é usado em vez det*=
evitar erro de arredondamento (o|t
número arredonda para baixo) comot=t*
garantia de que todos os resultados intermediários (em termos de operador) são números inteiros.Experimente online!
fonte
t=t*
se você quer evitar isso.)aaadegfbbbccc
exatamente devido ao arredondamento de ponto flutuante erroAPL (Dyalog Unicode) , 14 bytes
Experimente online!
Retorna o resultado como um singleton.
fonte
⍴
->≢
para fazer com que ele retorne escalares simples,÷⍨/g⌸,g←!⊢∘≢
para -2Japonês ,
53 bytes-2 bytes graças a @Shaggy
Experimente online!
fonte
â
.J ,
15, 14 bytesExperimente online!
-1 byte graças a FrownyFrog
fonte
~.
pode ser=
Gelatina , 4 bytes
Experimente online!
Simplesmente faz o que foi solicitado: encontre permutações de entrada, unifique e imprima o comprimento.
fonte
C # (compilador interativo do Visual C #) , 59 bytes
Porta da resposta Python 2 do @ArBo .
Experimente online.
fonte
Braquilog , 3 bytes
Experimente online!
pᵘl
faz exatamente a mesma coisa.fonte
Python 2 , 57 bytes
Experimente online!
Auto-documentação: Retorna o comprimento do conjunto de permutações exclusivas da string de entrada.
Python 3 , 55 bytes
O crédito vai para a ArBo neste:
Experimente online!
fonte
APL (Dyalog Unicode) , 24 bytes
Experimente online!
Dfn simples, aceita uma string como argumento.
Quão:
fonte
Ruby , 41 bytes
Experimente online!
fonte
to_a
f=
peça. (Em TIO movê-lo para Header para não ficar contados.)Perl 5 , 43 bytes
Usa o método na resposta Python do @ ArBo.
Experimente online!
fonte
Perl 6 ,
3330 caracteres (3431 bytes)Whatever
Bloco bastante direto .comb
divide a string em letras,permutations
obtém todas as combinações possíveis. Por causa da maneira como a coerçãoSet
precisa serjoin
edificada primeiro (»
aplicajoin
- se a cada elemento da lista).Experimente online!
(a resposta anterior usada,
.unique
masSet
s garante a exclusividade e numerifica a mesma, para salvar 3).fonte
K (oK) , 12 bytes
Solução:
Experimente online!
Explicação:
Usa o oK embutido
prm
:... que, devido
x^/:x
basicamente gera as permutações de"helo"
não"hello"
, portanto, precisamos gerar as permutações de0 1 2 3 4
, usá-las para indexar"hello"
e, em seguida, fazer a contagem do único.fonte
!-n
. no final do k5 e k6 tornou-seprm
. k7 (shakti)prm
também.Java 8,
103102 bytesPorta da resposta Python 2 do @ArBo .
-1 byte agradece a @ OlivierGrégoire , tornando-o iterativo em vez de recursivo.
Experimente online.
Na verdade, gerar todas as permutações exclusivas em um conjunto e obter seu tamanho seria 221 bytes :
Experimente online.
fonte
s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}
.s->{long r=1,i=s.length();for(;i>0;)r=r*i/(s.chars().skip(--i).filter(c -> c==s.charAt(i)).count()+1);return r;}
mas sem sucesso até agora ...MATL , 9 bytes
Experimente online!
Explicação:
fonte
j
torna - sei
, que pode ser deixada implícita. Além disso,&nx
salva um byte sobreZy1)
tio.run/##y00syfn/P9IholQtr@L/f/WM1JycfHUAOitava / MATLAB, 35 bytes
Função anônima que pega um vetor de caractere e produz um número.
No MATLAB, isso pode ser reduzido para
size(unique(perms(s),'ro'),1)
(33 bytes).Experimente online!
Explicação
fonte
unique
já retornou linhas únicas? Ou isso é apenas paratable
s?unique
, linearizariam primeiro. Para as mesas, acho que você está certo; Eu não sabia disso!unique
no MATLAB leva linhas paratables
; Runique
recebe linhas exclusivas de matrizes ou quadros de dados. Muitas línguas matriz com os mesmos comandos que fazem as coisas um pouco diferentes ...Retina 0.8.2 , 73 bytes
Experimente online! Usa a fórmula do @ ArBo, mas avalia da direita para a esquerda, pois isso pode ser feito na aritmética inteira, minimizando o tamanho dos valores unários envolvidos. Explicação:
Para cada caractere, conte quantas duplicatas restantes existem e quantos caracteres adicionais existem, adicione um a cada um para levar em consideração o caractere atual e separe os valores para que saibamos quais devem ser divididos e quais devem ser multiplicados .
Prefixe um 1 para produzir uma expressão completa.
Multiplique repetidamente o último e o terceiro últimos números, dividindo pelo segundo último número. Isso substitui os três últimos números.
Converta para decimal.
fonte
K, 27 bytes
K, 16 bytes - não é uma resposta real
Faça 999999 permutações aleatórias da sequência de entrada, pegue o conjunto exclusivo delas e conte o comprimento. Na maioria das vezes, ele fornece a resposta certa, para seqüências curtas.
Melhorado graças a @Sriotchilism O'Zaic, @Selcuk
fonte
999999
vez de100000
?Wolfram Language (Mathematica) , 32 bytes
Experimente online!
Explicação: A composição da direita com
/*
aplica esses três operadores um após o outro ao argumento da função, da esquerda para a direita:Characters
converte a sequência de entrada em uma lista de caracteres.Permutations
faz uma lista de todas as permutações exclusivas dessa lista de caracteres.Length
retorna o comprimento desta lista de permutações exclusivas.Esse método é muito inútil para seqüências longas: as permutações únicas são realmente listadas e contadas, em vez de usar a
Multinomial
para calcular seu número sem listar.fonte
F # (Mono) , 105 bytes
Experimente online!
fonte
Pitão ,
54 bytesExperimente online!
Isso pressupõe que a entrada é uma literal de string python. Se a entrada precisar ser texto bruto, esta versão de 5 bytes funcionará:
De qualquer maneira, ele apenas calcula todas as permutações da entrada como uma lista, a deduplica e obtém o número de elementos nela e imprime implicitamente esse número.
-1 byte graças a @ hakr14
fonte
{
deduplica uma lista para um byte menor que.{
.J ,
1413 bytesExperimente online!
1 byte graças a milhas
fonte
#(%*/)&:!#/.~
deve salvar outro bytePHP , 77 bytes
Experimente online!
Essa é basicamente uma porta PHP da resposta vencedora do @ ArBo em Python, que é ridiculamente mais inteligente do que a resposta recursiva que eu originalmente tinha. Bravo!
fonte
Ohm v2 , 4 bytes
Experimente online!
Explicação
fonte
Stax , 3 bytes
Execute e depure
fonte