Sou 2/3 gêmeos com meu irmão, ou seja, nasci no mesmo dia do mesmo mês, mas doze anos depois. Quando eu tinha 5 anos, ele tinha 17 anos, ambos primos; o último par de idades com o qual podemos razoavelmente contar é [71, 83], estando ambos vivos e capazes de celebrar esse jubileu coincidente.
Tarefa
Crie um código que
recebe dois números inteiros como entrada: a diferença entre o contador e o "gêmeo" como um número inteiro positivo k (bem, sim, eu sou o mais novo) e o limite superior como um número inteiro positivo u (consideração em tempo de execução)
e fornece a saída como uma matriz ou lista de todos os números i inferiores ou iguais a u para os quais i e i + k são primos. A saída não precisa ser classificada.
Casos de teste
12, 1000 -> [5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
2, 999 -> [3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
3, 1500 -> [2]
30, 1500 -> [7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]
Editar
Como não especifiquei o limite superior, as soluções inclusivas e exclusivas são bem-vindas.
Editar No. 2
O desafio termina em 1º de setembro, uma semana desde o início.
Parece que temos um vencedor, mas em caso de empate a popularidade é o desempate; neste caso, o "segundo" será compensado via recompensa.
Respostas:
Geléia,
87 bytesExperimente online!
Explicação
fonte
Braquilog ,
2723 bytesExperimente online!
Verifique todos os casos de teste.
Predicado 0 (predicado principal)
Predicado 1 (predicado auxiliar)
fonte
05AB1E , 9 bytes
Código:
Usa a codificação CP-1252 . Experimente online! .
fonte
Pyke, 10 bytes
Experimente aqui!
Também 10 bytes:
Experimente aqui!
fonte
Oitava,
3433 bytesfonte
MATL , 8 bytes
Agradecemos a @alephalpha por sua abordagem , que me ajudou a economizar 3 bytes
Experimente online!
fonte
Python 3,
1149290 bytesObrigado a @Dennis por -2 bytes
Uma função que recebe entrada via argumento e retorna um conjunto não classificado. Isso é exclusivo em relação ao limite superior.
Isso usa o método da resposta do @ xnor aqui para encontrar números primos.
Experimente no Ideone
Como funciona
Principal descoberta
Inicialmente, inicializamos um valor de teste
i
e um produtoP
como1
e uma lista de números primosl
como o conjunto que contém0
. Em seguida, é executado umwhile
loop que testa todos os valores doi
intervalo[1, u+k-1]
para primalidade. A ideia é que, multiplicandoP
pori^2
no final de cada iteração,P
assume o valor(i-1)!^2
durante o testei
, ou seja, o produto dos inteiros[1, i+1]
ao quadrado. O teste de primalidade real é então realizado através do cálculoP mod i
; se isso retornar zero,i
não poderá ser primo, pois isso implica quei
é divisível por pelo menos um dos valores que compõem o produto. Se isso retornar1
, entãoi
deve ser primo, pois não é divisível por nenhum dos valores do produto. Sei
for primo, será anexado el
, se não,0
será anexado. A quadratura do produto impede a identificação falsa de4
primo e é útil aqui, pois garante que apenas0
ou1
será retornado, permitindo que a escolha do valor a ser acrescentado seja feita simplesmente multiplicando o resultado pori
.Identificação de primos 'gêmeos'
Agora criamos um conjunto furter, contendo todos os elementos de elemento a elemento
l-k
. A interseção deste conjunto el
é então encontrada usando&
, o que deixa um conjunto contendo apenas os elementos comuns a ambos os conjuntos. Um númeroi
é apenas em ambos os conjuntos se ambosi
ei+k
são primos, o que significa que isso deixa a saída desejada. No entanto, sek
for primo,0
estará presente nos dois conjuntos, o que significa que isso deve ser removido antes do retorno.fonte
k,u=input();i=P=1;l={0};exec'l|={P%i*i};P*=i*i;i+=1;'*(u+k);print{i-k for i in l}&l
funciona para 83 bytes em Python 2. Mesmo em 3, construir um conjunto dessa maneira deve economizar alguns bytes.0
do conjunto final, pois sek
for primo, isso por engano é retornado .R, 98 bytes
Ungolfed:
fonte
CJam, 17 bytes
Como um programa completo:
Experimente online!
Ou como um bloco sem nome:
Experimente online!
fonte
Java 7,
185175 bytesUngolfed & código de teste:
Experimente aqui.
Resultado:
fonte
PARI / GP, 39 bytes
fonte
Mathematica, 43 bytes
Gere todos os números primos menores ou iguais ao limite superior. Adicione a diferença de idades ao resultado. Selecione números primos entre eles. Subtraia a diferença de idades para o resultado.
fonte
Rápido, 142 bytes
fonte
Perl 6 ,
3937 bytesExplicação:
fonte
SILOS , 205 bytes
Experimente online!
Teste de primazia pelo teorema de Wilson .
fonte
Na verdade , 12 bytes
A entrada é
u
entãok
. Sugestões de golfe são bem-vindas. Experimente online!Ungolfing:
fonte
R, 104 bytes
Ao contrário da outra solução R publicada, esta recebe a entrada de stdin.
Ungolfed:
fonte
Javascript (ES6),
90838075 bytesExemplo:
fonte
Pitão, 13 bytes
Um programa que recebe entrada de uma lista do formulário
[k, u]
e imprime uma lista.Experimente online
Como funciona
fonte