La "fourmi" est un animal obstiné qui navigue dans les entiers et les divise jusqu'à ce qu'il ne reste plus que des nombres premiers!
Au départ, nous avons un tableau infini A contenant tous les entiers> = 2: [2,3,4,5,6,.. ]
Soit p
la position de la fourmi sur le tableau. Initialement, p = 0
(tableau est indexé par 0)
À chaque tour, la fourmi se déplace comme suit:
- si
A[p]
est premier, la fourmi passe à la position suivante:p ← p+1
- sinon, si
A[p]
est un nombre composé,q
soit son plus petit diviseur> 1. Nous divisonsA[p]
parq
, et nous ajoutonsq
àA[p-1]
. La fourmi se déplace à la position précédente:p ← p-1
Voici les premiers mouvements de la fourmi:
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 7 3 7 8 9 ...
^
Votre programme doit afficher la position de la fourmi après les n
déplacements. (vous pouvez supposer n <= 10000
)
Cas de test:
0 => 0
10 => 6
47 => 9
4734 => 274
10000 => 512
Modifier. vous pouvez également utiliser des listes à 1 index, il est acceptable d'afficher les résultats 1, 7, 10, 275, 513 pour le scénario de test ci-dessus.
C'est du code-golf, donc le code avec le code le plus court en octets gagne.
n
(ou si le cas composite pourrait jamais pousser la fourmi à gauche de l'initiale2
).1,7,10,275,513
si 1-indexation déclarée? Ou auraient-ils encore besoin de correspondre à vos sorties.Réponses:
Alice , 45 octets
Essayez-le en ligne!
Implémentation plutôt simple.
Les
n
temps de bouclage dans Alice se font généralement en poussant une adresse de retourn-1
, puis en revenant à la fin de chaque itération aveck
. La dernière fois dans la boucle, l'k
instruction n'a nulle part où retourner et l'exécution continue.Ce programme utilise la même
k
instruction pour arrêter tôt lorsque le nombre est premier. En conséquence, l'itération finale déplacera toujours la fourmi à gauche. Pour compenser ce bogue, nous effectuons desn+1
itérations sur un tableau à 1 index, ce qui donne exactement le résultat souhaité (et donne le casn=0
gratuitement).la source
Python 2 , 120 octets
Essayez-le en ligne!
Ah, la rare
for
-else
boucle! Laelse
clause ne s'exécute que si lefor
corps n'est pas quitté viabreak
. Dans notre cas, cela signifie que nous avons vérifié tous lesq
s et n’avons trouvé aucun d’entre eux à diviserp
.la source
Octave ,
109 103 10194 octetsEssayez-le en ligne!
Ce code affichera la position dans 1-indexation, ainsi les sorties pour les cas de test sont:
Cette version utilise certaines optimisations Octave, elle n'est donc pas compatible avec MATLAB. Le code ci-dessous est une version compatible MATLAB.
MATLAB,
130 123 118117 octetsUtilise 1-indexing comme avec la version Octave. Je l'ai testé par rapport à tous les cas de test dans MATLAB. Par exemple, la sortie sur 100000 est 3675 (index unique).
Une version commentée du code ci-dessus:
Ce qui est intéressant, c’est la position des fourmis par rapport au nombre d’itérations pour les 10000 premières valeurs de n.
Il semble probable que la fourmi tendra probablement à l'infini, mais qui sait, les apparences peuvent être trompeuses.
for
lieu dewhile
et suppression des crochets deif
- Merci @Giuseppe\=
et ses+=
opérations - Merci @Giuseppei++
eti--
- Merci @LuisMendola source
end
correspondre à la signature de la fonctionend
est optionnelle.end
est également facultative dans Octave. Ici, c'est seulement nécessaire parce que vous avez le code après la fonctionJavaScript (ES6), 91 octets
Démo
NB: Vous devrez peut-être augmenter la taille de pile par défaut de votre moteur pour qu'il réussisse tous les tests.
Essayez-le en ligne!
la source
Haskell ,
10810694 octetsEssayez-le en ligne! Exemple d'utilisation:
([0]#[2..]!!) 10
rendements6
(indexé sur 0).La fonction
#
opère sur deux listes, l'avant inversé du tableau[p-1, p-2, ..., 1]
et le reste infini du tableau[p, p+1, p+2, ...]
. Il construit une liste infinie de positions, à partir de laquelle lan
position th est renvoyée avec une entréen
.Le modèle
((a:b)#(p:q))
se liep
à la valeur de la position actuelle de la fourmi eta
à la valeur de la position précédente.b
est le préfixe du tableau de la position 1 àp-2
etq
le repos infini à partir de la positionp+1
.Nous construisons une liste d'appels récursifs de la manière suivante: Nous examinons chaque diviseur
d
dep
(qui est supérieur à un et inférieur àp
) dans l'ordre croissant et ajoutonsb#(a+d:div p d:q)
pour chacun d'eux que la valeur actuellep
est divisée pard
et que la fourmi se déplace un pas à gauche oùd
est ajouté àa
. Ensuite, nous ajoutons(p:a:b)#q
à la fin de cette liste, qui indique la fourmi se déplaçant un pas à droite.Nous prenons ensuite le premier de ces appels récursifs de la liste et ajoutons la position actuelle, qui coïncide avec la longueur de la liste de préfixes
b
. Comme les diviseurs sont dans l’ordre croissant, choisir le premier de la liste des appels récursifs garantit l’utilisation du plus petit. De plus, étant donné qu’il(p:a:b)#q
est ajouté à la fin de la liste, il n’est sélectionné que s’il n’ya pas de diviseur etp
est donc premier.Modifications:
-2 octets en basculant la liste des fonctions d’ordre décroissant à croissant.
-12 octets grâce à l'idée de Zgarb d'indexer dans une liste infinie au lieu de gérer un compteur et de passer à l'indexation 0.
la source
TI-BASIC,
10810310298 octetsL'entrée et la sortie sont stockées dans
Ans
. La sortie est 1 indexée.la source
fPart(∟A(P)/F:
avecfPart(F¹∟A(P:
. Même chose à la ligne suivante.not(fPart(7⁻¹7
est 0 maisnot(fPart(7/7
est 1.MATL , 41 octets
La sortie est basée sur 1. Le programme expire pour le dernier cas de test dans l'interprète en ligne.
Essayez-le en ligne!
Explication
Le programme applique la procédure décrite dans le challenge. Pour ce faire, il utilise de manière inhabituellement lourde les presse-papiers automatiques et manuels de MATL.
Le plus petit diviseur est obtenu en tant que première entrée de la décomposition en facteurs premiers.
La mise à jour de « fracture » se fait en écrasant l'entrée correspondante de la matrice A . La mise à jour "add" est effectuée par élément en ajoutant à A un tableau contenant des zéros sauf à la position souhaitée.
la source
Pyth - 44 octets
Mise en œuvre procédurale simple.
Suite de test .
la source
PARI / GP, 87 octets
Assez explicite (pas si golf-ish). Si vous ne comptez pas la
f(n)=
partie, vous obtenez 82 octets. Vous pouvez également commencer parn->
(85 octets).C'est un langage indexé 1.
Edit: La modification
illustrate(n,m)=A=[2..m+1];p=1;for(i=1,n,for(j=1,m,printf("%5s",if(j==p,Str(">",A[j],"<"),Str(A[j]," "))));print();q=factor(A[p])[1,1];if(A[p]!=q,A[p]/=q;p--;A[p]+=q,p++))
imprimera une illustration de la marche de la fourmi (avec un terminal suffisamment large). Par exempleillustrate(150,25)
donnera les 150 premiers pas sur 25 colonnes, comme ceci:la source
Python 2 ,
142127 octetsEssayez-le en ligne!
la source
P(n)
n<=4
Mathematica,
118103 octetsEssayez-le en ligne!
Martin Ender a enregistré 15 octets
la source
Divisors
, vous pouvez utiliser la notation infixe pourDo
et vous pouvez simplement retourner à lat
place det-1
(résultat basé sur 1).Python 3 ,
158149133 octetsIl s’agit d’une implémentation procédurale simple avec un ou deux défauts pour s’assurer que le code fonctionne pour tous les cas de test. Je l' utilise
[*range(2,n+9)]
pour faire en sorte que A est assez grand (saufn<3
,n+9
est plus que suffisant). Laelse
clause divise l'ancienA[p]
pard
, décrémentep
, puis ajouted
au nouveauA[p]
, ce qui est définitivement une mauvaise pratique de codage. Sinon, assez simple. Suggestions de golf bienvenues!Edit: -9 octets sans
sympy
merci à Halvard Hummel. -14 octets de Felipe Nardi Batista, -6 octets de quelques signaux de la réponse de Jonathan Frech à Python 2Essayez-le en ligne!
la source
if d-m:A[p]...
etelse:p+=1
pour sauver un octetelse
déclarationelse
déclaration, il n'y a plus de différence en octets avec la version de la fonctionPHP, 102 + 1 octets
Exécuter en pipe
-R
ou essayer en ligne .Sortie vide pour l'entrée
0
; insérer+
aprèsecho
pour un littéral0
ou utilisez cette version à 1 index (103 + 1 octets):
la source
R , 123 octets
Une implémentation simple. Il est fourni sous forme de fonction qui prend en entrée le nombre de coups et renvoie la position p.
Il boucle sur la séquence et déplace le pointeur d'avant en arrière selon les règles. La sortie est basée sur 0.
Remarque: afin de trouver le plus petit facteur premier d'un nombre x, il calcule le module de x par rapport à tous les entiers compris entre 0 et x. Il extrait ensuite les nombres de module égal à 0, toujours [0,1, ..., x]. Si le troisième nombre n'est pas x, il s'agit du plus petit facteur premier de x.
Essayez-le en ligne!
la source
C (gcc),
152148 octetsMinified
Formé avec quelques commentaires
Fonction principale pour les tests
Pour montrer chaque étape
Déclarez display () dans f ()
Afficheur ()
Afficheur ()
la source
Clojure, 185 octets
Aïe, éditer un "état" n'est pas idéal dans Clojure. Vous devrez augmenter l'exposant pour des entrées plus importantes.
la source
loop
fichier? Vous devriez pouvoir perdre quelques octets sans cela.first
chose en unesome
déclaration.recur
deux fois, une pour chaqueif-let
branche. Aussi(dec i)
serait dupliqué.some
besoin d’un prédicat, je pourrais utiliser+
car nous avons affaire à des nombres mais c’est un caractère plus long quefirst
. CMIIWJava 8,
138135 octetsExplication:
Essayez ici.
la source
Clojure,
198193191 octetsCela doit être sévèrement joué au golf ...
Golf 1 : 5 octets enregistrés en changeant
(first(filter ...))
de(some ...)
Golf 2 : 2 octets enregistrés en changeant
(zero? ...)
de(= ... 0)
Usage:
Code non golfé:
la source