Algunos números como: 6, 12, 20, 30, 42, 56, 60, 90, 120, etc., se pueden expresar como un producto de números enteros consecutivos como se muestra a continuación.
6 = 2 * 3
12 = 3 * 4
30 = 5 * 6
60 = 3 * 4 * 5
90 = 9 * 10
120 = 4 * 5 * 6
Escriba un programa o función que genere una lista de enteros consecutivos cuyo producto sea igual al número especificado.
Ejemplos de números que no son adecuados para esta lógica son:
99 = 9 * 11 (Product of non-consecutive numbers)
121 = 11 * 11 (Same numbers)
2 = 1 * 2 (Product of itself and 1)
13 = 13 (Product of only one number)
Tenga en cuenta que para el caso de 2 = 2 * 1
, no lo consideramos como un resultado válido, ya que un número entero multiplicado por 1 da el mismo resultado. Para esta pregunta, consideraríamos solo enteros> = 2 en el producto.
Entrada
Un entero positivo válido de 32 bits. Puede ser de entrada estándar, un argumento de función, etc.
Salida
Una lista de números enteros consecutivos> = 2 (en orden ascendente o descendente). Si hay varias combinaciones de enteros consecutivos, solo proporcione una instancia. Si proporciona más, está bien.
Restricciones
El código debe tomar un tiempo razonable (<5 minutos) para ejecutarse en una computadora estándar para todas las entradas válidas (enteros positivos de 32 bits). Si hay un producto entero consecutivo, el código debe generar uno o más dentro del límite de tiempo. De lo contrario, el código debe terminar sin salida dentro del límite de tiempo.
Este es el código de golf, por lo que gana el código más corto en bytes.
30=5*6
.Respuestas:
Java - 124
Comenzando en 2, esto se repite hasta que el número de inicio es> la raíz cuadrada del objetivo (o el objetivo se alcanza exactamente). Si el producto es bajo, se multiplica por el número alto y lo incrementa. Si es alto, se divide por el número inicial y lo incrementa.
Por ejemplo, para 30, comprobaría:
Emite una cadena de factores separados por espacios en orden ascendente.
Con saltos de línea:
fuente
Python -
104 97 9592 pruébaloSi
n
, por ejemplo, se establece en 120 de antemano, el programa genera las dos soluciones:fuente
+=
. Pero extraño++
en Python ...if s>=n
yif s/n
son equivalentes, por lo que puede proporcionar todas las soluciones en el mismo número de caracteres.s=s*(i+c)
as*=i+c
.Clojure -
127109 bytesEjemplo:
Explicación:
Este es un enfoque funcional básico y poco optimizado. Creo una lista perezosa de todas las posibilidades usando un bucle simple sobre ellas (omite todas las combinaciones que darían números demasiado grandes, evitando el desbordamiento) y tomo la primera de ellas. Si no existen posibilidades, devuelve nulo.
Más fácil de probar en http://tryclj.com/ .
También noté que puedo devolver todas las posibilidades:
120 bytes102 bytes , pero da resultados en una lista anidada.Ejemplo:
fuente
CJam, 31 bytes
Es un enfoque de fuerza bruta, pero el tiempo de ejecución es de solo un par de segundos usando el intérprete oficial de Java .
Si desea probar el código utilizando el intérprete en línea , debe mantener la entrada razonablemente baja. Cualquier cosa menos que 2 26 todavía funciona en mi máquina.
Ejemplos
Cómo funciona
fuente
Java, 162
devuelve una matriz de enteros, o
null
si no hay números consecutivos que existan.sin golf:
fuente
C 105
110pruébalo144 con bonificación: este itera a través de cada número y encuentra productos coincidentes
fuente
k < n
va demasiado alta debido ak *= l++
. podría agregar sin firmar mucho tiempo al principio, pero ... eso arruinaría vidasPHP 258 caracteres, 201 sin contar la función factorial.
La forma más simple de expresar matemáticamente "factores consecutivos que equivalen a un número" es
X!/Y!
WhereX
es el número más alto yY
es el menos menos uno. Desafortunadamente, dejé de tomar cálculos antes de aprender a resolverZ = X!/Y!
, así que tuve que aplicar un poco de fuerza bruta.Versión desordenada y sin golf:
Salida de ejemplo:
Golfizado:
Salida:
¡No esperaba que el tiempo de ejecución fuera tan rápido!
fuente
Pyth , 35
Nota: Mi código realmente encuentra la representación más corta de la entrada como una representación de enteros consecutivos> = 2, por lo que en una entrada no válida imprimirá una lista de 1 elemento, posiblemente después de mucho tiempo. Como la declaración del problema dice que la entrada será válida, supongo que esto está bien.
Breve explicación:
Esencialmente, el programa almacena los límites superior e inferior de un rango, calcula el producto de los números en el rango usando una reducción, ajusta los puntos finales según sea necesario y repite hasta que el producto iguale la entrada.
Larga explicación:
Para cada fragmento de código, daré python equivalente, así como una explicación y razonamiento más detallados.
Jvw
=>J=eval(input())
Manera estándar de tomar entrada en Pyth.
Kr2 4
=>K=range(2,4)
=>K=[2,3]
Aquí está la primera parte extraña: en lugar de almacenar los puntos finales como variables separadas, los estoy almacenando como elementos de una lista. La razón pronto estará clara. Además, en lugar de hacer una tarea simple, que en Pyth sería
K[2 3)
, estoy usando un rango para guardar un personaje.W-ZJ
=>while Z-J
=>while Z!=J
En este punto, puede preguntar: "¿Qué es Z? No lo ha definido". En Pyth, todas las variables vienen predefinidas. Z comienza a iniciarse como 0. Sin embargo, Z se establecerá en el valor del producto más adelante, por lo que esta verificación servirá para finalizar el ciclo while una vez que la lista esté en el valor correcto.
~@K>JZ1
=>K[J>Z] += 1
He aquí por qué estoy almacenando los valores en una lista, no en variables separadas: deseo incrementar uno de los dos puntos finales, dependiendo de si el producto es actualmente demasiado alto o demasiado bajo. Eso sería un condicional bastante largo si los puntos finales fueran variables separadas, pero con la magia de la indexación de listas, se vuelve corto. Además, el hecho de que esta verificación se realice antes del producto, y el hecho de que Z se inicialice a 0, aseguran que K estará
[2,4]
en el momento en que tomamos el producto, que son los puntos finales adecuados.=YurGHK
=>Y=reduce(lambda G,H: range(G,H),K)
=>Y=range(K[0],K[1])
Ahora, necesito la lista real de que el producto se hará cargo, y que se imprimirá si tenemos éxito. Claramente, utilizaremos una función de rango. El truco radica en obtener las entradas para la función de rango. La forma obvia de hacer esto, indexando la lista, sería
=Yr'K@K1
. Sin embargo, al usar una función de reducción en esta lista de dos elementos, podemos acortar eso por un carácter.=Zu*NTY
=>Z=reduce(lambda N,T: N*T,Y)
Y ahora, para todo el asunto de este asunto, la operación de reducción para encontrar el producto de la lista.
)
=> Finalizar mientrasY
=>print(Y)
En caso de éxito, imprima la lista.
Ejemplo de ejecución:
fuente
Java - 115
Ligeramente menos golfizado:
fuente
System.out.println
hastaSystem.out.print
y el punto y coma al final defor(int k=1,x=j;(x*=j+k)<i;k++)
no sólo es innecesario, sino que también provoca errores.x
,j
,k
Están fuera del alcance de los últimosif/for
bloques debido a una;
. Si elimino el;
, no imprime nada.print
significaría que necesita agregar un espacio en blanco para evitar que los números se ejecuten juntos.Matlab (88)
El código espera que el número se almacene
x
y se envíel
.Dado que
13! > 2^32
este código busca solo productos de longitud 2 hasta 12. Este código tiene un tiempo de ejecución constante de alrededor de 0.001s.fuente
Scala - 86
Este código es muy ineficiente, pero optimizarlo solo agregaría unos pocos caracteres más. Utiliza un enfoque funcional para verificar los productos de todas las secuencias consecutivas posibles. (una secuencia consecutiva de enteros se representa como un objeto Range en Scala)
sin golf:
fuente
CJam no funciona actualmente para grandes cantidades debido al largo tiempo de cálculo
Este es mi código CJam más corto. Prueba en http://cjam.aditsu.net/ . Funciona: definiendo la entrada como A; creando una matriz de todos los números del 0 al A-1; Pateando 0; patear los números más pequeños hasta multiplicar todos los números en la matriz no es mayor que A; comprobar si es mayor que A; si no, creando una matriz de 0 a A-2; y repitiendo hasta que se encuentre la respuesta. Si no se encuentra ninguno, se lanza una excepción. No consideré que se necesitaran espacios entre los números, por lo que están incluidos en el segundo código, que tiene 32 caracteres de longitud.
fuente
Dart - 102 caracteres
Esta es una implementación lenta. Se puede hacer más rápido, pero eso requiere más caracteres (como hacer el ciclo solo hasta
i*i<n
)(Los 102 caracteres no tienen saltos de línea ni espacios iniciales).
Para usarlo, haga algo como:
fuente
Javascript, 88
Código de golf:
Código más fácil de leer (muy bien espaciado):
Para cada número del 2 al número de entrada, encuentra el producto de enteros consecutivos desde el número actual de nuevo a 2. Si este producto es igual al número de entrada, entonces se emite la serie de números consecutivos, junto con el número de entrada original. .
Produce el número de entrada seguido de los enteros consecutivos cuyo producto es el número de entrada.
Por ejemplo, f (120) produce una alerta con el texto "120,5,4,3,2" y luego una segunda alerta con el texto "120,6,5,4".
fuente