Votre tâche, si vous choisissez de l'accepter, est d'écrire un programme / fonction qui accepte un entier N en entrée. Le programme / la fonction doit produire / renvoyer une liste des N premiers nombres premiers. Mais voici le hic: vous n'êtes pas autorisé à utiliser des caractères premiers dans votre code. Un caractère premier est un caractère dont le point de code Unicode est un nombre premier. Dans la gamme ASCII imprimable, ce sont:
%)+/5;=CGIOSYaegkmq
Mais la règle s'applique également aux caractères non ASCII si votre code les utilise.
- Une entrée valide est un entier N où 0 <N <= T , où vous pouvez choisir T , mais il doit être supérieur ou égal à 10000. T ne doit pas être fini.
- Pour les entrées non valides (non entiers, entiers hors limites), lève une exception ou génère / ne renvoie rien / null.
- Un entier avec des espaces de début / fin en entrée est considéré comme non valide.
- Un entier avec un
+
signe comme entrée est considéré comme non valide. - Un entier avec des zéros de tête en entrée est considéré comme valide.
- Si votre langue vous permet de passer un entier déjà analysé en entrée, les règles d'analyse ci-dessus (à l'exception de la plage un) ne s'appliquent pas, car l'int est déjà analysé.
- L'entrée est toujours en base 10.
- L'utilisation de générateurs principaux et de testeurs de primalité intégrés (cela inclut les fonctions de factorisation principale) n'est pas autorisée.
- La restriction de source est imposée aux caractères Unicode, mais le comptage d'octets pour le score peut être dans un autre encodage si vous le souhaitez.
- La sortie peut contenir une seule nouvelle ligne de fin, mais ce n'est pas obligatoire.
- Si vous affichez / renvoyez la liste des nombres premiers sous forme de chaîne, chaque nombre premier doit être délimité par un ou plusieurs caractères non numériques. Vous pouvez choisir le délimiteur que vous utilisez.
- Il s'agit d'un défi de code-golf , le code le plus court en octets gagne.
Stack Snippet pour vérifier votre code
Vous pouvez utiliser l'extrait de pile ci-dessous pour vérifier que votre code ne contient pas de caractères principaux:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
la source
la source
;
se trouve être interdit ...+
, il semble décevant de devoir les supprimer manuellement.Réponses:
CJam,
191830343319172120 octetsEssayez-le en ligne.
C'est probablement l'un des algorithmes les plus horriblement inefficaces que j'ai jamais mis en œuvre. Mais je l'ai fait pour la taille!
Ma réponse consiste en un bloc de code, qui agit comme une fonction anonyme dans CJam. Exécutez-le avec un entier qui le précède immédiatement sur la pile et la liste résultante est transférée sur la pile. Je traite la limite supérieure de l'entrée comme infinie, je n'ai donc pas à vérifier cette limite.
Mon algorithme commence par élever 3 à la
input
puissance e, ce qui est garanti pour donner un nombre supérieur auinput
-ième nombre premier si l'entrée est valide. Ensuite, une liste des entiers de 2 à ce nombre moins un est générée, ce qui est une bande suffisamment grande pour contenir tous les nombres premiers que nous voulons. Pour se débarrasser des nombres composites ... soupir ... nous créons une liste de chaque produit par paire, qui devrait générer tous les nombres composites de 4 à une valeur stupidement grande, suffisamment grande pour nos besoins. Il suffit ensuite de supprimer chaque élément de la liste d'origine qui se trouve dans cette liste composite, de le réduire jusqu'aux premiersinput
éléments et de joindre les éléments avec le caractère de nouvelle ligne.L'algorithme devrait fonctionner pour n'importe quelle entrée. Cependant, la question de savoir si l'interprète / ordinateur a suffisamment de mémoire ou de temps est une toute autre question, car les exigences de temps et d'espace sont exponentielles par rapport à l'entrée. Donc, si l'entrée est supérieure à environ 5 pour l'interprète en ligne ou à environ 8 pour l'interprète hors ligne, la réponse à cette question est probablement non.
la source
S*
?S
un personnage principal?Java. 474 octets
Prend l'entrée via l'argument de fonction, les sorties via l'exception levée.
Dentelé:
Caractères échappés supprimés:
Explication:
Ma solution d'origine a utilisé une
return
déclaration. Après avoir posé cette question sur StackOverflow, regettman a eu la gentillesse de fournir un moyen de sortie / retour sans utiliser de lettres majuscules.Comme d'habitude, les suggestions sont les bienvenues :)
la source
Rubis, 74
Explication:
*o
initialise un tableau de sortie vide. jusqu'à ce qu'il ait desn
éléments, nous trouvons le plus petit nombre> = 2 qui ne divise aucun élément actuellemento
, puis ajoutez-leo
. Pour tester la division, beurk. Tous les bons opérateurs sont interdits et je ne peux même pas les utiliserdivmod
. Le mieux que j'ai pu voir était d'utiliserx.div y
, qui prend x divisé par y et arrondit vers le bas, puis multiplier à nouveau par y. S'il est égal à x, il n'y a pas eu d'arrondi, donc y divise x.1.>x.^
est un test d'égalité, vérifiant si le résultat de xor est 0. L'.
avant chaque opérateur est parce que vous ne pouvez pas mélanger les.
appels d'opérateur sans-parent et les appels de méthode sans parenthèses.Edit: Les spécifications de vérification de portée ont été ajoutées après avoir posté cela, je pense. Pour se conformer, il faut 79 caractères:
la source
CJam,
383730 octetsEssayez-le ici
Je pense que cela devrait respecter toutes les règles et fonctionne pour tout N non négatif (c'est-à-dire que T est infini). C'est horriblement inefficace, alors ne l'essayez pas pour un grand nombre.
Il s'agit d'un bloc - la chose la plus proche d'une fonction (sans nom) - qui attend un entier sur la pile, imprime tous les nombres premiers et laisse la pile sans son entrée. Pour toutes les entrées invalides, il générera une erreur ou n'imprimera rien.
La plupart du code est la validation des entrées, suivie du tamis d'Eratosthène. Je n'avais besoin de contourner la restriction d'entrée qu'à 3 endroits:
)
est incrément dans CJam. J'avais besoin de cela une fois, mais je pouvais le remplacer par~
(complément au niveau du bit) parce que je mettais les chiffres au carré par la suite de toute façon.%
est modulo. J'utilise à la37c~
place, ce qui crée d'abord le personnage%
, puis l'évaluation. Cela rend le code beaucoup plus lent.;
saute et rejette un élément de la pile. Je dois le faire à la fin. Au lieu de cela, j'utilise'<(~
ce qui pousse le caractère<
, le décrémente et évalue ça.la source
Bash + coreutils, 227 octets
C'était assez délicat. Certaines choses que j'ai rencontrées:
while
etuntil
) sont inutilisables car elles se rapprochent le plus d'done
un mot-clé shell et ne peuvent pas être le résultat d'une expansion de variable (sauf si elleeval
est utilisée, mais elle l'est également). La seule boucle utilisable estfor
/in
qui autorise{
/}
au lieu dedo
/done
.for (( ; ; ))
n'est pas non plus utilisable.=
est sorti, nous avons donc besoin d'une autre façon d'affecter des variables.printf -v
est bon pour cela.jot
génère la liste des facteurs potentiels dans la boucle interne. Si un facteur potentiel divise un potentiel premier, il n'est pas premier et nous éclatons tôtbreak
s'agit d'un shell intégré et non d'un mot-clé, il peut donc être généré à la suite d'une expansion.dc
convertit un nombre de base 13 en bytestreameak
./
ou%
shell. C'est donc sous-traité à l' opérateurdc
s~
, qui pousse le quotient et le reste vers la pile.-lt
- less-than - est le seul opérateur de comparaison de shell utilisable.echo
est inutile pour la sortie.printf
fonctionne bien aussi longtemps que nous évitons%
Obtenir la bonne validation d'entrée est un peu pénible. Cela ne renvoie rien en cas d'entrée invalide.
Sortie:
la source
Haskell, 90 octets
Il s'agit d'une fonction anonyme qui prend un entier
n
en entrée.Comment ça marche:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(premier exemple de nombres premiers sur le wiki Haskell mais avec laelem
fonction remplacée) crée une liste infinie de nombres premiers.zip
avec les nombres de1
àn
pour faire une liste de(prime, seq. number)
paires. Supprimer le seq. encore une fois. Le résultat est une liste de nombres premiers de longueurn
.la source
Rouille, 64897 octets
(code coupé en raison de la limite de caractères, solution complète ici )
Les caractéristiques de rouille suivantes deviennent indisponibles en raison de la restriction principale:
Ce que vous pouvez utiliser techniquement:
Je ne pouvais tout simplement rien faire de Turing avec ces outils. Je suis désolé. Il ne restait plus qu'à inclure les 10000 premiers nombres premiers, nettoyés de 5. Au moins, vous pouvez le découper et avoir une solution valable, dans le sens le plus étroit possible.
J'aimerais beaucoup que des experts en plongée tarpit Turing (ou en rouille!) Me disent si j'aurais pu faire mieux!
la source
GNU APL,
75 68 67 65 59 5655 caractères⎕IO
doit être1
.Je suis revenu ce mois plus tard en réalisant que j'avais un espace supplémentaire!
la source
Pyth - 12 octets
Utilise la fonction de factorisation principale de pyth pour voir si # est premier. Utilise l'
!tPT
astuce qui m'a été suggérée lors de ma réponse pour les nombres premiers sous un problème d'un million.Étant donné que le filtre ne fonctionne que pour les nombres premiers sous n et non pas les premiers n, j'ai simplement recherché l'inverse de pi (x) pour 10 000 et obtenu 104 000, donc j'utilise des nombres premiers sous 10⁶ et j'obtiens le premier n. Cela ne fonctionne pas réellement, vous devez donc tester en remplaçant
^T6
par^T3
et restreindre n à moins de 1000. Entrée depuis stdin et sortie vers stdout.la source