La formula
Tomemos por ejemplo el número 300
- Los factores primos de 300 son
[2, 3, 5]
(números únicos que son factores de 300 y primos) - Cuadrar cada uno de esos números te dará
[4, 9, 25]
- Sumar esa lista te dará
4 + 9 + 25 = 38
- Finalmente reste esa suma (38) de su número original
300-38 = 262
(este es el resultado)
Entrada
Su entrada será un número entero positivo mayor que 2. Debe verificar todos los números del 2 al valor de entrada (inclusive) y encontrar el número que produce el mayor resultado con la fórmula anterior.
Salida
Su salida será dos números separados por un espacio, una coma, una nueva línea o lo que su idioma permita (la separación es necesaria para distinguir los dos números). Estos pueden enviarse a un archivo, stdout o lo que sea que use su idioma. Su objetivo es encontrar el número en el rango que produce la salida máxima cuando se ejecuta la fórmula anterior. El primer número que se muestra debe ser el número inicial (como 300) y el segundo número debe ser el resultado que produjo la fórmula (como 262)
Casos de prueba
Input: 3 Output: 2, -2
Input: 10 Output: 8, 4
Input: 50 Output: 48, 35
Input: 1000 Output: 1000, 971
Input: 9999 Output: 9984, 9802
Trabajado a través del ejemplo
Considere la entrada de 10, debemos ejecutar la fórmula para todos los números del 2 al 10 (inclusive)
Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2 [2] [4] 4 -2
3 [3] [9] 9 -6
4 [2] [4] 4 0
5 [5] [25] 25 -20
6 [2, 3] [4, 9] 13 -7
7 [7] [49] 49 -42
8 [2] [4] 4 4
9 [3] [9] 9 0
10 [2, 5] [4, 25] 29 -19
Como puede ver, el mejor resultado es el 4
resultado de ingresar el valor 8
en la fórmula. Eso significa la salida para una entrada de10
debería ser8, 4
Puntaje y Reglas
Se aplican las reglas predeterminadas para entradas y salidas: Predeterminado para Code Golf: Métodos de entrada / salida
Las lagunas estándar están prohibidas: Lagunas que están prohibidas por defecto
presentaciones pueden ser funciones o programas completos
El código más corto en bytes gana
50
:35, 48
?Respuestas:
Pyth,
1715 bytesBanco de pruebas.
fuente
Java 8 lambda,
247239233225224219198161 caracteresPensé que debía ser posible en menos de 300 caracteres porque ... ya sabes ... ¡Java!
¡Y de hecho es posible incluso en menos de 200 caracteres!
No sé si este uso de las importaciones es legítimo, pero supongo que debería estar bien.Aquí está la lambda sin golfista en una clase:El hallazgo de factores primos se basa en esta respuesta . El código utiliza la funcionalidad de los conjuntos, ya que solo guardan cada valor una vez, por lo que no tengo que preocuparme por los duplicados agregados más adelante. El resto del código es bastante sencillo, solo sigue la pregunta.
Actualizaciones
Se eliminó la nueva línea de la salida.
Gracias a @ogregoire por jugar al golf Integer.MIN_VALUE a 1 << 31!
Después de buscar el código nuevamente, encontré algunos lugares más donde las cosas podían jugar golf.
¡Gracias a @Blue por el truco == 0 a <1!
Se eliminaron algunos espacios en blanco sobrantes. Además, para la separación solo se necesita un carácter, por lo que no es necesario desperdiciar un carácter.
¡Gracias nuevamente a @ogregoire por señalar que puedo devolver el valor en lugar de imprimirlo y armar las declaraciones! Esto ahorró mucho!
Descubrí que puedo usar un ternario en lugar del segundo si para guardar un personaje más.
Gracias a @AstronDan por el increíble uso de una matriz que guarda la importación. Eso también me dio la posibilidad de acortar el primero si es ternario.
fuente
Integer.MIN_VALUE
se puede acortar como1<<31
.int
en el mismo lugar para evitar repetirlosint
varias veces y asígneles su valor allí si es posible.System.out.println(...)
y devuelva un valor en lugar de imprimirlo: como el OP menciona, el método estándar de E / S está en uso.En realidad, 21 bytes
Pruébalo en línea!
Explicación:
fuente
Actually Programming Language
y no encontré nada incluso después de navegar por la quinta página de resultados de Google. ¿Que idioma es este?MATL , 18 bytes
Pruébalo en línea!
El último caso lleva demasiado tiempo para el compilador en línea, pero produce el resultado correcto (tarda unos 11 segundos en mi computadora, ejecutándose en Matlab):
Explicación
Aplicación directa del procedimiento descrito.
fuente
C #, 194 bytes
Mi primer código de golf :). Usé mi idioma favorito a pesar de su verbosidad. Comencé esto como un puerto de función C # de Java de @ Frozn, pero encontré varias formas de reducir aún más el código con optimizaciones.
Esto usa una matriz para almacenar los factores primos. Debido a que está indexado por el factor, reemplazará los factores repetidos con copias del factor. Esto permite que la función no tenga importaciones. Esto ni siquiera requiere sistema.
fuente
Bash + utilidades GNU, 74
seq
genera todos los enteros 2 a nfactor
da el número seguido de dos puntos, luego una lista separada por espacios de todos los factores primos, incluidos los duplicados. por ejemplo, el resultado para 12 es12: 2 2 3
sed
elimina los dos puntos y los factores duplicados, luego genera la expresión aritmética requerida. por ejemplo para 12:12- 2* 2- 3* 3
bc
evalúa estonl
prefijos n de nuevo (a partir de 2)sort
por la segunda columna, numéricamente, en orden descendenteseq
imprime la primera línea y se cierra.Ideona
fuente
Brachylog , 48 bytes
Explicación
fuente
Jalea , 13 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
05AB1E,
191716 bytesCódigo:
Explicación:
Pruébalo en línea
fuente
Julia, 56 bytes
Pruébalo en línea!
Cómo funciona
Dada una entrada n , para cada entero k tal que 2 ≤ k ≤ n , generamos la tupla (f (k), k) , donde f (k) es la diferencia entre k y la suma de los cuadrados de sus factores primos .
f (k) se calcula con
k-sumabs2(k|>factor|>keys)
, que factoriza k en un Dict de claves primas y valores de exponente, extrae todas las claves (factores primos), toma la suma de sus cuadrados y resta el entero resultante de k .Finalmente, tomamos el máximo lexicográfico de las tuplas generadas y lo invertimos accediendo a él en los índices 2 y 1 .
fuente
Clojure, 215 bytes
Solo sigue las reglas. Calcula los factores primos de cada número, los pone al cuadrado y los suma. Después de eso, genere una lista de vectores de 2 elementos: número inicial y su resultado y encuentre el elemento con el valor máximo del segundo elemento.
Puede verlo en línea aquí: https://ideone.com/1J9i0y
fuente
R 109 bytes
Hice trampa y se utiliza un paquete,
gmp
.fuente
CJam, 32 bytes
Pruébalo en línea!
fuente
Pyke, 17 bytes
Pruébalo aquí!
fuente
PowerShell v2 +,
124120117 bytesLa primera línea calcula los valores, la segunda es solo salida.
Comenzamos con la creación de un rango de
2
hasta nuestro argumento de línea de comandos$args[0]
y lo repetimos|%{...}
. En cada ciclo establecemos variables auxiliares iguales a nuestro valor actual$y=$z=$_
. Luego recorremos cada número desde2
hasta nuestro número actual. Cada ciclo interno verificamos si ese número es un divisor!($z%$_)
y si es primo('1'*$_-match'^(?!(..+)\1+$)..')
, y si es ambos, restamos el cuadrado de$y
(las verificaciones se realizan mediante la multiplicación booleana).Una vez que pasamos por todos los divisores primos y restamos los cuadrados, si el número restante es el más grande que hemos visto hasta ahora
$y-gt$o
, establecemos nuestras variables de salida$o=$y;$p=$_
. Después de recorrer todo el rango, simplemente salimos con un espacio entre ellos.fuente
Haskell, 91 bytes
Ejemplo de uso:
f 50
->[48,35]
.Las funciones de factores primos solo están disponibles a través de las
import Data.Numbers.Primes
cuales cuesta demasiados bytes, por lo que estoy usando el verificador principal de @ Lynn . El resto es sencillo: para la entrada dem
buclen
a través de[2..m]
y en un bucle interiorp
a través[2..n]
. Mantenga todo lop
que es primo y dividan
, cuadrado y suma.fuente
Python 2,
108105100 bytesPruébalo en Ideone .
fuente
JavaScript (ES6),
111105bytesNo tengo idea de por qué no pensé hacer esto recursivamente antes.
fuente
J, 44 bytes
Enfoque directo. También devuelve todos los valores de
n
ese resultado en un valor máximo.Uso
fuente