Escreva um programa que solicite ao usuário um número inteiro maior que 2.
Dada a conjectura de Goldbach de que todo número inteiro maior que 2 pode ser expresso como a soma de dois números primos, imprima dois números primos que, quando somados, fornecem o número par solicitado. Editar: o programa só precisa imprimir UM PAR de números primos, não todos. Por exemplo:
4: 2 + 2
6: 3 + 3
8: 3 + 5
10: 5 + 5 ou 3 + 7
Respostas:
APL, 34 ou 44 bytes
A primeira versão possui 34 símbolos e é restrita a caracteres dos conjuntos de caracteres APL originais de byte único, como o ainda suportado no Dyalog APL:
Explicação:
A segunda versão possui apenas 22 símbolos, porque explora a
π
função para verificar números primos, mas está disponível apenas no NARS2000 que usa Unicode, portanto, a contagem de bytes é 44 no UCS-2:Explicação:
Exemplos
(⎕: é o prompt solicitando um número)
fonte
¯2π⍳2πn
como um gerador principal?π
operador faz exatamente?π
alterna com⍺
:¯2πx
calcula o xº primo,¯1πx
é o primeiro primo menor que x,0πx
testa x para primalidade,1πx
é o primeiro primo maior que x,2πx
é o número de primos menor que x,10πx
é o número de divisores de x,11πx
é a soma de todos os divisores de x,12πx
e13πx
são a função de Möbius e totiente, respectivamente. Por último, mas não menos importante, o monádicoπx
retorna a fatoração primária de x.Python 2,
7571 bytesTeste em Ideone .
Como funciona
Usamos um corolário do teorema de Wilson :
Em todo momento, a variável m é igual ao quadrado do fatorial de k - 1 ; k começa no valor 1 e m no valor 0! ² = 1 . O conjunto p será composto por 0 e todos os números primos até o valor atual de k .
Em cada iteração, primeiro verifique se ambos nk e k pertencem p , o que é verdade se e somente se a diferença conjunto de {nk, k} e p está vazio. Se for, a condição é falsa e o loop continua.
Observe que k> 0 e {n - k, k} satisfarão a condição para algum valor positivo de n - k (assumindo que a conjectura de Goldbach seja verdadeira), portanto, o 0 em p não levará a falsos positivos.
No loop, atualizamos k e m . O novo valor de m é m × k² = (k - 1)! ² × k² = k! ² , e o novo valor de k é k + 1 , então m = (k - 1)! ² ainda é válido antes e depois a atualização.
Em seguida, executamos a união de conjuntos para adicionar o valor de m% k × k a p . Pelo corolário do teorema de Wilson, isso adicionará 1 × k = k se k for primo e 0 × k = 0 se não.
Quando o loop termina, imprimimos os últimos valores de n - k e k , que serão primos com a soma n .
fonte
Ruby 2.0 (65)
fonte
PHP - 73 bytes
A entrada é tomada como um argumento de linha de comando.
Uso da amostra:
fonte
GolfScript
41.3332.Aceita argumento de linha de comando, por exemplo
Localiza todas as partições relevantes do número de entrada com:
e encontra a primeira partição onde nenhum número NÃO é primo com:
onde o bloco de verificação composta
np
é:esse bloco é filtrado para todos os números que dividem igualmente um determinado número. Se não houver tais números (portanto, o número é primo), o resultado é o
[]
que é falso no GolfScript.fonte
perl 6: 69
fonte
R,
17011283 caracteresRecuado:
Uso:
Solução antiga de 112 caracteres, para posteridade
Recuado:
fonte
Python - 107
Basicamente, uma melhoria na segunda parte da resposta da nutria (executei isso em 2.7, mas acho que também deve funcionar para 3.x)
fonte
:
obrigatórios?JavaScript (ES6) (Regex), 105
Agora você tem um regex que testa a conjectura de Goldbach, que tem baixo requisito em recursos especiais (suporte básico de referência posterior, previsão positiva e negativa).
Isso usa
String.prototype.repeat()
parte da proposta da 6ª edição do EcmaScript. Atualmente, esse código funciona apenas no Firefox.Eu realmente preciso de uma linguagem melhor que tenha comando conciso ao trabalhar com regex ...
fonte
Scala,
286192172148 caracteresNão é o mais rápido, mas funciona. Chame g (10) para obter a lista de pares goldbach para 10.
A conversão para C ++ é simples.
fonte
C -
139129 caracteresfonte
int
declarações em sua funçãoi
. Você pode salvar outros 2 caracteres removendoif
e adicionando outro e comercial duplo:i(b,2)&&i(a-b,2)&&printf(...)
&&
. (Eu nunca vou me acostumar com o tipo de argumento silenciamento ...)novoLISP -
169148 caracteresinclui o código para executá-lo. Os resultados são excessivamente generosos ...
fonte
Sálvia, 60
Semelhante na pontuação e na solução da res , mas acho que é diferente o suficiente para postar.
fonte
Sábio ,
6562Com o arquivo acima
goldbach.sage
, execute-o com o Sage executando em um terminal:Obrigado a @boothby pela
p=is_prime
ideia.fonte
p=is_prime
.Haskell, 97C
Explicação:
g
é a função "goldbach". A chamadag n
fornece o par de números primos que somamn
.p
é uma função que gera uma lista de números primos menor quen
.c
é a função do verificador principal usada para definirp
.Exemplo é executado:
fonte
Mathematica 56
Isso retorna todas as soluções para o número inteiro de entrada.
Por exemplo, quando 1298 é inserido…
Como está escrito, ele retorna cada solução duas vezes.
fonte
Julia, 62 caracteres (85 com prompt)
fonte
g(int(readline(STDIN)))
GTB , 31
Para a sua calculadora TI-84
Sem embutidos principais.
Execuções de exemplo
fonte
JavaScript,
139137136fonte
return;
invés dereturn 0;
Python 3 -
150143 caracteresVersão antiga (150 caracteres):
Nova versão (graças ao ProgramFOX):
Imprime todas as combinações, por exemplo:
4 2 + 2
10 7 + 3 5 + 5 3 + 7
fonte
|
pode ser usado com segurança com o tipo booleano, então(a+b!=n)|p(a)|p(b)
print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])
(imprime uma lista de tuplas, cuja soma é n). Salva 8 bytes.r=range(2,n)
e referenciarr
economiza um pouco mais.q [116 caracteres]
Nenhuma função embutida para encontrar o número primo.
Entrada
Resultado
fonte
Python - 206
Um pouco tarde para a festa, mas estou praticando minhas habilidades no golfe.
Na verdade, eu codifiquei isso antes de encontrar essa pergunta! Portanto, o meu não inclui a linda lambda usada pelas outras soluções Python.
fonte
J -
3532 car"Avisar o usuário" é a desgraça de todo jogador de golfe. Lá vão todos os meus personagens suados!
Explicado:
".1!:1]1
- Leia uma string (1!:1
) da entrada (identificador de arquivo1
) e converta-a em um número (".
).p:i.n=:
- Atribua esse número à variáveln
e, em seguida, pegue os primeirosn
números primos.+/~
- Faça uma mesa de adição,n
larga en
alta.i.&n,
- Transforme a tabela em uma única lista e encontre o índice da primeira ocorrência den
, que existe se a conjectura de Goldbach for verdadeira.p:(n,n)#:
- Recupere a linha e a coluna do índice e pegue os números primos correspondentes.Uso:
Se o prompt não fosse um requisito, aqui está um verbo de 25 caracteres:
fonte
Geleia , 8 bytes (não concorrente)
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Julia,
5049 bytesExperimente online!
Se uma função fosse aceitável, o código poderia ser reduzido para 32 bytes :
Como funciona
~=primes
cria um alias para a função de números primos internos , que retorna uma lista de todos os números primos até o argumento.n=ARGS[]|>int
analisa o primeiro argumento da linha de comandos como o salva em n .Para encontrar um par adequado de números primos, primeiro calculamos o intervalo principal mencionado acima
~n
. Então,n-~n
produz todas as diferenças desses números primos e n .Ao cruzar (
∩
) o resultado com o próprio intervalo primo, garantimos que os primos restantes p sejam tais que n - p também seja um primo.Finalmente,
extrema
obtém o primo mais baixo e o mais alto na interseção, portanto, sua soma deve ser n .fonte
SQL,
295284No postgresql:
No entanto, deve ser capaz de fazê-lo na metade do espaço, se não fosse por coisas como "nenhuma junção externa esquerda na recursão", "nenhuma subconsulta na recursão" ...
Aqui está a saída:
fonte
Lote - 266
Decididamente -
fonte
Perl 5, 58 bytes
57, mais 1 para
-nE
Entrada e saída são unárias. Exemplo:
Gorro.
fonte
Oracle SQL 11.2, 202 bytes
Sem golfe
fonte
Python 3, 107 bytes
b (x) é um teste de primalidade para x, eg (x) se repete através de números para encontrar dois números primos adequados.
fonte