Escriba un programa que tome una entrada como:
n,k
que luego calcula:
y luego imprime el resultado.
Un ejemplo numérico:
Entrada:
5,2
Cálculo interno:
Salida impresa:
10
Me gustaría ver una respuesta que supere mi solución de Python de 65 caracteres, pero todos los idiomas son obviamente bienvenidos.
Aquí está mi solución:
n,k=input();f=lambda x:+(x<2)or x*f(x-1);print f(n)/(f(k)*f(n-k))
Editar:
Admito que esta pregunta es del rompecabezas de combinación matemática del sitio web codegolf . Sé que mi respuesta puede parecer que no se puede hacer mucho progreso al respecto, pero los líderes de este rompecabezas lo han resuelto en casi la mitad de los personajes.
Los recuentos de caracteres más bajos actuales por idioma son:
Perl: 35
Rubí: 36
Python: 39
PHP: 62
code-golf
combinatorics
backus
fuente
fuente
Respuestas:
APL, 3 bytes
O para aquellos cuyo navegador no representa lo anterior, en una representación ASCII:
fuente
n,k
entrada, tendría que hacerlo!/⌽⎕
.R (11 caracteres)
fuente
C 96
Con E / S (que toma alrededor de 34 caracteres). Se agregaron un par de nuevas líneas para que sea legible.
Ahora, si me disculpa, tengo un ASCII n elegir k cohete para atrapar.
fuente
GolfScript, 17 caracteres
Esta solución maneja casos como k = 0 o k = 1 correctamente.
La porción de tipo factorial se basa en una respuesta previa .
fuente
GolfScript 21
No es particularmente corto, GolfScript carece de una función factorial real, sin embargo, esta tiene que ser la manipulación de datos más perversa que he hecho, esto requiere un seguimiento de la pila:
"5,2" Datos en la pila desde la entrada.
~
El comando Eval, tenga en cuenta que, es un operador que convierte un número en una matriz.[0 1 2 3 4] 2
~
Binario no.[0 1 2 3 4] -3
)
Incremento.[0 1 2 3 4] -2
>
Tome el final de la matriz, -2 como parámetro para obtener los últimos 2 elementos.[3 4]
.
Elemento duplicado.[3 4] [3 4]
,
Longitud de la matriz.[3 4] 2
,
Gire el número a la matriz.[3 4] [0 1]
]
Crear matriz.[[3 4] [0 1]]
{{)}%{*}*}
Bloque de código.[[3 4] [0 1]] {{)}% {*} *}
%
Ejecuta el bloque una vez para cada elemento de la matriz. La siguiente parte solo demuestra el primer bucle.[3 4]
{)}%
Incremente cada elemento de la matriz.[4 5]
{*}
Bloque que contiene un comando de multiplicación.[4 5] {*}
*
"Dobla" la matriz usando el comando de bloque, es decir, en este caso crea el producto de todos los elementos.20
Una vez finalizado el ciclo grande, devuelve una matriz con los resultados.
[20 2]
~
Deconstruir la matriz.20 2
/
División.10
fuente
Ruby 1.9,
5246 (42) caracteresSi se ignora stderr:
Ruby 1.8, 43 caracteres, sin salida adicional para stderr:
Ediciones:
fuente
Pitón (56)
Código sin golf y alguna explicación de un atajo para calcular el coeficiente binomial. (Nota: hay algunas ideas que simplemente no he descubierto para llegar a la versión de 39 caracteres; no creo que este enfoque lo lleve allí).
fuente
*
para analizar entradas del formulario4545 78
?*
ese el problema.4545 78
no es una expresión válida de Python, porinput()
lo que elevará aSyntaxError
. Este truco depende completamente del problema que se solicitax,y
. Si tenía una función que leíax y
y devolvía una tupla, entonces podría usarla*
bien.RPL (4)
(usando la función incorporada)
fuente
Windows PowerShell, 57
fuente
J,
333635 caracteres son de entrada, análisis y salida. El otro carácter,
!
es n elegir k.No tengo Windows para probar esto en este momento, pero creo que debería funcionar allí.
fuente
Q, 32 caracteres
fuente
Perl 6 (55)
fuente
RPL (22)
(sin usar la función COMB incorporada)
fuente
Q (
5045)Puede eliminar algunos caracteres de los anteriores eliminando paréntesis redundantes y utilizando 1 * / en lugar de prd.
fuente
Mathematica 12
Función directa e integrada.
fuente
Perl 6 ,
2516 bytes-9 bytes gracias a nwellnhof
Pruébalo en línea!
Función anónima que toma dos números y devuelve un int. Esto utiliza el incorporado
combinations
y convierte la lista devuelta en un int.fuente
combinations
podía tomar un número en lugar de una listaPHP (71
79)fuente
Pitón (54)
Esencialmente lo mismo que el anterior de Python, pero elimino cuatro bytes al soltar el
de la definición de la función. Sin embargo, esto da como resultado que la función devuelva True en lugar de 1 si k = 0, pero esto se puede solucionar multiplicando con 1 antes de imprimir, ya que 1 * True = 1, agregando así dos bytes.
fuente
J, 11 caracteres
Toma entrada del teclado.
fuente
Haskell (80)
Pero, si
x y
se permite la entrada en el formato en lugar de en el formatox,y
, son 74 caracteres:fuente
Scala 54
fuente
Pitón (52)
Mejorado de los otros dos al usar
print+
para convertir el resultado def
fromboolean
aint
in casek==0
.Todavía no tengo idea de cómo reducirlo a 39, me pregunto si están usando lambda en absoluto.
fuente
(El OP solo especificó libremente el método / formato de entrada y salida, por lo que lo siguiente parece aceptable).
Cuaderno Sabio (
39 4140)En la celda actual,
donde
n,k
se ingresa y evalúa la entrada en el formulario en la celda anterior. Esto simula la "entrada de la línea de comandos" asignándola a_
(similar a los argumentos de la línea de comandos).Cuaderno Sabio (
42 4443)Alternativamente, usando "entrada en la fuente" (con solo los
x=
caracteres de nueva línea y añadidos a la partitura), por ejemplo,Ambos enfoques son obviamente derivados de respuestas anteriores de otros.
fuente
Tcl , 80 bytes
Pruébalo en línea!
fuente
Javascript, 27 bytes
Primero mis propias soluciones de 35 bytes:
O alternativamente,
El primero trabaja de forma recursiva, con la
(n,k) = (n-1,k) + (n-1,k-1)
regla simple . El segundo usando eso(n,k) = (n-1,k-1) * n/k
.EDITAR
Acabo de notar la solución de Arnould en un duplicado de esto:
Lo que equivale a 8 bytes menos (27 bytes)
fuente
TI-BASIC, 16 caracteres (8 bytes)
La entrada es una lista de longitud 2 in
Ans
.La salida es el resultado de la fórmula definida aquí .
Si la solución anterior no es suficiente, entonces la siguiente solución de 35 caracteres (24 bytes) también funciona:
Nota: TI-BASIC es un lenguaje tokenizado. El recuento de caracteres no es igual al recuento de bytes.
fuente