¡Hoy en mi clase de estadísticas, descubrí que algunos factoriales se pueden simplificar cuando se multiplican! Por ejemplo:5! * 3! = 5! *3*2 = 5! *6 = 6!
Tu trabajo:
Dada una cadena que contiene solo números arábigos y signos de exclamación, simplifique mi factorial a su cadena más corta posible, en la menor cantidad de bytes para su idioma, código de estilo de golf.
Entrada
Una cadena que contiene solo números arábigos y signos de exclamación. ¡Los factoriales para la entrada no serán mayores que 200 !. Los factoriales no tendrán más de un factorial por número. La entrada puede tomarse como una lista de enteros.
Salida
Una cadena posiblemente acortada, que tiene el valor equivalente en la entrada. El orden no es importante. La notación factorial es imprescindible, pero no es necesario que use más de un símbolo factorial por número.
Casos de prueba
In: 3!2!2!
Out: 4!
In 2!3!2!0!
Out: 4!
In: 7!2!2!7!2!2!2!2!
Out: 8!8!
In: 23!3!2!2!
Out: 24!
Also: 4!!
In: 23!3!2!2!2!
Out: 24!2!
In: 127!2!2!2!2!2!2!2!
Out: 128!
In: 32!56!29!128!
Out: 29!32!56!128!
La mejor de las suertes
1!1!
solo una cadena vacía?Respuestas:
Jalea ,
1718 bytesUn enlace monádico que toma y devuelve una lista de los números (se adhiere a la opción factorial por número)
Pruébalo en línea!
¿Cómo?
Una versión de golf (aunque escrita independientemente) de la solución de Pietu1998.
fuente
Jalea , 19 bytes
Pruébalo en línea!
Rápido y sucio. Muy lento, incluso el
23!2!3!2!
caso de prueba es un estiramiento. E / S como listas de enteros.Explicación
fuente
Limpio ,
397... 317 bytesPruébalo en línea!
Esto toma un valor
[Int]
, determina los factores primos del resultado y reduce los factores para encontrar la representación más pequeña, utilizando el factor más grande en cualquier etapa como valor de referencia para el siguiente término factorial. No completará algunos casos de prueba en TIO, pero es bastante * rápido y puede ejecutarlos en menos de 3 minutos en una computadora portátil de rango medio.* para un
O((prod(N)!)^sum(N))
algoritmo de complejidadfuente
> <> , 66 bytes
Pruébalo en línea!
No es eficiente, no encuentra la cadena más pequeña y el intérprete no maneja muy bien con números extremadamente grandes. Pero al menos lo intenté? Toma datos como una lista de números a través de la
-v
bandera.Primero, calcula el valor de la entrada factorizando cada número y multiplicándolos juntos. Luego encuentra el factorial más grande que se divide limpiamente en el total y lo genera. Repita hasta que obtenga un primo (que emite) o un 1 y salga del programa. Debido a esto, a veces no encuentra la representación más corta del número, por ejemplo, el caso de prueba
7!2!2!7!2!2!2!2!
devuelve en10!224
lugar de8!8!
porque encuentra que el total es divisible por 10. primero.fuente
Rubí ,
240 237233 bytesEsto es increíblemente ineficiente.
Acepta una matriz de entradas como entrada
Devuelve una cadena y elige la opción más corta entre, digamos
'720!'
,'6!!'
y'3!!!'
Pruébalo en línea!
fuente