¿Quién no ama absolutamente las permutaciones, verdad? Lo sé, son increíbles, ¡muy divertidos!
Bueno, ¿por qué no tomar esta diversión y hacerla más divertida ?
Aquí está el desafío:
Dada una entrada en la forma exacta:, de nPr
dónde n
se toma el grupo y r
es el número de selecciones de ese grupo ( n
y r
son números enteros), genera / devuelve el número exacto de permutaciones. Para aquellos de ustedes que están un poco oxidados con la terminología: Permutación, def. 2a .
Sin embargo, aquí es donde entra en juego el desafío (hace que no sea demasiado fácil):
No puede utilizar ninguna biblioteca, marco o método incorporado para su función de permutación. No puede usar un método factorial, un método de permutación ni nada por el estilo; debes escribir todo tú mismo.
Si necesita más aclaraciones, no dude en informarme en los comentarios y actuaré de inmediato.
Aquí hay un ejemplo de E / S:
La función de muestra es permute(String) -> int
Entrada:
permute("3P2")
Salida:
6
Este es el código de golf, ¡el código más corto gana!
fuente
split
para dividir la entrada en elP
? ¿Qué pasa con una función que convierte una cadena en un número?0 <= r <= n
?Respuestas:
CJam,
1514 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Perl, 27 bytes
Contando el shebang como 4, la entrada se toma de stdin.
Uso de muestra
fuente
l61
?$\
en1
(char 49, octal 61).Haskell
7166 bytesCosas bastante sencillas: dividir en la 'P' y luego tomar el producto entre (n-k + 1) yn.
Gracias a nimi por su idea de usar guardias de patrones en lugar de una
where
cláusula, redujo 5 bytes.fuente
Minkolang 0.11 ,
132519 bytes¡Gracias a Sp3000 por sugerir esto!
Pruébalo aquí
Explicación
Esto usa el mismo algoritmo que el de Alex:
n P k
=n(n-1)(n-2)...(n-k+1)
.fuente
Julia,
635848 bytesEsto crea una función sin nombre que acepta una cadena y devuelve un entero. Para llamarlo, dale un nombre, por ejemplo
f=s->...
.Sin golf:
Esto utiliza el hecho de que el número de permutaciones es n ( n -1) ( n -2) ... ( n - k +1).
Guardado 10 bytes gracias a Glen O!
fuente
Int
, así que puedes usarlomap(parse,...)
.Int
era necesario en esa situación. ¡Muchas gracias!Bash + utilidades de Linux, 33
jot
produce la secuencia der
enteros que comienza enn-r+1
, y los separa con*
. Esta expresión se canalizabc
para la evaluación aritmética.fuente
MATLAB, 54 bytes
Intenté hacerlo más pequeño, pero una de las cosas en las que MATLAB es realmente malo es obtener entradas. ¡Solo se necesitan 32 caracteres para obtener los dos números de la cadena de entrada!
Código bastante autoexplicativo. Obtenga la entrada en el formulario
%dP%d
donde% d es un número entero. Divide eso enn
yr
. Luego muestre el producto de cada entero en el rangon-r+1
den
. Curiosamente, esto funciona incluso paraxP0
dar la respuesta correcta de 1. Esto se debe a que en MATLAB laprod()
función devuelve 1 si intenta hacer el producto de una matriz vacía. Siempre quer
sea cero, el rango será una matriz vacía, entonces bingo obtenemos 1.Esto también funciona perfectamente con Octave también. Puedes probarlo en línea aquí .
fuente
Javascript,
5957 bytesfuente
Java (594 - bytes)
fuente
J, 23 bytes
Una función anónima. Ejemplo:
Explicación:
La función de rebaje que utilicé podría limitarse a contar como una función incorporada ... Descansa en algún lugar entre la generalidad del operador de multiplicación y la especificidad del operador factorial.
fuente
APL, 23
Toma la cadena como argumento. Explicación:
fuente
⎕ML←3
en Dyalog.Pitón 2, 66
Muy claro. Procesa la entrada del número como
a,b
. Mantiene un producto en ejecución comoP
, que se multiplica por los primerosb
términos dea, a-1, a-2, ...
.fuente
input()
no podría dar lugar a un error."3P2"
, lo que creo que generalmente está permitido, pero aquí el desafío dice "una entrada en la forma exacta", así que la cambio a una función que toma una cadena.TI-BASIC, 52 bytes
TI-BASIC tiene una función de "producto de una lista", por lo que evitar la restricción de las incorporaciones no es demasiado difícil. Sin embargo, TI-BASIC no admite listas vacías, por lo que debemos
Para extraer los dos números, extraigo el primer número como una subcadena. Esto es caro ; Ocupa toda la segunda línea. Para evitar tener que volver a hacer esto para el segundo número, configuro la variable P en ese número y evalúo la cadena completa usando
expr(
, luego divido por P².Finalmente, tomo una permutación aleatoria de la lista entre los dos números (procurando agregar uno al segundo número) y tomo el producto.
fuente
Ouroboros ,
4745 bytesAlgo de esto es bastante feo: me imagino que podría jugar más golf.
Cada línea de código en Ouroboros representa una serpiente que se come la cola.
Serpiente 1
S
cambia a la pila compartida.r.r
lee un número, lo duplica y lee otro. (Se omiten los caracteres no numéricos comoP
).-
Resta los dos. Si la entrada fue7P2
, ahora tenemos7
,5
en la pila compartida. Finalmente, se1(
come el personaje final de la serpiente. Como este es el carácter en el que se encuentra el puntero de instrucción, la serpiente muere.Serpiente 2
)s
no hace nada la primera vez..!+
duplica la parte superior de la pila de la serpiente 2, comprueba si es cero y, si es así, agrega 1. En la primera iteración, la pila está vacía y se trata como si contuviera ceros infinitos, por lo que esto empuja1
; en iteraciones posteriores, la pila contiene un valor distinto de cero y esto no tiene ningún efecto.A continuación,
S
cambia a la pila compartida, donde tenemos el númeron
y un contador para calcular el producto.1+
incrementa el contador..@@.@\<!
duplica ambos números y empuja 1 sin
aún es mayor o igual que el contador, 0 de lo contrario.@@*Y
luego multiplica el contador por esta cantidad y tira una copia a la pila de la serpiente 2.s.!+
vuelve a la pila de la serpiente 2 y usa el mismo código que antes para convertir el número superior a 1 si era 0 y, de lo contrario, lo mantiene igual. Luego*
multiplica el resultado por el producto parcial que estaba en esta pila.Ahora volvemos a la pila compartida (
S
), duplicamos el contador o cero (.
) y lo negamos dos veces (!!
) para convertir un contador distinto de cero en 1.4*.(
multiplica esto por 4, duplica y come tantos caracteres del Fin de la serpiente.(
comen los cuatro caracteres después del y el control gira alrededor del principio del código. Aquí)
regurgita cuatro caracteres,s
vuelve a la pila de la serpiente 2 y la ejecución continúa.n
, tenemos un 0 en la pila y no se come nada.sn
cambia a la pila de la serpiente 2 y genera el valor superior como un número; luego1(
come el último personaje y muere.El resultado es que el producto
(r+1)*(r+2)*...*n
se calcula y se genera.Pruébalo
Mostrar fragmento de código
fuente