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
0
o1
respectivamente - 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
AAB
produce salida0
- La entrada
ABA
produce salida1
- La entrada
BAA
produce salida2
- La entrada
ZZZ
produce salida0
- La entrada
DCBA
produce 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
zzz
ydcba
no 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_string
Este 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
a
FWIW, 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_unrank
que muestra el desglose de los subcontes.salida
fuente
z=0
y sustituirlo ent[0]
yt[1:]
dónde se usan (actualmenteh
yt
) para guardar 8 bytes.True
para 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=factorial
conf(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
q
derecho?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
N
en 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 regresar2
ya que está indexado a cero, pero en su4
lugar regresa .Scala, 40 bytes
Para usarlo, asigne esta función a una variable:
Pruébelo en línea en ideone
Desafortunadamente,
permutations
devuelve un iterador, que no tiene unsorted
método, por lo que debe convertirse en unSeq
fuente
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
sort
si los documentos no dijeran "la implementación no garantiza el orden en que se producen las permutaciones".fuente