Um número é um primo Chen se satisfizer duas condições:
- É primo em si
- Em si, mais dois, é um primo ou um semi-primo.
Um primo é um número em que possui exatamente dois divisores e esses divisores consistem em si e um.
Um semi-primo é um número que é o produto de dois primos. (Observe que 12 = 2 * 2 * 3 não é semi-primo, mas 25 = 5 * 5 é).
Sua tarefa é determinar se um número é um primo Chen. Você deve gerar qualquer valor verdadeiro para yes e qualquer valor falso para no.
A entrada será qualquer número inteiro maior ou igual a um. Também pode ser tomado como uma sequência de caracteres, uma matriz de caracteres ou uma matriz ou dígitos.
Exemplos:
101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy
Este é o OEIS A109611 .
Isso é, em parte, inspirado em Sou uma prima da Sophie Germain? que, infelizmente, foi fechado como duplicado, então estou postando um desafio relacionado que não é duplicado.
True
por verdade e2
ouFalse
por falsidade (valores inconsistentes de falsidade)?2 * 2 * 2 * 3 * 3
um semi-prime? Que tal5 * 5
?5*5
é semi-prime,2*2*2*3*3
não é. Eu disse exatamente duas.2*2*2*3*3
tem exatamente dois fatores primos, a saber,2
e3
, e5*5
tem um fator primo, a saber5
.) Talvez você possa editar isso na pergunta?Respostas:
Braquilog , 7 bytes
Experimente online!
Explicação
fonte
05AB1E , 8 bytes
Experimente online!
Explicação
fonte
ArnoldC , 1339 bytes
Experimente online!
(Este é o meu primeiro post no codegolf.SE, informe-nos se este estiver formatado incorretamente. Percebo que essa contagem de bytes não é competitiva, é apenas diversão.)
fonte
Gelatina , 10 bytes
Experimente online!
fonte
Pitão, 10 bytes
Experimente online!
Quão?
fonte
Python com sympy ,
6956 bytes-13 bytes graças ao alephalpha (atualizando para o sympy 1.1 e usando
primeomega(n+2)
para substituirsum(factorint(n+2).values())
)... substituindo a submissão excluída do Gryphon.
Uma função sem nome retornando
True
para primos Chen eFalse
outros.Conta os fatores
n+2
somando as multiplicidades de seus fatores primos.Observe que
3
é multiplicado porisprime(n)
antes da<
comparação, portanto, para não-prime,n
o código testa sen+2
possui menos de0
fatores (sempre produzindoFalse
), enquanto para o primen
verifica sen+2
é primo ou semi-primo.fonte
3*isprime(n)
truque é o que eu estava procurando na limpeza da declaração condicional.Pari / GP , 29 bytes
O
3*isprime(n)
truque é roubado da resposta de Jonathan Allan .Experimente online!
fonte
Java 8,
858483 bytes-1 bytes graças a @ OlivierGrégoire usando uma abordagem iterativa em vez de recursiva.
Explicação:
Experimente aqui.
fonte
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
fonte
JavaScript (ES6),
6361 bytesDefine uma função
f
que aceitan
como argumento e retorna o resultado. Estou muito feliz com og
resultado; conta o número de fatores primos em um número.Economiza 2 bytes graças ao
&
truque de Kevin Cruijssen .Ungolfed
fonte
&&
para&
? Como 0/1 também são valores de verdade / falsey em JS?|
e&
não provoca um curto-circuito, que pode economizar ainda mais bytesg
.Japt ,
2220191312 bytesTeste-o
fonte
PHP, 64 bytes
imprime
0
por verdade, outros números inteiros por falsidade. Execute como pipe-nR
ou experimente online .demolir
valor falso consistente, 65 bytes:
imprime
1
por verdade e0
por falsidade.fonte
Python 3 com SymPy,
7371 bytesExperimente online!
Esta é uma versão mais detalhada de uma resposta postada aqui anteriormente, mas parece ter sido excluída.
Obrigado a @ JonathanAllan por salvar 2 bytes!
fonte
f=
, criar uma função sem nome é bom para o código-golfe.PHP , 87 bytes
Experimente online!
PHP , 87 bytes
Experimente online!
fonte
APL NARS, 23 caracteres
Aqui π⍵ retorna a matriz de fatores de ⍵ diferente de 1; algum teste:
fonte
Regex (ECMAScript), 31 bytes
Experimente online! (mostrando todos os primos de Chen ≤ 1000)
Dada uma sequência de n
x
s, esse regex corresponderá se e somente se n for um primo Chen.Ele afirma que n é maior que 2 e que a sequência não tem a forma
((xx+)(\2(xx))*)(\1\4)+
Este regex tem dois significados, dependendo de quantas vezes
(\2(xx))
é repetido.Quando é repetido 0 vezes, a regex pode ser simplificada para
(xx+)\1+
, o que corresponde aos números compostos.Quando é repetido um número positivo de vezes, o regex é equivalente a
((xx+)(\2xx)+)(\1xx)+
Esse regex requer alguma explicação, no entanto, fornecerei pouca percepção.
Se você percorrer a álgebra, encontrará que
((xx+)(\2xx)+)(\1xx)+
corresponde aos números da forma ema*b*c-2
quea≥4,b≥2,c≥2
.Portanto, ele corresponderá (quase) sempre que n +2 tiver mais de 2 fatores primos. (ou seja, nem prime nem semi-prime)
Observe que não corresponde a 6, 16 ou 25, mas isso não importa, porque todos são compostos.
Portanto
(?!((xx+)(\2(xx))*)(\1\4)+$)
, corresponderá desde que n não seja composto e n +2 seja primo ou semi-primo.Infelizmente, isso inclui 1 (e 0), então verificamos que n é pelo menos 2 com
xx
Alguns "31 byters" diferentes são:
fonte
Ruby ,
4941 bytesExperimente online!
Obrigado H.PWiz por -8 bytes
Quão?
Primeiro, obtenha uma sequência
'l'
repetida de n + 2 vezes. Em seguida, aplique uma regex para verificar se:(.?)(..)
((..+)\1)(..)
((..+)\2)\1+
As duas partes de regex geram um quarto caso que não faz sentido e é seguro ignorar
(.?)\2+
:, que resolve esvaziar uma string ou um único caractere porque\2
está vazio.fonte
|
conjunto mais de perto:^((..+)\2+)(\1+|..)$
. Além disso, uma pura coincidência de que você tentou esse problema com o regex em um momento semelhante ao meu :).
vez de,.?
uma vez que a entrada é sempre pelo menos 1Julia, 59 bytes
fonte
Pyt , 11 bytes
3 * isprime (x) roubado da resposta de Jonathan Allan
fonte
Haskell , 163 bytes
Experimente online!
fonte