En 1946, Erdos et Copeland ont prouvé qu'un certain nombre est un nombre normal , c'est-à-dire que les chiffres de son expansion décimale sont uniformément répartis.
Les utilisateurs entreront une séquence de chiffres et vous trouverez le plus petit nombre premier contenant cette chaîne dans la base 10.
Exemple:
input -> output
"10" -> 101
"03" -> 103
"222" -> 2221
"98765" -> 987659
Le code le plus court en octets gagne. Je sais que certains langages (mathématique, sage, pari-gp ...) sont livrés avec des fonctions intégrées liées aux nombres premiers. -50 octets si votre programme ne repose pas sur de telles fonctions. N'essayez pas de tricher à ce sujet s'il vous plaît, si votre langue a déjà un énorme avantage, ne réclamez pas le bonus.
Éditer
Selon quelques commentaires ci-dessous, le plus petit nombre premier contenant "03" est 3. Est-ce que cela fait vraiment une différence? La seule chose à laquelle je peux penser est que les nombres sont peut-être plus faciles à gérer que les chaînes.
Dans des cas comme "03", la sortie préférée serait 103. Cependant, je ne considère pas que ce soit la partie fondamentale de votre programme, vous êtes donc libre d'ignorer tout zéro de tête s'il vous accorde un nombre d'octets inférieur.
Réponses:
Golfscipt,
3332 octets = -18 scoreExplication:
2{...}{)}/
- en commençant par2
, alors que quelque chose est vrai, incrémentez le haut de la pile;;x
- supprimer les valeurs intermédiaires collectées par{}{}/
et l'entrée, puis y mettre la dernière valeur testée:x,2>
- stocker la valeur sousx
, puis produire une liste de2
àx-1
{x\%!},!!
- garder ceux quix
sont divisibles par, puis contraindre à booléen (non vide)x`3?)!
- recherchez l'entrée sous forme de textex
(-1
si elle n'est pas trouvée), incrémentez, annulez.|
- oula source
Programme Haskell, 97 caractères = 47 points
Fonction Haskell, 75 caractères = 25 points
le type de
p
est(Integral a, Show a) => [Char] -> a
. Si vous fournissez votre propre type intégral, vous pouvez rechercher par infixe dans votre propre représentation de ces valeurs. La normeInteger
utilise la notation décimale attendue pour les entiers.Pas très vite. Quadratique dans la valeur (pas la taille) de la sortie.
version non golfée:
exemple:
la source
Java - 175 caractères.
la source
indexOf(a[0])>=0)
et{System.out.println(n)
.boolean p=true
par quelque chose commeint p=1
et ainsi de suite.Mathematica 58
Timings relatifs sur mon Mac (i7 2,6 GHz avec 8 Go de mémoire).
Trouvez le plus petit nombre premier contenant "01".
Trouvez le plus petit nombre premier contenant "012345".
Trouvez le plus petit nombre premier contenant "0123456".
la source
StringFreeQ
pour le raccourcir.Sauge , 72
S'exécute dans l'invite interactive
Primes().unrank(i)
donne lei
e nombre premier, le 0e étant 2.la source
R, 56 caractères -50 = 6
Prenez l'entrée comme stdin. Incrémente k jusqu'à ce que k soit un nombre premier (testé en additionnant les instances pour lesquelles k mod 2 à k sont des zéros, donc FAUX puisque 0 transformé en logique est FAUX) et contient la chaîne donnée en entrée (testé avec un simple grep, ici grepl puisque nous voulons un résultat logique).
Usage:
la source
shell oneliner (coreutils): 45chars
Pas de définition d'une fonction ici ... juste un oneliner qui prend un argument
$n
et scanne la plage entière (en fait un peu plus pour raccourcir le code). La version 55 caractères:Ce n'est même pas trop lent. Pour
n=0123456
elle retourne201234563
dans81.715s
. C'est incroyablement rapide pour un long pipeline avec deux processeurs de chaînes.En supprimant deux caractères (jusqu'à 53) et un canal, nous pouvons le faire fonctionner encore plus rapidement:
Et enfin, un peu de
sed
magie pour le ramener à 45 caractères , bien que l'impression soit moche:la source
J - 38 caractères -50 = -12 pts
Normalement, en J, vous utiliseriez les fonctions intégrées très optimisées dédiées aux nombres premiers, donc je ne vais pas m'excuser pour la lenteur d'exécution.
Expliqué:
>:@]^:(...)^:_&2
- En commençant par 2, incrémentez jusqu'à ce que(...)
renvoie false.(+.i.)@]
- Prenez le GCD du compteur avec chaque entier plus petit que lui. (Nous utilisons la convention GCD (X, 0) = X.)]=*/@
- Prenez le produit de tous ces nombres et testez l'égalité au compteur. Si le compteur est premier, la liste était tous les 1, sauf pour le GCD avec 0; sinon, il y aura au moins un GCD supérieur à 1, donc le produit sera supérieur au compteur.>./@(E.":)
- Testez si la représentation sous forme de chaîne du compteur (":
) contient la chaîne (E.
) à tout moment.>./
est la fonction max, et nous l'utilisons carE.
retourne un vecteur booléen avec un 1 partout où la sous-chaîne commence dans la chaîne principale.*:
- Logique NAND les résultats ensemble. Cela ne sera faux que si les deux entrées étaient vraies, c'est-à-dire si le compteur était à la fois premier et contenait la sous-chaîne.Usage:
Pour la postérité, voici la version utilisant la prime intégrée (30 caractères de long, mais pas de bonus):
1 p:]
teste le compteur pour la primauté, au lieu de l'astuce GCD.la source
Brachylog (v2), 3 octets dans l'encodage de Brachylog
Essayez-le en ligne!
Soumission de fonction, en prenant l'entrée de l'argument de droite, en donnant la sortie en mutant l'argument de gauche. (C'est l'opposé de la convention Brachylog normale; voir cette publication pour plus de détails. Changer les arguments dans l'ordre le plus courant coûterait trois octets.) Le lien TIO a un wrapper qui appelle la fonction avec la convention d'appel appropriée et imprime le résultat.
Explication
Malheureusement, Brachylog est si approprié pour ce problème que selon les règles du problème, je ne peux même pas essayer d'aller chercher le bonus (ce qui signifie ironiquement qu'il est incapable de gagner).
L'une des raisons pour lesquelles j'aime tant Brachylog est que la programmation est une communication entre l'homme et l'ordinateur, et donc un langage "parfait" vous permettrait de traduire directement la spécification du problème en anglais directement; les idées par lesquelles le problème a été énoncé et par lesquelles le programme est écrit seraient les mêmes. Brachylog peut atteindre cet idéal étonnamment souvent; la question ici est "trouver le plus petit nombre premier contenant une sous-chaîne donnée", et je peux littéralement enchaîner les concepts de "plus petit, premier, contenant la sous-chaîne" dans le bon ordre et avoir un programme de travail. En tant que tel, Brachylog en dit beaucoup plus sur la nature de la communication qu'un langage dans lequel vous deviez explicitement spécifier un algorithme pour résoudre le problème; parfois quand on parle à d'autres humains, nous essayons d'expliquer un problème en expliquant les étapes à suivre pour le résoudre, mais c'est rare. Alors pourquoi nos langues devraient-elles être différentes?
la source
JavaScript 83 octets = 33 points
Golfé:
Non golfé (un peu):
la source
Javascript (Node.JS) - 93 octets = 43 points
Sous forme extraite avec des noms de variables sensibles:
la source
Rouille 0,9 136 octets = 86 points
Très explicite malgré sa compacité. Trop d'espace dépensé pour la recherche de chaîne. :(
Voici la version sans espace (136 caractères)
la source
Japt, 10 octets
Essayez-le
la source
Tidy , 37 octets
Essayez-le en ligne!
la source
Perl 6 , 36 - 50 = -14 points
Essayez-le en ligne!
Considérant
$_%%one ^$_
que les 2 seuls octets sontplus petitsque.is-prime
, je pense que cela en vaut la peine pour le bonus. Cela expire pour le dernier cas de test.Explication:
la source
:$
Python 3 ,
8079 octets - 50 =3029 score-1 octet grâce à l'utilisation créative de @ ASCII uniquement au
%s
lieu destr
Le cas de test "98765" n'a pas encore été confirmé en raison du temps qu'il faut pour testerConfirmé pour le cas de test "98765" après quelques heures, mais avec une approche similaire qui utilise une évaluation en court-circuit pour éviter certains tests de primalité, cela fonctionne Plus vite. Alternativement, cela peut être ~ 2x plus rapide si nous savons que "2" n'est pas une entrée (nous pouvons éviter de vérifier les nombres pairs pour la primauté) en définissanti=3
initialement eti+=2
dans la boucle, sans coût supplémentaire en octets.Essayez-le en ligne!
Explication de la
while
condition ((x in"%s"%i)*all(i%j for j in range(2,i))-1
):(x in"%s"%i)
:True
/1
si le compteur actuel contient la séquence de nombres souhaitée;False
/0
sinon.all(i%j for j in range(2,i))
:True
/1
si le compteur courant a toujours un reste lorsqu'il est divisé par un entier de 2 (inclus) à lui-même (exclusif), c'est-à-dire qu'il est premier;False
/0
sinon.Le
*
multiplie les deux conditions ensemble et agit comme unand
opérateur - le produit estTrue
/1
si et seulement si les deux conditions sontTrue
/1
.L' opérateur
-1
agit comme unnot
opérateur:False
/0
- 1 donne-1
, ce qui est considéré comme vrai, tandis queTrue
/1
- 1 entraîne0
, ce qui est considéré comme faux. Ainsi, la boucle continue tandis que le nombre ne contient pas la séquence de nombres souhaitée ou n'est pas premier.Remplacez le
*
parand
et ajoutez des parenthèses autour de tout sauf-1
pour une solution équivalente beaucoup plus rapide (qui est légèrement plus longue).Une solution de score de 76 octets - 50 = 26 en Python 2 donnée par @ ASCII uniquement (utilise à la
``
place destr()
,Essayez-le en ligne!
la source
return I
JavaScript, 65 - 50 = 15 points
Essayez-le en ligne!
la source