Inspiré par cette question sur les mathématiques .
Le problème
Soit
n
un nombre naturel≥ 2
. Prenez le plus grand diviseur den
- qui est différent den
lui-même - et soustrayez-len
. Répétez jusqu'à ce que vous obtenez1
.
La question
Combien de pas faut-il pour atteindre 1
un nombre donné n ≥ 2
.
Exemple détaillé
Let
n = 30
.
Le plus grand diviseur de:
1. 30 is 15 --> 30 - 15 = 15
2. 15 is 5 --> 15 - 5 = 10
3. 10 is 5 --> 10 - 5 = 5
4. 5 is 1 --> 5 - 1 = 4
5. 4 is 2 --> 4 - 2 = 2
6. 2 is 1 --> 2 - 1 = 1
Il faut 6 étapes pour y arriver 1
.
Contribution
- L'entrée est un entier
n
, oùn ≥ 2
. - Votre programme doit prendre en charge la saisie jusqu’à la valeur entière maximale de la langue.
Sortie
- Indiquez simplement le nombre d'étapes, comme
6
. - Les espaces blancs ou les nouvelles lignes sont acceptables.
Exemples
f(5) --> 3
f(30) --> 6
f(31) --> 7
f(32) --> 5
f(100) --> 8
f(200) --> 9
f(2016^155) --> 2015
Exigences
- Vous pouvez obtenir des entrées à partir d’
STDIN
arguments de ligne de commande, de paramètres de fonction ou de l’équivalent le plus proche. - Vous pouvez écrire un programme ou une fonction. S'il s'agit d'une fonction anonyme, veuillez inclure un exemple expliquant comment l'invoquer.
- C'est la réponse code-golf, donc la réponse la plus courte en octets est gagnante.
- Les failles standard sont interdites.
Cette série est également disponible sur OEIS: A064097
Un quasi-logarithme défini inductivement par
a(1) = 0
eta(p) = 1 + a(p-1)
sip
est premier eta(n*m) = a(n) + a(m)
sim,n > 1
.
code-golf
math
arithmetic
insertusernamehere
la source
la source
2^32 - 1
. Le reste est à vous et à votre système. J'espère que c'est ce que vous vouliez dire par votre question.Réponses:
Gelée , 9 octets
Essayez-le en ligne! ou vérifier tous les cas de test .
Contexte
La définition de la séquence A064097 implique que
Par la formule du produit d'Euler
où φ désigne la fonction totale d'Euler et p ne varie que sur les nombres premiers.
En combinant les deux, on déduit la propriété
où ω désigne le nombre de facteurs premiers distincts de n .
En appliquant la formule résultante k + 1 fois, où k est suffisamment grand pour que φ k + 1 (n) = 1 , on obtient
De cette propriété, on obtient la formule
où la dernière égalité est vraie parce que ω (1) = 0 .
Comment ça fonctionne
la source
05AB1E ,
13 à11 octetsCode:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne! .
la source
[¼Ñü-¤ÄD#]¾
- J'étais sur le point de réduire un octet par paire, eh bien ...[Ð#Ò¦P-¼]¾
.Ð
est meilleur queDD
.Pyth, 11 octets
Suite de tests
Une boucle simple qui répète jusqu'à la vérité.
Explication:
la source
f
ilter.f
?f
sans deuxième argument itère sur tous les entiers positifs à partir de1
et renvoie la première valeur qui donne true sur la déclaration interne. Cette valeur est inutilisée dans ce programme, elle renvoie donc le nombre de fois qu’elle a été exécutée. Non sans papiers, mais peu orthodoxe :) Si cela vous aide, vous pouvez considérer cela comme unefor
boucle du genre:for(int i=1; some_condition_unrelated_to_i; i++) { change_stuff_that_affects_condition_but_not_i;}
f <l:T> <none>
),f
est entrée d' abord oùA(_)
est truthy plus[1, 2, 3, 4...]
.Python 2,
5049 octetsCela ne va pas finir bientôt ce dernier cas de test ...
Alternativement, voici un 48 octets qui renvoie
True
au lieu de1
pourn=2
:la source
Gelée , 10 octets
Essayez-le en ligne! ou vérifier la plupart des cas de test . Les derniers cas de test se terminent rapidement localement.
Comment ça fonctionne
la source
Rétine , 12
Cela suppose une entrée donnée en unaire et une sortie donnée en décimal. Si cela n'est pas acceptable, nous pouvons le faire pour 6 octets de plus:
Rétine , 18
Essayez-le en ligne - 1ère ligne ajoutée pour exécuter tous les tests en une fois.
Malheureusement, cela utilise unaire pour les calculs, de sorte que la saisie de 2016 155 n'est pas pratique.
1
sla source
\b
.Pyth -
151413 octetsUn boîtier spécial
1
me tue vraiment.Essayez-le en ligne ici .
la source
1
?1
is[]
, ce qui provoque une erreur lorsque je prends le premier élément. Je dois le cas spécial pour le faire revenir à1
nouveau afin que le.u
point fixe se termine. J'ai trouvé un meilleur moyen que d'.x
essayer, à l'exception de ce qui m'a permis d'économiser ces 2 octets..u
point fixe finira par atteindre1
toutes les entrées, auquel cas il devra être mis en majuscule.JavaScript (ES6),
* 4438Éditer 6 octets sauvés grâce @ l4m2
(* 4 frappés, c'est encore 4)
Fonction récursive
Moins joué au golf
Tester
la source
f=(n,d=n)=>n>1?n%--d?f(n,d):f(n-d)+1:0
?Mathematica, 36 octets
Une fonction non nommée prend les mêmes octets:
Ceci est une implémentation très simple de la définition en tant que fonction récursive.
la source
Octave,
595855 octetsÉchantillons:
la source
end
nécessaire en octave?Haskell, 59 octets
Usage:
Cela peut être un peu inefficace pour les grands nombres en raison de la génération de la liste.
la source
<1
au lieu de==0
sauver quelques octets:f 1=0;f n=1+f(n-last[a|a<-[1..n
div2],mod n a<1])
Julia,
56504539 octetsC'est une fonction récursive qui accepte un entier et retourne un entier.
Ungolfed:
Essayez-le en ligne! (inclut tous les cas de test)
6 octets sauvés grâce à Martin Büttner et 11 grâce à Dennis!
la source
PowerShell v2 +, 81 octets
Brutest de force brute.
Prend entrée
$a
, entre dans unefor
boucle jusqu’à ce qu’il$a
soit inférieur ou égal à1
. Chaque boucle passe par une autrefor
boucle qui compte à rebours$a
jusqu'à ce que nous trouvions un diviseur (!($a%$i
). Au pire, nous trouverons$i=1
un diviseur. Lorsque nous le faisons, incrémentez notre compteur$j
, soustrayez notre diviseur$a-=$i
et définissez-le$i=0
pour sortir de la boucle interne. Finalement, nous atteindrons une condition où la boucle externe est fausse (c'est-à-dire qu'elle$a
a été atteinte1
), donc output$j
et exit.Attention : Cela prendra beaucoup de temps sur les grands nombres, en particulier les nombres premiers. Une entrée de 100 000 000 prend environ 35 secondes sur mon ordinateur portable Core i5. Edit - vient de tester avec
[int]::MaxValue
(2 ^ 32-1), et cela a pris ~ 27 minutes. Pas trop mal, je suppose.la source
Matlab, 58 octets
la source
Japt , 12 octets (non concurrents)
Testez-le en ligne! Non compétitif car il utilise un ensemble de fonctionnalités qui ont été ajoutées bien après la publication du défi.
Comment ça fonctionne
Cette technique a été inspirée par la réponse 05AB1E . Une version précédente utilisée
²¤
(poussez 2, coupez les deux premiers éléments) à la place deÅ
parce qu’elle a un octet plus court ques1
(espace de fin de note); Je ne me suis rendu compte qu'après coup que parce que cela ajoute un 2 à la fin du tableau et des tranches dès le début , il échoue en fait pour tout nombre composé impair, bien que cela fonctionne pour tous les cas de test donnés.la source
Python 3,
75, 70, 67 octets.C'est une solution récursive assez simple. Il faut TRÈS longtemps pour les cas de test à nombre élevé.
la source
> <>, 32 octets
Attend le numéro d'entrée
n
, sur la pile.Ce programme construit la séquence complète sur la pile. Comme le seul nombre pouvant conduire à
1
est2
, la construction de la séquence s'arrête quand2
est atteint. Cela fait également en sorte que la taille de la pile soit égale au nombre d'étapes, plutôt qu'au nombre d'étapes +1.la source
Ruby, 43 octets
Trouvez le plus petit nombre
i
tel quex
divisex-i
et recurse jusqu'à ce que nous atteignions1
.la source
Haskell, 67 octets
Voici le code:
Et voici une des raisons pour lesquelles Haskell est génial:
Oui, dans Haskell, vous pouvez définir
-->
l'équivalent==
.la source
Matlab, 107 octets
la source
MATL,
1716 octetsEssayez-le en ligne
Explication
la source
C99,
6261 octets1 octet joué par @Alchymist.
Appelez en tant que f (x, & y), où x est l'entrée et y la sortie.
la source
Julia,
3936 octetsEssayez-le en ligne!
la source
Clojure,
116104 octets-12 octets en filtrant une plage pour trouver des multiples, puis en utilisant
last
une pour obtenir la plus grandeSolution naïve qui résout fondamentalement le problème décrit par le PO. Malheureusement, trouver le plus grand diviseur prend à lui seul la moitié des octets utilisés. Au moins, je devrais avoir beaucoup d’espace pour jouer au golf à partir d’ici.
Prégolfé et testé:
la source
Perl 6 , 35 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Pyth,
1716 octetsEssayez-le en ligne! (Le
y.v
à la fin est pour l'appel de fonction)Original 17 octets:
Essayez-le en ligne! (Le
y.v
à la fin est pour l'appel de fonction)(J'ai effectivement répondu à cette question avec ce programme Pyth.)
la source
u
durée est probablement plus courte que la récursion réelle.Pyke, 11 octets (sans compétition)
Ceci utilise un nouveau comportement dans lequel, si une exception est déclenchée après un goto, elle restaure l'état d'avant le goto (à l'exception des définitions de variable) et se poursuit. Dans ce cas, cela équivaut au code python suivant:
Tout cela est possible en utilisant Pyke sans construction de boucle while - yay goto!
Essayez-le ici!
la source
JavaScript (ES6),
7054 octetsImplémentation de la formule récursive fournie, mais maintenant mise à jour pour utiliser aussi la récursivité pour trouver le diviseur.
la source
Perl, 57 + 1 (
-p
drapeau) = 58 octetsUsage:
Ungolfed:
la source
Clojure,
9896 octetsutilise
for
:when
pour trouver le plus grand diviseur, boucle jusqu'à ce qu'une valeur supérieure à un ne soit trouvée.la source