A questão
Um primo de Sophie Germain é um primo p tal que 2p + 1 também é primo. Por exemplo, 11 é primo da Sophie Germain porque 23 também é primo. Escreva o programa mais curto para calcular os números primos de Sophie Germain em ordem crescente
Regras
- Os números primos da Sophie Germain devem ser gerados pelo seu programa, não a partir de uma fonte externa.
- Seu programa deve calcular todos os números primos de Sophie Germain abaixo de 2³²-1
- Você deve imprimir cada prime Sophie Germain distinto encontrado pelo seu programa.
- A pessoa com a pontuação mais baixa ganha
Pontuação
- 2 pontos por byte do seu código
- -10 se você puder mostrar um prime gerado pelo seu programa maior que 2³²-1
code-challenge
primes
Meow Mix
fonte
fonte
Respostas:
CJam
Para 17 caracteres, obtemos uma enumeração completa de até 2 ^ 32:
Para 4 caracteres a mais, temos um intervalo grande o suficiente para incluir um SG prime maior que 2 ^ 32:
desde 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.
Obviamente, poderíamos igualmente estender o alcance gratuitamente,
fonte
I,
trataI
como um inteiro assinado de 32 bits, portanto o valor máximo paraI
é2 ** 31 - 1
.Pitão, 19 bytes * 2 - 10 = 28
Observe que o compilador / executor online não mostra a saída porque é um loop infinito.
Explicado:
fonte
PZ
não retorna um valor verdadeiro ou falso. Retorna a fatoração principal deZ
. O teste de prime é!tPZ
, que verifica se a fatoração de prime contém apenas um fator.!tP
erros0
e1
ser primordial, pois sua fatoração principal contém apenas 1 fator. Reparo fácil é substituir todosZ
porK
e atribuirK2
no início.K1
vez deK2
e troque o if e o incremento. Dessa forma, você pode remover o)
. E+1*K2
é a mesma coisa quehyK
.Pitão - 2 * 16 bytes - 10 = 22
Usa o método usual de verificação primária no Pyth com oe
!tP
aplica-o ao número e ao seu início seguro, com um pequeno truque para verificar os dois ao mesmo tempo. Sobe10^10
, então eu estou indo para o bônus.Explicação em breve.Experimente abaixo de 1000 online .
fonte
fonte
CJam, 34 (2 * 22 - 10)
Imprime todos os números primos de Sophie Germain abaixo
12 ** 9
, o que inclui4294967681 > 2 ** 32
.Eu estimo que isso levará aproximadamente 8 horas na minha máquina. Eu vou correr esta noite.
fonte
Haskell, 2 * 54-10 = 98
132i
é um cheque nobre.p
pega todos os númerosn
onde ambosn
e2*x+1
são primos.p
é uma lista infinita.Edit: melhor maneira de verificar se
2*n+1
é prime.fonte
Julia, 2 * 49 - 10 = 88
Imprime-os em formato de lista
[2,3,5,11,...]
,. Se esse formato, usando aprimes
função, ou aguardando até que todo o cálculo seja feito para impressão não seja aceitável, ele será impresso um por linha enquanto é executado.É um pouco mais, 52 caracteres. Ambos calculam todos os primos da Sophie Germain
2^33
, então devem receber o desconto de 10 pontos.fonte
Python 3,
124123 bytesComo funciona?
Experimente online aqui .
Meu computador diz que gerou 0,023283% de todos os números primos de Sophie Germain abaixo de 2 ^ 32.
Quando terminar, publicarei no pastebin se houver linhas suficientes. Você pode usá-lo para verificar se possui todos.
fonte
.5
é mais curto que0.5
Perl, 2 * 57-10 = 104
42 segundos para 2 ^ 32, 1m26s para 2 ^ 33. Será executado 50% mais rápido se
2*$_+1
for escrito como1+$_<<1
mas é mais um byte.O módulo também instala
primes.pl
vários filtros, incluindo um para primos Sophie-Germain. Então:primes.pl --so 2**33
(20 bytes)fonte
Ruby, 61 * 2 - 10 = 112
Levaria uma eternidade para imprimir todos os valores até 2 ** 32
Editar
Raspou alguns bytes substituindo Float :: INFINITY por 1.0 / 0
fonte
PARI / GP, 46 * 2-10 = 82
fonte