La tâche à accomplir est, à partir d’un nombre n
, de trouver le plus petit nombre premier qui commence par AU MOINS n
du nombre situé 2
au début du nombre. C’est une séquence que j’ai trouvée sur OEIS ( A068103 ).
Les 17 premiers chiffres de la séquence sont donnés ci-dessous. Si vous voulez plus, je vais devoir mettre en œuvre la séquence, ce qui ne me dérange pas.
0 = 2
1 = 2
2 = 223
3 = 2221
4 = 22229
5 = 2222203
6 = 22222223 # Notice how 6 and 7 are the same!
7 = 22222223 # It must be **AT LEAST** 6, but no more than necessary.
8 = 222222227
9 = 22222222223 # Notice how 9 and 10 are the same!
10 = 22222222223 # It must be **AT LEAST** 9, but no more than necessary.
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221
Je pensais qu'il s'agirait d'une combinaison intéressante de manipulation de chaîne, de détection principale et de séquences. C'est le code-golf , le plus petit nombre d'octets sera déclaré gagnant, probablement à la fin du mois.
x
. Par exemple, si votre langue ne prend en charge que les entiers 32 bits, vous pouvez expliquer cela.Réponses:
Brachylog ,
12 à11 octetsEssayez-le en ligne!
Cela se traduit par Brachylog étonnamment directement. Il s’agit d’une fonction et non d’un programme complet (bien que le fait de donner l’interprète
Z
en argument de ligne de commande l’ajoute le wrapper approprié pour transformer la fonction en programme; c’est ce que j’ai fait pour que le lien TIO fonctionne). Il est également assez regrettable que l'j
indice semble avoir une indexation -1 et qu'il soit nécessaire d'y apporter une correction.Vous pouvez argumenter raisonnablement que ce
=
n'est pas nécessaire, mais je pense que, compte tenu du libellé du problème, il l'est; sans, la fonction décrivant l'ensemble de tous les nombres premiers qui commencent par le nombre donné de2
s, et sans déclaration explicite selon laquelle le programme devrait faire quelque chose avec cette description (dans ce cas, générer la première valeur), il n'en est probablement pas de même se conformer à la spéc.Explication
Lorsqu'elle est utilisée comme une fonction renvoyant un entier, rien ne demande de valeur après la première, de sorte que la première est tout ce dont nous devons nous préoccuper.
Une subtilité (soulignée dans les commentaires):
:Acb
etb:Ac
sont mathématiquement équivalentes (comme on supprime du début et l’autre ajoute à la fin, la région entre les deux ne se chevauchant jamais); J'avais précédemmentb:Ac
, ce qui est plus naturel, mais il se casse à l'entrée 0 (ce qui, je suppose, est parce qu'ilc
refuse de concaténer une liste vide, car de nombreuses fonctions intégrées de Brachylog tendent à se rompre pour une raison quelconque).:Acb
s'assure qu'ilc
ne faut jamais voir une liste vide, ce qui signifie que la casse de l'entrée 0 peut désormais fonctionner aussi.la source
0
, sans raison apparente (Brachylog semble être allergique aux zéros pour une raison quelconque; je soupçonne que lec
est responsable). Cela dit, il est assez facile de réparer, alors je vais régler ça maintenant.b:Ac
ne fonctionne pas car pour les entrées0
vous obtenez2b:Ac
:2b
donne0
et vous ne pouvez pas utiliserc
avec un zéro non significatif. La raison en est d'éviter les boucles infinies dans le cas général où vous pouvez toujours ajouter un zéro et obtenir les mêmes résultats.:2rj
place de,2:?j
r
; c'est simplement une amélioration. Je comprends ce qui se passec
(vous ne voulez pas une infinité de résultats lorsque vous courez à l'envers); Cependant, une amélioration probable consiste à interdire les entrées dégénérées uniquement si elles sont non liées, tout en les autorisant lorsque l'entrée est déjà liée à une valeur dégénérée.Java (OpenJDK 8) ,
164110 octetsMerci à @FryAmTheEggman pour un tas d'octets!
Essayez-le en ligne!
la source
new String(new char[i]))
crée une chaîne unaire de longueur égale au nombre. Ensuite, l'expression rationnelle correspond à un nombre composé en vérifiant si la répétition d'un ensemble de chiffres correspond à toute la chaîne (division d'essai). Si je ne me trompe pas, cela signifie que vous devriez pouvoir jouer au golf dans la deuxième partie pour ne pas en avoir un?
.Pyth, 12 octets
En pseudocode:
Boucle le
lambda
début à partir deT=1
, incrémentant de 1 jusqu’à ce que la condition soit remplie. La chaîne de2
s doit être une sous-chaîne à partir du début de la chaîne, c'est-à-dire que la méthode d'indexation doit renvoyer0
. Si la sous-chaîne n'est pas trouvée, elle retourne-1
ce qui est également une vérité, donc aucun cas exceptionnel n'existe.Vous pouvez l'essayer en ligne ici , mais le serveur ne permet qu'une entrée de
4
.la source
Perl, 50 octets
49 octets de code +
-p
drapeau.Fournissez l'entrée sans nouvelle ligne finale. Par exemple:
Cela prend un certain temps pour exécuter un nombre supérieur à 4, car il teste chaque nombre (il y a 2 tests: le premier
/^2{$_}/
vérifie s'il y en a suffisamment au début, et le second vérifie la(1x$\)!~/^1?$|^(11+)\1+$/
primalité (avec de très mauvaises performances)).la source
Haskell, 73 octets
Exemple d'utilisation:
f 3
->2221
.Force brute.
[1..n]>>"2"
crée une liste den
2
s qui est comparée aux premiersn
caractères de la représentation sous forme de chaîne du nombre premier actuel.la source
Mathematica, 103 octets
Fonction non nommée prenant un argument entier non négatif
#
et renvoyant un entier. Il teste littéralement tous les entiers positifs à son tour jusqu'à ce qu'il en trouve un qui commence par#
2 et est premier. Horriblement lent pour les entrées supérieures à 5.résultat précédent: Mathematica, 155 octets
Mathematica serait mieux pour jouer au golf s’il n’était pas typé aussi fort; nous devons explicitement basculer entre les types entier / liste / chaîne.
Cet algorithme fonctionne sur des listes de chiffres , étrangement, en commençant par
{2,...,2,1}
. Tant que ceux-ci ne sont pas les chiffres d'un nombre premier, il ajoute un au dernier chiffre, en utilisant la règle{j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}
... puis implémente manuellement le report du premier au prochain chiffre aussi longtemps que l'un des les chiffres sont égaux à 10, en utilisant la règle{a__,b_,10,c___}->{a,b+1,0,c}
... et ensuite, si nous sommes allés si loin que le dernier des premiers2
s est devenu un3
, recommence avec un autre chiffre à la fin, en utilisant la règle{a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b}
. À/. 23->2
la fin, on ne résout que le cas particulier où l'entrée est1
: la plupart des nombres premiers ne peuvent pas se terminer2
, ils le2
peuvent. (Quelques erreurs sont crachées sur les entrées0
et1
, mais la fonction trouve son chemin vers la bonne réponse.)Cet algorithme est assez rapide: par exemple, sur mon ordinateur portable, il faut moins de 3 secondes pour calculer que le premier nombre premier commençant à 1 000
2
s est22...220521
.la source
Pyth, 17 octets
Je n'arrive pas à résoudre le problème en
n = 4
ligne, mais c'est correct en théorie.Explication
la source
Perl 6 , 53 octets
L'essayer
Étendu:
la source
Gelée , 14 octets
Très inefficace. Essayez-le en ligne!
la source
Pyke, 14 octets
Essayez-le ici!
12 octets après la correction de bugs et une nouvelle fonctionnalité
Essayez-le ici!
la source
Sage,
6968 octetsUtilise un générateur pour trouver le premier (donc le plus petit) d’infiniment de termes.
la source
Japt, 20 octets
Testez-le en ligne! Il se termine en deux secondes sur ma machine pour toutes les entrées jusqu’à 14, puis perd naturellement de la précision (JavaScript n’a une précision entière que jusqu’à 2 53 ).
Merci beaucoup à @obarakon pour avoir travaillé dessus :-)
Explication
Dans la dernière version de Japt, cela peut être 12 octets:
Testez-le en ligne! Il se termine en une demi-seconde sur ma machine pour toutes les entrées jusqu’à 14.
la source
2222203
, seulement222223
et peu de temps après2222210
. Il échoue également sur toute entrée nécessitant au moins trois chiffres supplémentaires après la chaîne de2
s, telle que l'entrée 15.PHP, 76 octets
prend en entrée l'argument de la ligne de commande. Courez avec
-r
.panne
la source
Bash (+ coreutils), 53 octets
Fonctionne jusqu'à 2 ^ 63-1 (9223372036854775807) , prend beaucoup de temps pour terminer pour N> 8.
Golfé
Tester
la source
Python 3, 406 octets
code de test
sortie de test
J'ai décidé de privilégier la vitesse sur une plage assez large plutôt que sur la taille en octets. :) J'utilise un test de primalité déterministe Miller-Rabin garanti jusqu'à 3317044064679887385961981 avec cet ensemble de témoins. Les nombres premiers les plus grands réussiront toujours le test, mais certains composites peuvent également réussir, même si la probabilité est extrêmement faible. Cependant, j'ai également testé les nombres de sortie pour i> 22 en utilisant pyecm un programme de factorisation de courbe elliptique, et ils semblent être premiers.
la source
p()
appel ... OTOH, il serait difficile d'écrire un programme nettement plus petit qui puisse donner une sortie correcte pour i> 20 en moins d'une seconde (cela ne "triche" pas en appelant un programme intégré vérificateur de primalité). :)Python 3, 132 octets
Tout espoir de performance a été sacrifié pour un nombre d'octets plus petit.
la source
Java, 163 octets
code de test
sortie:
582,5858 millisecondes
Explication: boucle sur les entiers et les ajoute sous forme de chaînes à la chaîne racine, qui est la chaîne "2" donnée, et vérifie si elle est prime ou non.
la source
isProbablePrime
a des faux positifs occasionnels . Cela invaliderait la réponse, car il y a des circonstances dans lesquelles cela retourne une mauvaise valeur.