Dois números primos são definidos como primos gêmeos se diferirem em dois. Por exemplo, 3 e 5 são primos gêmeos, como são 29 e 31.
Escreva um programa que encontre o enésimo par de números primos gêmeos (de onde n vem de STDIN) e os imprima em STDOUT, separados por vírgula e espaço. Isso é código-golfe, então o código mais curto vence.
Entrada de amostra:
3
Saída de amostra:
11, 13
Respostas:
Haskell 118
Força bruta em todos os primos gêmeos e imprime o enésimo par.
fonte
interact
vez deputStrLn
você, você pode ir ainda mais longe ea#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
CJam,
2926 bytesExperimente online.
Exemplos
Como funciona
fonte
Perl,
1018787 caracteres, construindo sobre o comentário do aschepler
101 caracteres, resposta anterior
Uso:
Explicação
O funcionamento do regex de não primalidade é explicado nesta questão do SO .
fonte
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
C: 113
Exemplo de execução:
Obrigado pela ajuda de Dennis, bebe e Alchymist.
fonte
scanf
vez de argumentos de linha de comando. Além disso,o=0
é desnecessário, poiso
é global.main
poderia conter uma variável int padrão, incrementarc
ei
entre atribuições e instruções poderia encurtar o código, a atribuição del
poderia ser levada de volta ao primeiro bloco terceiro do loop, para que você não precisasse chaves e usando apenas um caractere do separador em printf poderia definitivamente torná-lo mais compacto.c<=i-1
, o que é simplesmente bobo.i
al
expressão de atribuição, pois o (novo) valor dei
é usado para diminuirn
. Alguma dica?CJam - 26
Funciona para números primos menores que 10000; você pode substituir
4
por um expoente mais alto para números maiores (potencialmente até 10 20 ), mas o programa fica mais lento e usa mais memória.Experimente em http://cjam.aditsu.net/
Explicação:
1e4,
cria a matriz [0 1 2 ... 9999]{mp},
selecciona apenas os números primos_2f-
cópias da matriz e subtrai 2 a partir de cada item&
intersecta as duas matrizes, assim, encontrar os primos mais baixos a partir de cada par privilegiada duploqi
lê a entrada e convertidos para inteiro(=
ajusta o indexe e obtenha o primo gêmeo correspondente (inferior) da matriz_2+
copia o primo e adiciona 2", "\
coloca a vírgula e o espaço entre os dois primosfonte
Mathematica - 63 caracteres
Notas
Esta é de fato uma implementação bastante direta. Encurtamento resultou em quase nenhuma ofuscação.
NextPrime
é um builtin que encontra o próximo primo depois de um número.NestWhile[NextPrime,#,#2-#1!=2&,2]&
é uma função anônima que encontra o número primo maior do próximo par gêmeo primário após um número.Nest
aplica esta função anôniman
vezes.Print[#-2,", ",#]&
é uma função anônima que imprime no stdout de acordo com as especificações. Infelizmente, isso sozinho ocupa 18 caracteres da solução de 63 caracteres.Exemplo
Atualização: Dois caracteres podem ser salvos reimplementando esta solução CJam . No entanto, esse algoritmo limita o valor máximo de
n
. Apenas substitua aNest...
peça porIntersection[#,#-2][[5]]&@Prime@Range[999]
fonte
Javascript (E6) 92
96Mais curto e compatível - use o shell spidermonkey para ler stdin / write stdout (com vírgula e espaço). Ele encontra o par 10000 1260989, 1260991, em menos de um minuto no meu PC
poderia ser mais curto usando
p[n]=o=n
em vez dep.push(o=n)
, de modo que a matriz p é escassa. Mas isso é bem mais lento e não vou ganhar pelo tamanho do código.Para tentar no console do firefox:
Ungolfed
Uma função que encontrou todos os primeiros m gêmeos (retorna o maior valor):
Exemplo:
console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
Apenas o último:
Em seguida, pegue essas 2 linhas e adicione IO
fonte
J -
49 60 5551 bytesEu decidi seguir uma abordagem simples. A função
t
localiza o próximo primo gêmeo dado um número primo como entrada (agora isso está incluído naf
função). A funçãof
encontra o enésimo nono gêmeo primo. Este também é o primeiro programa que escrevi em J.Exemplos:
Apenas para alguns levantamentos de sobrancelha, tenha a versão não destruída.
Explicação:
fonte
C #, 265
fonte
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
vez deProgram
e o parâmetro ema
vez deargs
.)
após o.Count(...)<3
. Você também pode economizar um pouco mudandovar i=int.Parse(args[0]);int f=0,c=0;
paraint i=int.Parse(args[0]),f=0,c=0;
. Você pode economizar ainda mais extraindo o inicializador do loop, entãoc=0;for(int j=1;
=>c=0,j=1;for(;
.for
loop, além de usar um nome totalmente qualificado em vez deusing System
:using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}
238 caracteres.Ruby 94
Teste on-line: http://ideone.com/B2wxnG
fonte
Perl,
10095Ungolfed:
fonte
T-SQL (2008+): 344
Força bruta um CTE para encontrar números primos, função da janela para contar n, seguida por uma junção para encontrar o gêmeo. Funciona em um segundo para saídas <1.000, pouco menos de um minuto para saídas <10.000.
Golfe (SQLFiddle aqui ):
Legível:
fonte
GolfScript 46
Teste online: link
Código anotado:
fonte
PHP 5.4, 223
Não é um menor, mas uma tentativa de php.
fonte
C 309
Mantém os próximos números primos e armazena termos pares e ímpares e verifica se a diferença é dois.
fonte
for (int i=2;i*i<=k;i++)
R, 91 caracteres
Nada realmente chique:
Uso:
fonte
Japonês,
2319 bytes-4 bytes graças a Shaggy
Execute-o online
fonte
JavaScript (Node.js), 162 caracteres
Lê de stdin, produz para stdout, sai "cedo" para entrada
<= 0
.Uso (script acima salvo como
ntp.js
):fonte
AWK - 129
O arquivo
fsoe-pairs.awk
:Executando:
(1ª linha após a entrada do comando e a 2ª saída)
Isso se baseia em um algoritmo próprio de gerador primário que chamo de "peneira flutuante de erastostenos" (até que eu o encontre descrito em outro lugar), que armazena apenas a parte necessária da peneira e os primos já calculados.
fonte
Python 2 (75)
Então, o que está acontecendo aqui?
Primeiro, vamos olhar para a expressão
all(n%i&~2for i in range(2,n-2))
, que verifica se(n-2,n)
há um par de primos gêmeos.A expressão mais simples
all(n%i for i in range(2,n))
simplesmente verifica sen
é primo tentando todos os divisoresi
no intervalo2<=i<=n-1
e verificando se todos os demais são diferentes de zero. Issoall
verifica exatamente isso, já que o Python trata0
comoFalse
e todos os outros números comoTrue
.Agora, observe
(n-2)%i==0
exatamente quandon%i==2
para os divisoresi>2
. Assim, podemos executar a verificação de primalidaden
en-2
, ao mesmo tempo, verificando os restantes para ambos0
e2
. Isso pode ser feito comoall(n%i not in [0,2] for i in range(2,n-2))
. Apenas tentamos divisores no intervalo2<=i<=n-3
por causa disson-2
, mas isso é suficienten
desde entãon-1
en-2
não pode ser divisores, a menos quen<=4
. Apenas tentaremosn
começar de forma impar5
para evitar essa complicação e a do divisori=2
.Nós golf a expressão
n%i not in [0,2]
emn%i&~2
, lembrando que0
é falso e outros números sãoTrue
. A precedência do operador(n%i)&(~2)
é exatamente o que é necessário. O complemento de bit~2
é...11111101
, portanto, seu bit a bitand
com um número zera o2
valor da posição binária do binário. Isso dá0
(ieFalse
) apenas para0
e2
exatamente o que queremos.Ufa! Agora temos que a expressão
all(n%i&~2for i in range(2,n-2))
verifica sen
é o número superior de um par primo gêmeo. O que resta é iterar sobre eles até vê-c
los, ondec
está o número inserido. Começamos com a5
contagem2
para evitar problemas com o divisor. Diminuímosc
cada vez que encontramos umn
que funciona, parando quandoc=0
. Finalmente, imprimimos o par primo gêmeo com o qual terminamos.fonte
T-SQL (2012 +), 255 caracteres
Um localizador gêmeo T-SQL mais compacto que também recebe um pouco de velocidade.
Formato legível humano ::
A essência básica é que usamos a tabela de números incorporada (master..spt_values type = 'p') e alias que com um CTE como algo curto. Adicionamos 2 para remover a preocupação de gerar 0 ou 1 erros triviais para o nosso conjunto, então agora temos candidatos de 2,2050.
Z a consulta mais interna obtém todos os números primos de 2 a 2050, filtrando qualquer número n que seja divisível por um número menor que n. Em seguida, usamos uma função de janela bacana do T-SQL 2012
lag
que nos permite obter o resultado anterior; agora, os resultados de Z aeb são os primosP[n]
eP[n-1]
respectivamente. A consulta R cria a string de saída, filtra os primos não gêmeos e também cria um número de sequência para a saída que chamamos de K. Finalmente, a última consulta R nos permite filtrar e obter o Késimo primo duplo, alterando sua variável.fonte
Mathematica - 71 bytes
fonte