Écrivez un programme qui invite l'utilisateur à saisir un entier pair supérieur à 2.
Étant donné la conjecture de Goldbach selon laquelle chaque entier pair supérieur à 2 peut être exprimé comme la somme de deux nombres premiers, imprimez deux nombres premiers qui, lorsqu'ils sont additionnés, fournissent le nombre pair demandé. Edit: le programme n'a qu'à imprimer UNE PAIRE de nombres premiers, pas tous. Par exemple:
4: 2 + 2
6: 3 + 3
8: 3 + 5
10: 5 + 5 ou 3 + 7
Réponses:
APL, 34 ou 44 octets
La première version comporte 34 symboles et est limitée aux caractères des jeux de caractères APL d'origine à un octet, tels que celui toujours pris en charge dans Dyalog APL:
Explication:
La deuxième version ne fait que 22 symboles, car elle exploite la
π
fonction pour vérifier les nombres premiers, mais elle n'est disponible que dans NARS2000 qui utilise Unicode, donc le nombre d'octets est de 44 dans UCS-2:Explication:
Exemples
(⎕: est l'invite demandant un numéro)
la source
¯2π⍳2πn
comme un générateur principal?π
exactement l' opérateur?π
Commutateurs dyadiques avec⍺
:¯2πx
calcule le xième nombre premier,¯1πx
est le premier nombre premier inférieur à x,0πx
teste x pour la primauté,1πx
est le premier nombre premier supérieur à x,2πx
est le nombre de nombres premiers inférieur à x,10πx
est le nombre de diviseurs de x,11πx
est la somme de tous les diviseurs de x,12πx
et13πx
sont respectivement la fonction de Möbius et la fonction de totient. Enfin, le monadiqueπx
renvoie la factorisation première de x.Python 2,
7571 octetsTestez-le sur Ideone .
Comment ça fonctionne
Nous utilisons un corollaire du théorème de Wilson :
À tout moment, la variable m est égale au carré de la factorielle de k - 1 ; k commence à la valeur 1 et m à la valeur 0! ² = 1 . L'ensemble p sera composé de 0 et de tous les nombres premiers jusqu'à la valeur actuelle de k .
Dans chaque itération, nous vérifions d'abord si n - k et k appartiennent à p , ce qui est vrai si et seulement si la différence définie de {nk, k} et p est vide. Si c'est le cas, la condition est fausse et la boucle continue.
Notez que k> 0 et {n - k, k} satisferont la condition pour une valeur positive de n - k (en supposant que la conjecture de Goldbach est vraie), donc le 0 dans p ne conduira pas à des faux positifs.
Dans la boucle, nous mettons à jour k et m . La nouvelle valeur de m est m × k² = (k - 1)! ² × k² = k! ² , et la nouvelle valeur de k est k + 1 , donc m = (k - 1)! ² est toujours valable avant et après la mise à jour.
Ensuite, nous effectuons l'union d'ensemble pour ajouter la valeur de m% k × k à p . Par le corollaire du théorème de Wilson, cela ajoutera 1 × k = k si k est premier et 0 × k = 0 sinon.
Lorsque la boucle se termine, nous affichons les dernières valeurs de n - k et k , qui seront des nombres premiers avec la somme n .
la source
Rubis 2.0 (65)
la source
PHP - 73 octets
L'entrée est considérée comme un argument de ligne de commande.
Exemple d'utilisation:
la source
GolfScript
413332Accepte l'argument de ligne de commande, par exemple
Trouve toutes les partitions pertinentes du numéro d'entrée avec:
puis trouve la première partition où aucun nombre n'est pas premier avec:
où le bloc de vérification composite
np
est:ce bloc filtre tous les nombres qui divisent également un nombre donné. S'il n'y a pas de tels nombres (donc le nombre est premier), le résultat est
[]
, ce qui est falsey dans GolfScript.la source
perl 6: 69
la source
R,
17011283 caractèresDentelé:
Usage:
Ancienne solution à 112 caractères, pour la postérité
Dentelé:
la source
Python - 107
Fondamentalement, une amélioration par rapport à la deuxième partie de la réponse de Nutria (j'ai exécuté ceci sur 2.7 mais je pense que cela devrait également fonctionner pour 3.x)
la source
:
obligatoires?JavaScript (ES6) (Regex), 105
Vous avez maintenant une expression régulière qui teste la conjecture de Goldbach, qui a peu d'exigences sur les fonctionnalités spéciales (support de référence arrière de base, anticipation positive et négative).
Cela utilise
String.prototype.repeat()
, qui fait partie de la proposition EcmaScript 6e édition. Actuellement, ce code ne fonctionne que sur Firefox.J'ai vraiment besoin d'un meilleur langage avec une commande concise lorsque je travaille avec regex ...
la source
Scala,
286192172148 caractèresPas le plus rapide mais ça marche. Appelez g (10) pour obtenir la liste des paires de goldbach pour 10.
La conversion en C ++ est simple.
la source
C -
139129 caractèresla source
int
déclarations de votre fonctioni
. Vous pouvez enregistrer 2 autres caractères en supprimantif
et en ajoutant une autre double esperluette:i(b,2)&&i(a-b,2)&&printf(...)
&&
. (Je ne m'habituerai jamais au silence de type argument ...)newLISP -
169148 caractèresinclut le code pour l'exécuter. Les résultats sont trop généreux ...
la source
Sauge, 60
Similaire en termes de score et de sensation à la solution de res , mais je pense que c'est assez différent pour poster.
la source
Sauge ,
6562Avec ce qui précède dans le fichier
goldbach.sage
, exécutez-le avec Sage en cours d'exécution dans un terminal:Merci à @boothby pour l'
p=is_prime
idée.la source
p=is_prime
.Haskell, 97C
Explication:
g
est la fonction "goldbach". L'appelg n
vous donne la paire de nombres premiers qui s'additionnentn
.p
est une fonction qui génère une liste de nombres premiers inférieurs àn
.c
est la fonction principale de vérification utilisée pour définirp
.L'exemple s'exécute:
la source
Mathematica 56
Cela renvoie toutes les solutions pour l'entier d'entrée.
Par exemple, lorsque 1298 est entré…
Comme écrit, il renvoie chaque solution deux fois.
la source
Julia, 62 caractères (85 avec invite)
la source
g(int(readline(STDIN)))
GTB , 31
Pour votre calculatrice TI-84
Pas de modules intégrés principaux.
Exemple d'exécutions
la source
JavaScript,
139137136la source
return;
lieu dereturn 0;
Python 3 -
150143 caractèresAncienne version (150 caractères):
Nouvelle version (merci à ProgramFOX):
Il imprime chaque combinaison, par exemple:
4 2 + 2
10 7 + 3 5 + 5 3 + 7
la source
|
peut être utilisé en toute sécurité avec le type booléen, donc(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 une liste de tuples, dont la somme est n). Enregistre 8 octets.r=range(2,n)
et le référencementr
permettent également d'en économiser quelques-uns.q [116 caractères]
Aucune fonction intégrée pour trouver le nombre premier.
Contribution
Production
la source
Python - 206
Un peu tard pour la fête mais je pratique mes talents de golfeur.
En fait, j'ai codé cela avant de trouver cette question! La mienne n'inclut donc pas la belle lambda que les autres solutions Python utilisent.
la source
J -
3532 car"Demander à l'utilisateur" est le fléau de tout golfeur J. Voilà tous mes personnages durement gagnés!
Expliqué:
".1!:1]1
- Lisez une chaîne (1!:1
) depuis l'entrée (descripteur de fichier1
) et convertissez-la en un nombre (".
).p:i.n=:
- Attribuez ce nombre à la variablen
, puis prenez les premiersn
nombres premiers.+/~
- Faire une table d'addition,n
large etn
haute.i.&n,
- Transformez le tableau en une seule liste, puis recherchez l'index de la première occurrence den
, qui existe si la conjecture de Goldbach est vraie.p:(n,n)#:
- Récupérez la ligne et la colonne de l'index, et prenez les nombres premiers correspondants.Usage:
Si l'invite n'était pas une exigence, voici un verbe de 25 caractères:
la source
Gelée , 8 octets (non concurrent)
Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça fonctionne
la source
Julia,
5049 octetsEssayez-le en ligne!
Si une fonction était acceptable, le code pourrait être raccourci à 32 octets :
Comment ça fonctionne
~=primes
crée un alias pour la fonction prime intégrée qui renvoie une liste de tous les nombres premiers jusqu'à son argument.n=ARGS[]|>int
analyse le premier argument de ligne de commande tel qu'il l'enregistre dans n .Pour trouver une paire appropriée de nombres premiers, nous calculons d'abord la plage de nombres premiers susmentionnée avec
~n
. Ensuite,n-~n
donne toutes les différences de ces nombres premiers et n .En coupant (
∩
) le résultat avec la plage de nombres premiers elle-même, nous nous assurons que les nombres premiers p restants sont tels que n - p est aussi un nombre premier.Enfin,
extrema
prend le premier le plus bas et le plus haut de l'intersection, leur somme doit donc être n .la source
SQL,
295284En postgresql:
Devrait être capable de le faire dans la moitié de l'espace, si ce n'était pour des choses comme "pas de jointure externe gauche en récursivité", "pas de sous-requête en récursivité" ...
Voici la sortie:
la source
Lot - 266
Partez proprement -
la source
Perl 5, 58 octets
57, plus 1 pour
-nE
L'entrée et la sortie sont unaires. Exemple:
Pointe de chapeau.
la source
Oracle SQL 11.2, 202 octets
Non golfé
la source
Python 3, 107 octets
b (x) est un test de primalité pour x, et g (x) passe en revue les nombres pour trouver deux nombres premiers qui correspondent.
la source