De entrada: una secuencia de letras mayúsculas (ASCII [65; 90]) que es el N º * permutación lexicográfico del conjunto múltiple de sus caracteres
* las permutaciones están numeradas de 0 o 1 hacia arriba
Salida: entero de base 10 N
Rulez
- Puede haber duplicados (así es como este desafío difiere de este )
- Los caracteres están ordenados por su valor ASCII
- En el caso de una entrada de longitud menor o igual a 1, la entrada es la primera permutación y el resultado es
0o1respectivamente - La primera permutación es aquella en la que el carácter más a la izquierda tiene el valor más bajo, el carácter más a la derecha tiene el valor más alto y la secuencia de caracteres entre el primer y el último carácter es la primera permutación del conjunto múltiple de sus caracteres (¡definición recursiva!)
- La entrada más corta gana
Ejemplo
- La entrada
AABproduce salida0 - La entrada
ABAproduce salida1 - La entrada
BAAproduce salida2

- La entrada
ZZZproduce salida0 - La entrada
DCBAproduce salida23
EDITAR
Felicitaciones adicionales a quien puede encontrar una solución que no produzca todas las permutaciones y luego busque la entrada. Eso es un reto.
code-golf
permutations
kyrill
fuente
fuente

zzzydcbano es mayúscula.Respuestas:
Jalea , 5 bytes
Pruébalo en línea!
Salida indexada 1.
fuente
Python 2, 69 bytes
Pruébalo en línea
fuente
Python,
302287 bytesDead Possum ya ha publicado una solución Pythonic corta, así que decidí ir por las felicitaciones adicionales. Esta solución no genera todas las permutaciones. Puede calcular rápidamente el índice de permutación de una cadena bastante grande; También maneja una cadena vacía correctamente.
Código de prueba:
salida
Versión sin golf:
Acerca de
lexico_permute_stringEste algoritmo, debido a Narayana Pandita, es de https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Para producir la próxima permutación en orden lexicográfico de secuencia
aFWIW, puedes ver una versión anotada de esa función aquí .
FWIW, aquí está la función inversa.
salida
Y aquí hay una función que escribí durante el desarrollo
perm_unrankque muestra el desglose de los subcontes.salida
fuente
z=0y sustituirlo ent[0]yt[1:]dónde se usan (actualmentehyt) para guardar 8 bytes.Truepara valores de 1 o inferiores, pero creo que con su código debería estar bien.f=lambda n:n<2or n*f(n-1)05AB1E , 5 bytes
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
05AB1E , 5 bytes
Pruébalo en línea!
Descubierto independientemente de la respuesta de Adnan.
fuente
PHP, 124 bytes
PHP, 136 bytes
Versión en línea
Corre con
Calcular con factorial
Versión ampliada
Salida para la cadena PPCG
Versión en línea
fuente
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add$ n = 0` en el bucle y luego el reparto a entero no funciona en este cambioJulia,
121bytesSin competencia, ya que no trata con letras duplicadas correctamente. Lo porté desde otro idioma, desde parte de una solución a un problema del Proyecto Euler que hice hace varios años, y la primera versión de 121 bytes tenía un error porque había transpuesto el uso de la cadena permutada y la referencia canónica ordenada cuerda.
Para entradas grandes, esta versión usa bignums a un costo de 8 bytes adicionales:
Sin golf:
Utiliza un sistema de numeración factorial , qv Por lo tanto, no produce todas las permutaciones y para entradas grandes se ejecutará enormemente más rápido que las que lo hacen.
Por ejemplo, el alfabeto se puede permutar en la oración más bien artificial "Trabajo de glifo de cuarzo vex'd cwm finks". Esa frase es la 259,985,607,122,410,643,097,474,123 permutación lexicográfica de las letras del alfabeto. (Aproximadamente 260 septillonésima permutación). Este programa encuentra eso en aproximadamente 65 µs en mi máquina.
Tenga en cuenta que el número termina en ... 122 en lugar de ... 123 porque OP solicitó que las permutaciones se numeren desde 0 en lugar de desde 1.
Julia, 375 bytes
He dejado la sangría para facilitar la lectura, pero el recuento de bytes está sin ella.
Este es solo un puerto directo de Julia de la brillante solución Python de PM 2Ring. Tenía hambre, así que decidí que quería la galleta después de todo. Es interesante ver las similitudes y las diferencias entre los dos idiomas. Implementé
itertools.groupby(de forma limitada) comog(w).Pero la lógica no es mía, así que vota la respuesta de PM 2Ring .
Reemplace
f=factorialconf(x)=factorial(BigInt(x))si desea poder manejar entradas grandes como p ("QUARTZGLYPHJOBVEXDCWMFINKS").fuente
BAA: esperado2, real3.MATL ,
131211 bytes¡1 byte guardado gracias a GB !
La salida está basada en 1.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
qderecho?Mathematica,
3331 bytesCambiar la especificación del problema permitió un ahorro de 2 bytes.
Función pura que toma una lista como entrada y devuelve un entero no negativo
Nen el formulario{{N}}.fuente
-1.JavaScript (ES6), 130 bytes
Menos golf
Prueba
fuente
CJam , 7 bytes
Pruébalo en línea!
fuente
Pyth, 5 bytes
Intérprete en línea
Toma la entrada citada.
fuente
'BAA'debe regresar2ya que está indexado a cero, pero en su4lugar regresa .Scala, 40 bytes
Para usarlo, asigne esta función a una variable:
Pruébelo en línea en ideone
Desafortunadamente,
permutationsdevuelve un iterador, que no tiene unsortedmétodo, por lo que debe convertirse en unSeqfuente
C ++, 96 bytes
Podemos hacer un uso completo de la biblioteca estándar aquí. La lista de letras se pasa como iteradores de inicio / fin en el estilo estándar de C ++.
No necesitamos generar todas las permutaciones, ya que tenemos una transformación de una permutación a su predecesora, simplemente contamos cuántas iteraciones se necesitan para alcanzar el valor cero.
Programa de prueba:
Resultados de la prueba:
fuente
Japt, 6 bytes
0 indexado
Intentalo
fuente
Ruby, 50 bytes.
Esperaba que esto fuera más corto. No habría agregado el
sortsi los documentos no dijeran "la implementación no garantiza el orden en que se producen las permutaciones".fuente