Entrada: uma sequência de letras maiúsculas (ASCII [65; 90]), que é o N th * permutação léxicografica do multiconjunto dos seus caracteres
* permutações são numeradas de 0 ou 1 para cima
Saída: base-10 inteiro N
Rulez
- Pode haver duplicatas (é assim que este desafio difere deste )
- Os caracteres são ordenados pelo seu valor ASCII
- No caso de uma entrada de comprimento menor ou igual a 1, a entrada é a primeira permutação e o resultado é
0
ou1
respectivamente - A primeira permutação é aquela em que o caractere mais à esquerda tem o valor mais baixo, o caractere mais à direita tem o valor mais alto, e a sequência de caracteres entre o primeiro e o último caractere é a primeira permutação do multiset de seus caracteres (definição recursiva!)
- Menor entrada ganha
Exemplo
- Entrada
AAB
produz saída0
- Entrada
ABA
produz saída1
- Entrada
BAA
produz saída2
- Entrada
ZZZ
produz saída0
- Entrada
DCBA
produz saída23
EDITAR
Parabéns extra para quem pode encontrar uma solução que não produz todas as permutações e depois procurar a entrada. Isso é um desafio.
code-golf
permutations
kyrill
fonte
fonte
zzz
edcba
não está em maiúsculas.Respostas:
Gelatina , 5 bytes
Experimente online!
Saída indexada em 1.
fonte
Python 2, 69 bytes
Experimente online
fonte
Python,
302287 bytesO Dead Possum já publicou uma solução Pythonic curta, então eu decidi ir para os elogios extras. Esta solução não gera todas as permutações. Ele pode calcular rapidamente o índice de permutação de uma string bastante grande; Ele também lida com uma string vazia corretamente.
Código de teste:
saída
Versão sem golfe:
Sobre
lexico_permute_string
Esse algoritmo, devido a Narayana Pandita, é de https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Para produzir a próxima permutação em ordem lexicográfica de sequência
a
FWIW, você pode ver uma versão anotada dessa função aqui .
FWIW, aqui está a função inversa.
saída
E aqui está uma função que escrevi durante o desenvolvimento
perm_unrank
que mostra a divisão das subcontas.saída
fonte
z=0
e substituí-lot[0]
et[1:]
onde eles são usados (atualmenteh
et
) para economizar 8 bytes.True
para valores de 1 ou menos, mas acho que com o seu código isso deve ficar bem?f=lambda n:n<2or n*f(n-1)
05AB1E , 5 bytes
Usa a codificação CP-1252 . Experimente online!
fonte
05AB1E , 5 bytes
Experimente online!
Descoberto independentemente da resposta de Adnan.
fonte
PHP, 124 bytes
PHP, 136 bytes
Versão Online
Correr com
Calcular com fatorial
Versão expandida
Saída para a cadeia PPCG
Versão Online
fonte
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add
$ n = 0` no loop, em seguida, o molde para inteiro não funciona nesta mudançaJulia,
121125 bytesNão-competitivo, pois não lida com letras duplicadas corretamente. Transferi isso de outro idioma, de parte de uma solução para um problema do Project Euler que fiz vários anos atrás, e a primeira versão de 121 bytes teve um bug porque havia transposto o uso da string permutada e da referência canônica classificada corda.
Para entradas grandes, esta versão usa bignums ao custo de 8 bytes extras:
Ungolfed:
Utiliza um sistema numérico fatorial , qv Portanto, ele não produz todas as permutações e, para grandes entradas, será muito mais rápido do que as que produzem.
Por exemplo, o alfabeto pode ser permutado na sentença artificial "Quartzo glifo trabalho vex'd cwm finks". Essa frase é a 259.985.607.122.410.643.097.474.123ª permutação lexicográfica das letras do alfabeto. (Aproximadamente 260 septilhionésimos permutações.) Este programa encontra isso em cerca de 65 µs na minha máquina.
Observe que o número termina em ... 122 em vez de ... 123 porque OP solicitou que as permutações fossem numeradas de 0 em vez de 1.
Julia, 375 bytes
Deixei o recuo para facilitar a leitura, mas a contagem de bytes está sem ele.
Este é apenas um porto Julia direto da brilhante solução Python do PM 2Ring. Eu estava com fome, então decidi que queria o biscoito, afinal. É interessante ver as semelhanças e as diferenças entre os dois idiomas. Eu implementei
itertools.groupby
(de forma limitada) comog(w)
.Mas a lógica não é minha, então vá e vote na resposta da PM 2Ring .
Substitua
f=factorial
porf(x)=factorial(BigInt(x))
se desejar poder manipular entradas grandes como p ("QUARTZGLYPHJOBVEXDCWMFINKS").fonte
BAA
- esperado2
, real3
.MATL ,
131211 bytes1 byte salvo graças ao GB !
A saída é baseada em 1.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
q
direito?Mathematica,
3331 bytesAlterar a especificação do problema permitiu uma economia de 2 bytes.
Função pura pegando uma lista como entrada e retornando um número inteiro não negativo
N
no formulário{{N}}
.fonte
-1
.JavaScript (ES6), 130 bytes
Menos golfe
Teste
fonte
CJam , 7 bytes
Experimente online!
fonte
Pitão, 5 bytes
Intérprete online
Toma entrada entre aspas.
fonte
'BAA'
deve retornar,2
pois é indexada a zero, mas retorna4
.Scala, 40 bytes
Para usá-lo, atribua esta função a uma variável:
Experimente online em ideone
Infelizmente,
permutations
retorna um iterador, que não possui umsorted
método, portanto, ele deve ser convertido em umSeq
fonte
C ++, 96 bytes
Podemos fazer uso completo da biblioteca padrão aqui. A lista de letras é passada como iteradores de início / fim no estilo C ++ padrão.
Não precisamos gerar todas as permutações - já que temos uma transformação de uma permutação em seu predecessor, simplesmente contamos quantas iterações são necessárias para atingir o valor zero.
Programa de teste:
Resultado dos testes:
fonte
Japonês, 6 bytes
Indexado a 0
Tente
fonte
Ruby, 50 bytes
Eu esperava que isso fosse mais curto. Eu não teria acrescentado
sort
se os documentos não dissessem "a implementação não garante a ordem pela qual as permutações são produzidas".fonte