Calcular el número, Edición de divisores

11

Inspirado por esta pregunta sobre matemáticas.

Deje que la factorización prima de un número, n , ser representado como P (n) = 2 a x 3 b x 5 c x ... .
(Usando x como el símbolo de multiplicación.)
A continuación, el número de divisores de n puede ser representado como D (n) = (a + 1) x (b + 1) x (c + 1) ... .
Por lo tanto, podemos decir fácilmente que el número de divisores de 2n es D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
el número de divisores de 3n es D (3n ) = (a + 1) x (b + 2) x (c + 1) ... ,
y así sucesivamente.

Desafío:

Escriba un programa o función que use estas propiedades para calcular n , dadas ciertas entradas de divisor.

Entrada:

Un conjunto de enteros, llamémoslos w, x, y, z , con todas las siguientes definiciones:

  • todas las entradas son mayores que 1 - w, x, y, z > 1
  • x y z son distintos -x<>z
  • x y z son primos - P(x)=x, D(x)=2y P(z)=z,D(z)=2
  • w es el número de divisores de xn -D(xn)=w
  • y es el número de divisores de zn -D(zn)=y

Para el problema dado en la pregunta vinculada, podría ser un ejemplo de entrada (28, 2, 30, 3). Esto se traduce en D(2n)=28y D(3n)=30, con n=864.

Salida:

Un entero único, n , que satisface las definiciones anteriores y las restricciones de entrada. Si varios números se ajustan a las definiciones, genere el más pequeño. Si no es posible ese número entero, generar un error valor .

Ejemplos:

(w, x, y, z) => output

(28, 2, 30, 3) => 864
(4, 2, 4, 5) => 3
(12, 5, 12, 23) => 12
(14, 3, 20, 7) => 0 (or some other falsey value)
(45, 13, 60, 11) => 1872
(45, 29, 60, 53) => 4176

Reglas:

  • Se aplican las reglas estándar de código de golf y las restricciones legales.
  • Reglas estándar de entrada / salida aplican las .
  • Los números de entrada pueden estar en cualquier orden; especifique en su respuesta qué orden está utilizando.
  • Los números de entrada pueden estar en cualquier formato adecuado: separados por espacios, una matriz, función separada o argumentos de línea de comandos, etc. - usted elige.
  • Del mismo modo, si la salida a STDOUT, el espacio en blanco circundante, la nueva línea final, etc., son opcionales
  • El análisis de entrada y el formato de salida no son las características interesantes de este desafío.
  • En aras de una complejidad sensata y desbordamientos de enteros, el número de desafío n tendrá restricciones tales que 1 < n < 100000, es decir, no necesita preocuparse por posibles respuestas fuera de este rango.

Relacionado

AdmBorkBork
fuente
Entonces, si la solución más pequeña es mayor que 100,000, ¿puedo elegir devolver una solución o cero?
Dennis
@Dennis Si acorta tu código, seguro. Cualquiera de los dos sería aceptable.
AdmBorkBork

Respuestas:

3

Jalea , 17 16 bytes

×€ȷ5R¤ÆDL€€Z=Ḅi3

Esta es una solución de fuerza bruta que prueba todos los valores posibles hasta 100,000. Pruébalo en línea!

Versión no competitiva

La última versión de Jelly tiene una corrección de errores que permite reducir el código anterior a 15 bytes .

ȷ5R×€³ÆDL€€=Ḅi3

Pruébalo en línea!

Cómo funciona

×€ȷ5R¤ÆDL€€Z=Ḅi3  Main link. Left input: x,z. Right input: w,y

     ¤            Combine the two atoms to the left into a niladic chain.
  ȷ5              Yield 100,000 (1e5).
    R             Apply range. Yields [1, ..., 100,000].
x€                Multiply each r in the range by x and z.
                  This yields [[x, ..., 100,000x], [z, ..., 100,000z]].
      ÆD          Compute the divisors of each resulting integer.
        L€€       Apply length to each list of divisors.
                  This counts the divisors of each integer in the 2D array.
           Z      Zip; group the divisors of kx and kz in pairs.
            =     Compare each [divisors(kx), divisors(kz)] with [w, y].
                  This yields a pair of Booleans.
             Ḅ    Convert each Boolean pair from binary to integer.
              i3  Find the first index of 3. Yields 0 for not found.
Dennis
fuente
¡Felicidades, ganas por defecto! : D
AdmBorkBork