On m'a posé cette question dans une interview mais je n'ai pas pu trouver de solution. Je ne sais pas si la question était vraie ou non. J'ai beaucoup essayé mais je n'ai trouvé aucune solution. Honnêtement, rien ne m'est venu à l'esprit.
Numéros de Rocco
Un entier positif est un nombre de Rocco s'il peut être représenté par ou , où est un nombre premier.
Les 10 premiers numéros Rocco sont:
Tâche
Votre code doit accepter un entier positif en entrée et déterminer s'il s'agit d'un nombre Rocco ou non.
Points de brownie
- Écrivez une fonction qui calcule et imprime le nombre de nombres Rocco inférieur ou égal à 1 million.
- Écrivez une fonction qui calcule et imprime le nombre de nombres Rocco de la question bonus (ci-dessus) qui sont premiers.
code-golf
decision-problem
number-theory
vijayscode
la source
la source
print 0
. Tous les nombres de Rocco sont composites(n*..)
, donc pas de nombres premiers dans aucune plage.Réponses:
05AB1E , 8 octets
Renvoie si est un nombre Rocco, ou sinon.1 n 0
Essayez-le en ligne!
Comment?
Étant donné un entier positif , nous testons s'il existe un facteur premier de tel que:n p n
Commenté
la source
JavaScript (ES7), 55 octets
Essayez-le en ligne!
Comment?
Étant donné un entier positif , nous recherchons un nombre premier tel que ou .n X x ( x + 14 ) = n x ( x - 14 ) = n
D'où les équations quadratiques suivantes:
La racine positive de est:(1)
et la racine positive de est:(2)
Par conséquent, le problème équivaut à tester si ou est premier.x0 x1
Pour ce faire, nous utilisons la fonction de test de primalité récursive classique, avec un test supplémentaire pour nous assurer qu'il ne boucle pas indéfiniment s'il reçoit un numéro irrationnel en entrée.
Fonction d'enveloppe principale:
la source
Perl 6 ,
4528 octetsEssayez-le en ligne!
Utilise la construction d'Arnauld , que doit être premier pour que soit un nombre de Rocco.n+49−−−−−√±7 n
Explication:
la source
Regex (ECMAScript),
6462 octetsCette expression régulière trouve deux nombres et tels que . S'il les trouve, il affirme alors que ou est premier. C'est ça!a a+14 n=a(a+14) a a+14
Cela utilise une variante de l'algorithme de multiplication brièvement décrit dans un paragraphe de mon post regex de nombres abondants . Ceci est un spoiler . Alors ne lisez pas plus loin si vous ne voulez pas que la magie des regex unaires avancées soit gâtée pour vous . Si vous voulez essayer de découvrir cette magie vous-même, je vous recommande vivement de commencer par résoudre certains problèmes dans la liste des problèmes recommandés marqués consécutivement par spoiler dans ce post précédent , et d'essayer de trouver les idées mathématiques de manière indépendante.
L'algorithme de multiplication est implémenté différemment ici parce que nous affirmons que deux valeurs connues multipliées ensemble égalent une autre valeur connue (comme cela est également fait dans la version alternative de l'expression régulière dans ce post , pour tester si un nombre est un carré parfait). Dans la plupart de mes autres réponses regex publiées jusqu'à présent, la multiplication est implémentée comme un calcul (pas une assertion, conceptuellement parlant) où le but est de trouver le produit de deux nombres connus. Les deux méthodes fonctionnent dans les deux circonstances, mais au niveau du golf, elles sont plus mauvaises à faire le travail l'une de l'autre.
Essayez-le en ligne!
la source
Brachylog ,
1312 octetsEntrez le numéro du candidat comme argument de ligne de commande. Sorties
true
oufalse
. Essayez-le en ligne!Explication
Le code est un prédicat dont l'entrée n'est pas contrainte et dont la sortie est le nombre que nous testons.
(Les pourboires sont les bienvenus. Cela
{+|-}
semble toujours maladroit.)la source
Brachylog , 9 octets
Approche différente alors DLosc de réponse
Prend N comme sortie, renvoie [P, P-14] ou [P + 14, P] via l'entrée (le plus grand nombre en premier)
explication
Essayez-le en ligne!
la source
Pyth,
2220 octetsEssayez-le en ligne ici .
Edit: les 3 octets enregistrés en entrée seront toujours positifs, donc pas besoin de filtrer les valeurs négatives de la liste. Correction d'un bug pour les entrées
1
et2
coûtant 1 octet. La version précédente:}Qsm*Ld>#0+Ld_B14fP_TU
la source
05AB1E ,
161514 octetsEnregistré 1 octet en calculant 14 avec
7·
au lieu dežvÍ
(je ne peux pas croire que je n'y ai pas pensé en premier lieu).1 octet enregistré grâce à Emigna
Essayez-le en ligne! ou Testez toutes les entrées
Explication
la source
}˜så
d'Q}Z
utiliser l' entrée implicite. Votre Test-Suite devrait être changé un peu en quelque chose comme ça pour le faire fonctionner ensuite. En outre, une façon d'écrire plus évidentežvÍ
ou7·
serait14
;)J ,
2115 octetsBasé sur la solution d'Arnauld :
Essayez-le en ligne!
Tentative précédente:
Essayez-le en ligne!
la source
14 e.q:|@-]%q:
pour 14 octetsRetina 0.8.2 , 61 octets
Essayez-le en ligne! Explication:
Convertissez en unaire.
\1
saisit le plus grand des deux facteurs.\2
capture la constante 14, économisant un octet.\3
capture le plus petit des deux facteurs, moins 1. Cela garantit également que les deux facteurs sont au moins 2.Vérifiez les deux facteurs pour vous assurer qu'au moins l'un d'entre eux est premier. L'idée d'utiliser a
\2?
été impudiquement volée dans la réponse de @ Deadcode.Répétez le plus grand des deux facteurs un nombre de fois égal à un de moins que le plus petit des deux facteurs. Comme nous avons déjà capturé le facteur le plus important, cela finit par capturer le produit des deux facteurs.
Assurez-vous que le produit est égal au nombre donné.
Une traduction directe vers Retina 1 en remplaçant
$*
par*1
aurait le même nombre d'octets, mais un octet pourrait être enregistré en remplaçant tous les1
s par_
s, puis*1
pourrait être remplacé par*
plutôt que*_
. Réponse précédente de Retina 1 pour 68 octets:Essayez-le en ligne! Explication:
Convertissez en unaire.
Trouvez toutes les paires de facteurs.
Assurez-vous que l'un est premier.
Prenez la différence absolue.
Vérifiez s'il y en a 14.
la source
JavaScript (Babel Node) , 69 octets
Merde, je pensais que j'allais battre la réponse d'Arnaulds mais non .....: c
Essayez-le en ligne!
Je veux me débarrasser de la
x=>[...Array(x)].some(
pièce en utilisant la récursivité afin qu'elle puisse se raccourcir avec le tempsExplication
Il utilise la formule
la source
Japt , 10 octets
Identique à ma réponse Javascript
Essayez-le en ligne!
la source
Gelée , 9 octets
Essayez-le en ligne!
la source
APL (NARS) 16 caractères, 32 octets
{π⍵} trouverait la factorisation de son argument et nous supposons que le dernier élément de son résultat (la liste des diviseurs de n) est le diviseur premier maximum de n; Ici, nous supposons qu'une définition équivalente du nombre de Rocco est: n est un nombre de Rocco <=> facteur maximal premier de n: r est tel qu'il est vrai 14 = ∣rn ÷ r [pour le pseudocode C comme 14 == abs (rn / r) cette définition du nombre de Rocco semble enfin correcte dans la plage 1..1000000]; la plage de valeurs ok serait 1..maxInt; tester:
la source
C # (Visual C # Interactive Compiler) , 99 octets
Essayez-le en ligne!
Enumerable.Range
frappe à nouveau :) En utilisant le drapeau fou du compilateur, vous pouvez réduire les choses un peu, même si je suis un peu fan de la solution vanilla.C # (Visual C # Interactive Compiler) + /u:System.Linq.Enumerable, 77 octets
Essayez-le en ligne!
Ci-dessous est un portage de la solution d'Arnauld qui semblait assez cool. C'est actuellement le plus long, mais il peut probablement être joué au golf.
C # (Visual C # Interactive Compiler) , 101 octets
Essayez-le en ligne!
la source
APL (NARS) 30 caractères, 60 octets
Ici 0π est la fonction disons si un nombre est premier, test:
la source
F #, 2 réponses (non concurrentes)
J'ai vraiment aimé les réponses de @Arnauld, alors je les ai traduites.
123 octets , basé sur la réponse JavaScript
Explication:
125 octets , basé sur la réponse 05AB1E
Explication:
la source
Python 2 , 58 octets
Sorties par code de sortie, échoue (
1
) pour les numéros Rocco.Essayez-le en ligne!
la source