Un número es un primo Chen si cumple dos condiciones:
- Es primo en sí
- Sí más dos es un primo o un semi-primo.
Un primo es un número donde tiene exactamente dos divisores y esos divisores consisten en sí mismo y uno.
Un semi-primo es un número que es el producto de dos primos. (Tenga en cuenta que 12 = 2 * 2 * 3 no es semi-prime, pero 25 = 5 * 5 sí).
Su tarea es determinar si un número es un primo Chen. Debe generar cualquier valor verdadero para sí y cualquier valor falso para no.
La entrada será cualquier número entero mayor o igual a uno. También se puede tomar como una cadena, una matriz de caracteres o una matriz o dígitos.
Ejemplos:
101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy
Este es OEIS A109611 .
Esto está, en parte, inspirado en ¿Soy una prima de Sophie Germain? que, desafortunadamente, se cerró como un duplicado, por lo que publico un desafío relacionado que no es un duplicado.
True
por la verdad2
oFalse
por la falsedad (valores de falsedad inconsistentes)?2 * 2 * 2 * 3 * 3
un semi-prime? ¿Qué hay de5 * 5
?5*5
es semi-prime,2*2*2*3*3
no lo es. Dije exactamente dos.2*2*2*3*3
tiene exactamente dos factores primos, a saber,2
y3
, y5*5
tiene un factor primo, a saber5
.) ¿Tal vez podría editar eso en la pregunta?Respuestas:
Brachylog , 7 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E , 8 bytes
Pruébalo en línea!
Explicación
fuente
ArnoldC , 1339 bytes
Pruébalo en línea!
(Esta es mi primera publicación en codegolf.SE, por favor avíseme si está formateada incorrectamente. Me doy cuenta de que este recuento de bytes no es competitivo, esto es solo por diversión).
fuente
Jalea , 10 bytes
Pruébalo en línea!
fuente
Pyth, 10 bytes
Pruébalo en línea!
¿Cómo?
fuente
Python con sympy ,
6956 bytes-13 bytes gracias a alephalpha (actualizando a sympy 1.1 y usando
primeomega(n+2)
para reemplazarsum(factorint(n+2).values())
)... tomando el relevo del envío eliminado de Gryphon.
Una función sin nombre que regresa
True
para los primos Chen yFalse
otrosCuenta los factores
n+2
sumando las multiplicidades de su factor primo.Tenga en cuenta que
3
se multiplica porisprime(n)
antes de que<
se haga la comparación, por lo tanto, paran
las pruebas de código no primas sin+2
tiene menos de0
factores (siempre cedenFalse
), mientras que para primasn
verifica sin+2
es primo o semiprime.fuente
3*isprime(n)
truco es lo que estaba buscando al limpiar la declaración condicional.Pari / GP , 29 bytes
El
3*isprime(n)
truco es robado de la respuesta de Jonathan Allan .Pruébalo en línea!
fuente
Java 8,
858483 bytes-1 bytes gracias a @ OlivierGrégoire mediante el uso de un enfoque iterativo en lugar de recursivo.
Explicación:
Pruébalo aquí
fuente
n->{int N=n+2,f=0,F=0,d=1;for(;d++<n;f+=n%d<1?1:0)F+=N%d<1?1:0;return n>1&f<2&F<3;}
.Mathematica, 28 bytes
fuente
JavaScript (ES6),
6361 bytesDefine una función
f
que toman
como argumento y devuelve el resultado. Estoy muy contento con cómog
resultó; cuenta el número de factores primos en un número.2 bytes ahorrados gracias al
&
truco de Kevin Cruijssen .Sin golf
fuente
&&
a&
? ¿Desde 0/1 también son valores de veracidad / falsey en JS?|
y&
no cortocircuite, eso podría ahorrar aún más bytesg
.Japt ,
2220191312 bytesPruébalo
fuente
PHP, 64 bytes
impresiones
0
para la verdad, otros enteros para la falsedad. Ejecutar como tubería con-nR
o probarlo en línea .Descompostura
valor falso falso, 65 bytes:
impresiones
1
para la verdad y0
para la falsedad.fuente
Python 3 con SymPy,
7371 bytesPruébalo en línea!
Esta es una versión más desarrollada de una respuesta publicada aquí anteriormente, pero parece que se ha eliminado.
¡Gracias a @JonathanAllan por guardar 2 bytes!
fuente
f=
, crear una función sin nombre está bien para code-golf.PHP , 87 bytes
Pruébalo en línea!
PHP , 87 bytes
Pruébalo en línea!
fuente
APL NARS, 23 caracteres
Aquí π⍵ devuelve la matriz de factores de ⍵ diferentes de 1; alguna prueba:
fuente
Regex (ECMAScript), 31 bytes
Pruébalo en línea! (mostrando todos los primos de Chen ≤ 1000)
Dada una cadena de n
x
s, esta expresión regular coincidirá si y solo si n es un primo Chen.Afirma que n es mayor que 2 y que la cadena no tiene la forma.
((xx+)(\2(xx))*)(\1\4)+
Esta expresión regular tiene dos significados, dependiendo de cuántas veces
(\2(xx))
se repita.Cuando se repite 0 veces, la expresión regular se puede simplificar para
(xx+)\1+
que coincida con los números compuestos.Cuando se repite un número positivo de veces, la expresión regular es equivalente a
((xx+)(\2xx)+)(\1xx)+
Esa expresión regular requiere alguna explicación, sin embargo, proporcionaré poca información.
Si revisa el álgebra, encuentra que
((xx+)(\2xx)+)(\1xx)+
coincide con los números de la formaa*b*c-2
dondea≥4,b≥2,c≥2
.Por lo tanto, coincidirá (casi) siempre que n +2 tenga más de 2 factores primos. (es decir, ni prime ni semi-prime)
Tenga en cuenta que no coincide con 6, 16 o 25, pero que esto no importa, porque todos son compuestos.
Entonces
(?!((xx+)(\2(xx))*)(\1\4)+$)
coincidirá siempre que n no sea compuesto, y n +2 sea primo o semi-primo.Desafortunadamente, esto incluye 1 (y 0), por lo que luego verificamos que n es al menos 2 con
xx
Un par de diferentes "31-byters" son:
fuente
Ruby ,
4941 bytesPruébalo en línea!
Gracias H.PWiz por -8 bytes
¿Cómo?
Lo primero es obtener una cadena de
'l'
n + 2 veces repetidas. Luego aplique una expresión regular para verificar si:(.?)(..)
((..+)\1)(..)
((..+)\2)\1+
Las 2 partes regex generan un cuarto caso que no tiene sentido y es seguro ignorar:
(.?)\2+
que resuelve una cadena vacía o un solo carácter porque\2
está vacío.fuente
|
juntos más cerca:^((..+)\2+)(\1+|..)$
. Además, es una coincidencia clara que hayas intentado este problema con regex en un momento similar para mí :).
lugar de,.?
ya que la entrada siempre es al menos 1Julia, 59 bytes
fuente
Pyt , 11 bytes
3 * isprime (x) robado de la respuesta de Jonathan Allan
fuente
Haskell , 163 bytes
Pruébalo en línea!
fuente