Me hicieron esta pregunta en una entrevista, pero no pude encontrar ninguna solución. No sé si la pregunta era correcta o no. Intenté mucho pero no pude encontrar ninguna solución. Hablando honestamente, no se me ocurrió nada.
Rocco números
Un número entero positivo es un número Rocco si se puede representar como o n = p (p-14) , donde p es un número primo.
Los primeros 10 números de Rocco son:
Tarea
Su código debe aceptar un entero positivo como entrada y determinar si es un número Rocco o no.
Puntos brownie
- Escriba una función que calcule e imprima el recuento de números Rocco menores o iguales a 1 millón.
- Escriba una función que calcule e imprima el recuento de números Rocco de la pregunta de bonificación (arriba de uno) que son primos.
code-golf
decision-problem
number-theory
vijayscode
fuente
fuente
print 0
. Todos los números Rocco son compuestos(n*..)
, por lo que no hay números primos en ningún rango.Respuestas:
05AB1E , 8 bytes
Devuelve si es un número Rocco, o caso contrario.1 norte 0 0
Pruébalo en línea!
¿Cómo?
Dado un número entero positivo , probamos si existe un factor primo de tal que:norte pag norte
Comentado
fuente
JavaScript (ES7), 55 bytes
Pruébalo en línea!
¿Cómo?
Dado un entero positivo , estamos buscando un número primo tal que o .norte X x ( x + 14 ) = n x ( x - 14 ) = n
De ahí las siguientes ecuaciones cuadráticas:
La raíz positiva de es:( 1 )
y la raíz positiva de es:(2)
Por lo tanto, el problema es equivalente a probar si o es primo.x0 x1
Para hacer eso, utilizamos la clásica función de prueba de primitiva recursiva, con una prueba adicional para asegurarnos de que no se repita para siempre si se le da un número irracional como entrada.
Función de envoltura principal:
fuente
Perl 6 ,
4528 bytesPruébalo en línea!
Utiliza la construcción de Arnauld , que debe ser primo para que sea un número Rocco.n+49−−−−−√±7 n
Explicación:
fuente
Regex (ECMAScript),
6462 bytesEsta expresión regular encuentra dos números y modo que . Si los encuentra, afirma que o es primo. ¡Eso es!a a+14 n=a(a+14) a a+14
Utiliza una variante del algoritmo de multiplicación que se describe brevemente en un párrafo de mi publicación de expresiones regulares abundantes . Este es un spoiler . Así que no sigas leyendo si no quieres que se te estropee un poco de magia regex unaria avanzada . Si desea intentar descubrir esta magia usted mismo, le recomiendo comenzar resolviendo algunos problemas en la lista de problemas recomendados etiquetados consecutivamente con spoilers en esta publicación anterior , e intentando encontrar las ideas matemáticas de forma independiente.
El algoritmo de multiplicación se implementa de manera diferente aquí porque estamos afirmando que dos valores conocidos multiplicados juntos equivalen a otro valor conocido (como también se hizo en la versión alternativa de la expresión regular en esta publicación , para probar que un número sea un cuadrado perfecto). En la mayoría de mis otras respuestas de expresiones regulares publicadas hasta ahora, la multiplicación se implementa como un cálculo (no una afirmación, conceptualmente hablando) donde el objetivo es encontrar el producto de dos números conocidos. Ambos métodos funcionan en ambas circunstancias, pero en cuanto al golf, son peores para hacer el trabajo del otro.
Pruébalo en línea!
fuente
Brachylog ,
1312 bytesIngrese el número de candidato como argumento de línea de comando. Salidas
true
ofalse
. Pruébalo en línea!Explicación
El código es un predicado cuya entrada no tiene restricciones y cuya salida es el número que estamos probando.
(Los consejos son bienvenidos. Eso
{+|-}
todavía se siente torpe).fuente
Brachylog , 9 bytes
Enfoque diferente a la respuesta de DLosc
Toma N como salida, devuelve [P, P-14] o [P + 14, P] a través de la entrada (el número más grande primero)
explicación
Pruébalo en línea!
fuente
Pyth,
2220 bytesPruébelo en línea aquí .
Editar: los 3 bytes guardados como entrada siempre serán positivos, por lo que no es necesario filtrar los valores negativos de la lista. También se corrigió un error para las entradas
1
y2
costaba 1 byte. Versión previa:}Qsm*Ld>#0+Ld_B14fP_TU
fuente
05AB1E ,
161514 bytesAhorré 1 byte calculando 14 con en
7·
lugar dežvÍ
(no puedo creer que no haya pensado en esto en primer lugar).Guardado 1 byte gracias a Emigna
Pruébalo en línea! o Probar todas las entradas
Explicación
fuente
}˜så
paraQ}Z
utilizar la entrada implícita. Tu Test-Suite tendría que cambiarse un poco a algo como esto para que funcione. Además, una forma más obvia de escribiržvÍ
o7·
sería14
;)J ,
2115 bytesBasado en la solución de Arnauld :
Pruébalo en línea!
Intento anterior:
Pruébalo en línea!
fuente
14 e.q:|@-]%q:
por 14 bytesRetina 0.8.2 , 61 bytes
Pruébalo en línea! Explicación:
Convierte a unario.
\1
captura el mayor de los dos factores.\2
captura la constante 14, guardando un byte.\3
captura el menor de los dos factores, menos 1. Esto también asegura que ambos factores sean al menos 2.Verifique los dos factores para asegurarse de que al menos uno de ellos sea primo. La idea de usar
\2?
fue robada descaradamente de la respuesta de @ Deadcode.Repita el mayor de los dos factores varias veces igual a uno menos que el menor de los dos factores. Como ya hemos capturado el factor más grande una vez que esto termina capturando el producto de los dos factores.
Asegúrese de que el producto sea igual al número dado.
Una traducción directa a Retina 1 al reemplazar
$*
con*1
tendría el mismo conteo de bytes, pero un byte podría guardarse reemplazando todos los1
s con_
sy luego*1
podría reemplazarse con en*
lugar de*_
. Respuesta anterior de Retina 1 para 68 bytes:Pruébalo en línea! Explicación:
Convierte a unario.
Encuentra todos los pares de factores.
Asegúrese de que uno sea primo.
Toma la diferencia absoluta.
Comprueba si hay 14.
fuente
JavaScript (nodo de Babel) , 69 bytes
Maldición, pensé que iba a superar la respuesta de Arnaulds pero no .....: c
Pruébalo en línea!
Quiero deshacerme de la
x=>[...Array(x)].some(
parte usando la recursión para que pueda acortarse con el tiempoExplicación
Utiliza la fórmula
fuente
Japt , 10 bytes
Igual que mi respuesta de Javascript
Pruébalo en línea!
fuente
Jalea , 9 bytes
Pruébalo en línea!
fuente
APL (NARS) 16 caracteres, 32 bytes
{π⍵} encontraría la factorización de su argumento y suponemos que el último elemento de su resultado (la lista de divisores de n) es el máximo divisor primo de n; Aquí suponemos que una definición equivalente de número Rocco es: n es un número Rocco <=> factor primo máximo de n: r es tal que es verdadero 14 = ∣rn ÷ r [para el pseudocódigo C como 14 == abs (rn / r) esta definición de número de Rocco parece estar bien en el rango 1..1000000]; el rango del valor ok sería 1..maxInt; prueba:
fuente
C # (compilador interactivo de Visual C #) , 99 bytes
Pruébalo en línea!
Enumerable.Range
ataca de nuevo :) Usando el indicador del compilador loco, puedes reducir las cosas bastante, aunque soy un fanático de la solución de vainilla.C # (compilador interactivo de Visual C #) + /u:System.Linq.Enumerable, 77 bytes
Pruébalo en línea!
A continuación se muestra un puerto de la solución de Arnauld que parecía bastante genial. Actualmente es el más largo, pero probablemente se pueda jugar golf.
C # (compilador interactivo de Visual C #) , 101 bytes
Pruébalo en línea!
fuente
APL (NARS) 30 caracteres, 60 bytes
Aquí 0π es la función decir si un número es primo, prueba:
fuente
F #, 2 respuestas (sin competencia)
Realmente me gustaron las respuestas de @Arnauld, así que las traduje.
123 bytes , basado en la respuesta de JavaScript
Explicación:
125 bytes , basado en la respuesta 05AB1E
Explicación:
fuente
Python 2 , 58 bytes
Salidas por código de salida, falla (
1
) para números Rocco.Pruébalo en línea!
fuente