La tarea es calcular la suma del divisor de un número dada su factorización prima.
Entrada
Dos matrices (o algo equivalente) de longitud n , una que contiene el factor primo y la otra que contiene el exponente correspondiente.
Salida
La suma de todos los divisores (incluido el número mismo).
Ejemplo
El número 240 tiene 2, 3 y 5 como factores primos con 4, 1 y 1 como los respectivos exponentes. La producción esperada sería entonces de 744.
Input: [2,3,5] [4,1,1]
Output: 744
Puntuación
¡El código más corto en bytes gana!
Si la complejidad del tiempo de ejecución de su solución es O (suma de exponentes) en lugar de O (producto de exponentes), su puntaje puede multiplicarse por 0.8.
Hubo una pregunta similar publicada aquí, pero no fue un desafío. Creo que el problema es lo suficientemente interesante como para jugar al golf.
El ganador será elegido este fin de semana.
Respuestas:
Pyth, 13 bytes * 0.8 = 10.4
Demostración.
Esta respuesta funciona de manera algo diferente a las anteriores. Para calcular la suma de los factores de las potencias primarias del número, en lugar de usar una fórmula aritmética, los factores se construyen y se suman explícitamente.
Por ejemplo, en el par [privilegiada, exponente]
[2, 4]
, hacemos un mapa2 ^ x
más0, 1, 2, 3, 4
, dando[1, 2, 4, 8, 16]
, que se resume a continuación a 31.Los resultados se multiplican y se imprimen.
Si la exponenciación se implementa correctamente, o si hay un almacenamiento intermedio de resultados, esto será
O(sum of exponents)
.fuente
O(n)
si podemos suponer que la base es una constante.CJam, 15 bytes * 0.8 = 12
Pruébalo en línea . El orden de entrada es primero la lista de exponentes, luego la lista de primos (-3 bytes gracias a @Dennis) .
Para cada par primo-exponente
(p, e)
encuentreluego encuentre el producto de todos estos. Por ejemplo, para 240 esto sería
Dependiendo de cómo se implemente la exponenciación, esto puede ser mejor que
O(sum of exponents)
.fuente
APL,
1813 bytes * 0.8 = 10.4Esto crea un tren de función diádica que toma la matriz de factores a la izquierda y los exponentes a la derecha.
Pruébalo en línea . Tenga en cuenta que este es el mismo enfoque que la respuesta CJam increíblemente inteligente de Sp3000 .
¡Guardado 5 bytes gracias a Dennis!
fuente
TI-BASIC, 17 bytes * 0.8 = 13.6
También usa el método de Sp3000, aunque lo encontré de forma independiente. Toma una lista de Entrada y otra de la pantalla de inicio.
Usar prod (dos veces es más pequeño porque nos permite usar el paréntesis abierto de forma gratuita. Tenga en cuenta que esta respuesta no admite matrices vacías, porque no hay matrices vacías en TI-BASIC.
fuente
Haskell, 38 * 0.8 = 30.4
Uso:
La función anónima lleva
(p,e)
a la suma del divisor ap^e
través de la suma de series geométricas. Comprimir las dos listas con esto como unir y tomar el producto da el resultado.No pude encontrar nada más corto que la expresión aritmética
Tal vez hay una manera de deshacerse de él
(\p e->_)
.La definición de la función Infix da la misma longitud (38):
fuente
C ++,
1118077 bytes * 0.8 = 61.6Esto calcula (p ^ (e + 1) -1) / (p-1) y multiplica recursivamente todos los factores. Lo descubrí hace un año.
Gracias por ayudar, me olvidé por completo del uso booleano de estilo c ++.
fuente
n==0
simplifica a!n
- o podría revertir los resultados y simplemente usarn
Matlab, 53
Ejemplo:
fuente
s
y luego pruebo todos los divisores posibles de1
as
. Entonces es (al menos) O (s), que probablemente esté entre O (suma de exponentes) y O (producto de exponentes)Python 2,156
Entrada
Salida
Explicación
Este programa recibe una lista de 2 listas: factores y exponentes.
Luego, crea una lista de todas las combinaciones posibles de la lista de exponentes.
y comprimirlo con los factores:
Calcule los factores para la potencia de los exponentes:
y multiplique cada lista (esto nos da todos los divisores):
Finalmente, sume todas las listas e imprima:
fuente
Pitón 3,
134120117Entrada: dos matrices separadas por comas separadas por comas.
Ejemplo:
Con NumPy se puede reducir a 100 bytes:
fuente
operator
para usarmul
una vez, puedes usarfloat.__mul__
para guardar un montón de bytes.Gelatina, no competidora
Esta respuesta no es competitiva, ya que el desafío es anterior a la creación de Jelly.
5 bytes (sin bonificación)
Pruébalo en línea!
Cómo funciona
7 bytes (5.6 bytes después de la bonificación)
Cómo funciona
Pruébalo en línea!
fuente
APL, 12 bytes * 0.8 = 9.6
Esto lee dos listas del teclado, los exponentes primero, es decir:
Explicación:
⎕
: leer una lista desde el teclado (los exponentes)⍳¨
: para cada número en la lista, generar una lista[1..n]
.⎕*
: lea otra lista desde el teclado (los números primos) y eleve cada primo a cada uno de los exponentes en las listas correspondientes+/¨
: suma cada lista1+
: agregue uno a cada resultado, para compensar la faltax^0
en cada una de las listas×/
: tome el producto de los resultadosfuente
Raqueta (esquema), 65 * 0.8 = 52 bytes
La misma aritmética que todos los demás.
Explicación:
fuente
Python 2, 80 Bytes * 0.8 = 64
Esto supone que la entrada viene una tras otra. Sigue la misma fórmula que se describe en la respuesta CJam de Sp3000.
Si esto no está permitido, lo usaré como una solución, que obtiene una puntuación de 84 bytes * 0.8 = 67.2. La entrada debe estar separada por una coma, es decir
[2,3,5],[4,1,1]
.Psst. ¡Oye! Esta es una posible solución en Symbolic, algo en lo que estoy trabajando:
Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))
fuente
Mathematica, 40 bytes
Sin usar ninguno de los inbuilts que tratan con divisores, para diferenciar de la otra solución matemática en el hilo.
La entrada es (usando el ejemplo)
[{2, 3, 5}, {4, 1, 1}]
fuente
Perl 5, 96 bytes
Obviamente esto no es ganador, pero decidí escribirlo por diversión.
Es una subrutina:
Véalo en acción así:
Cómo funciona:
($b,$e)=@_
lee los arrays de entrada$b
(bases) y$e
(exponentes).$s=1
Inicializa el producto.map$s*=$b->[$_]**$e->[$_],0..@$b-1
multiplica$s
por sucesivas potencias de exponente base. Ahora$s
es el número compuesto.$_=1x$s
conjuntos$_
iguales a una cadena de unos,$s
largos.$i
se inicializa en 0.for$j(1..$s){$i+=$j*/^(.{$j})*$/}
intenta, para cada número$j
entre 1 y$s
, dividirse$_
como$j
caracteres repetidos cualquier cantidad de veces. Si puede, entonces se$j
divide$s
, y/^(.{$j})*$/
es 1 (de lo contrario es 0), y$i
se aumenta por$j
. Por lo tanto, agregamos al$i
número de particiones en una partición de igual tamaño$_
. Como señala Omar E. Pol ,$i
es el número que estamos buscando.$i
Al final vuelve$i
.fuente
J, 14 bytes * 0.8 = 11.2
Uso
fuente