Convergeons à 9!

21

Étant donné un entier n> 2 , affichez ou renvoyez le plus petit entier non négatif k tel que a (n, k) = 9 , où a (n, k) est défini par:

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n, k) / 2 + 1 si a (n, k) est pair
    • la somme des chiffres de a (n, k) ² (en base 10) si a (n, k) est impair

Exemples

Pour n = 5 , la sortie attendue est k = 4 :

a(5, 0) = 5
a(5, 1) = 7  (5² = 25 and 2 + 5 = 7)
a(5, 2) = 13 (7² = 49 and 4 + 9 = 13)
a(5, 3) = 16 (13² = 169 and 1 + 6 + 9 = 16)
a(5, 4) = 9  (16 / 2 + 1)

Pour n = 40 , la sortie attendue est k = 2 :

a(40, 0) = 40
a(40, 1) = 21 (40 / 2 + 1)
a(40, 2) = 9  (21² = 441 and 4 + 4 + 1 = 9)

Clarifications et règles

  • L'entrée est garantie supérieure à 2.
  • Votre programme devrait théoriquement fonctionner pour n'importe quelle valeur de n . (En pratique, il peut être limité par la taille entière maximale prise en charge par votre langue.)
  • k peut être indexé 0 ou indexé 1. Veuillez l'indiquer dans votre réponse.
  • C'est le , donc la réponse la plus courte en octets l'emporte!

Premières valeurs

Voici les premières valeurs de n = 3 à n = 422 , avec k 0 indexé. (Pour l'indexation 1, ajoutez simplement 1ces valeurs.)

 1  2  4  3  3  5  0  4  3  4  2  6  1  1  6  5  5  4  1  5  2  3  3  7  6  2  3  2  2  7
 6  6  5  6  6  5  1  2  2  6  6  3  1  4  3  4  4  8  1  7  6  3  5  4  6  3  2  3  3  8
 7  7  3  7  4  6  6  7  5  7  6  6  6  2  4  3  3  3  6  7  3  7  2  4  7  2  6  5  6  4
 7  5  2  5  6  9  6  2  3  8  2  7  1  4  6  6  6  5  1  7  4  4  3  3  7  4  3  4  2  9
 6  8  6  8  6  4  6  8  2  5  3  7  6  7  3  8  2  6  7  8  6  7  5  7  6  7  4  3  3  5
 6  4  3  4  4  4  6  7  6  8  3  4  6  8  7  3  6  5  6  8  3  3  2  7  6  6  5  7  6  5
 7  8  2  6  3  3  6  6  6  7  4 10  6  7  3  3  6  4  1  9  2  3  3  8  7  2  6  5  2  7
 7  7  6  7  3  6  7  2  4  8  3  5  6  5  6  4  2  4  6  8  3  5  6  4  7  5  2  3  6 10
 7  7  3  9  2  7  1  9  5  7  6  5  6  7  4  9  6  3  6  6  3  4  2  8  7  7  6  8  6  4
 7  9  4  3  3  7  7  8  3  9  4  7  6  8  3  6  6  8  7  7  7  8  6  5  7  4  6  4  2  6
 7  7  6  5  3  4  7  5  4  5  3  5  7  7  6  8  2  7  1  9  6  4  6  5  7  7  2  9  6  8
 7  4  3  7  4  6  6  7  6  9  3  4  6  4  2  3  3  8  1  7  6  7  2  6  7  8  3  7  5  6
 7  8  2  9  3  3  6  7  6  4  4  4  6  7  6  7  6  7  6  8  7  5  6 11  7  7  3  8  4  4
 7  4  6  7  3  5  6  2  2 10  6  3  6  4  3  4  4  9  7  8  3  3  6  7  7  6  4  3  6  8
Arnauld
la source
23
Nitick obligatoire sur le titre:9! ≠ 9
JungHwan Min
1
Séquence cool. L'avez-vous découvert vous-même?
Robert Fraser
@RobertFraser Je l'ai fait, mais je suis sûr que des séquences similaires existent quelque part (je n'en ai pas trouvé, mais je n'ai pas passé beaucoup de temps à chercher.)
Arnauld
Après la conjecture de Collatz, la conjecture d'Arnauld! Et après?
sergiol
@sergiol Selon lmgtfy.com/?q=conjecture une conjecture estan opinion or conclusion formed on the basis of incomplete information.
Roman Gräf

Réponses:

6

Husk , 13 octets

€9¡?o→½ȯΣd□¦2

Ceci est indexé 1. Essayez-le en ligne!

Explication

Rien d'extraordinaire ici.

€9¡?o→½ȯΣd□¦2  Implicit input, say n = 5
  ¡            Iterate the following function:
   ?       ¦2   If divisible by 2,
    o→½         then halve and increment,
       ȯΣd□     else square, take digits and get their sum.
               This gives an infinite sequence: [5,7,13,16,9,9,9,9,9..
€9             1-based index of 9; print implicitly.
Zgarb
la source
Je pense que ce serait bien si cela était résolu.
H.PWiz
10

Perl 6 , 41 octets (40 caractères)

{+($_,{$_%2??[+] $_².comb!!$_/2+1}...9)}

Essayez-le en ligne!

Cela utilise 1-indexation des k, donc il donne 1 réponses plus élevées que les exemples dans OP. Si ce n'est pas ce que signifie l'indexation 1, je devrai ajouter 1 octet de plus.

Explication : c'est une fonction anonyme. Nous utilisons simplement la fonction de Perl 6 pour générer des listes en utilisant la récursivité :—). Il ressemble à ceci: (first element),(block that takes the previous element and gives the next)...(end condition). Dans ce cas, le premier élément est $_(argument de la fonction principale) et la condition de fin est 9(remplie lorsque nous générons un 9). Dans le bloc du milieu, nous utilisons $_pour faire référence à son argument (= l'élément précédent de la séquence). C'est ?? !!l'ancien opérateur ternaire (mieux connu sous le nom de ? :). Enfin, nous prenons la longueur de cette liste en forçant le contexte numérique par +(...).

La dernière chose étrange ici est la somme des chiffres. Les nombres sont Cool(se comportent à la fois comme des chaînes et des nombres), nous utilisons donc une méthode de chaîne .combsur $_²(donner la liste des caractères = chiffres), puis ajouter les caractères (qui les convertit à nouveau en nombres).

Ramillies
la source
Oui, c'est ce que signifie l'indexation 1.
Arnauld
7

Gelée , 17 octets

²DSµH‘$Ḃ?ßµ-n9$?‘

Essayez-le en ligne!

Approche directe. Utilise l'indexation basée sur 0.

Explication

²DSµH‘$Ḃ?ßµ-n9$?‘  Input: n
               ?   If
            n9$      n != 9
          µ        Then
        ?            If
       Ḃ               n % 2 == 1
   µ                 Then
²                      Square
 D                     Decimal digits
  S                    Sum
      $              Else
    H                  Halve
     ‘                 Increment
         ß           Call recursively
                   Else
           -         The constant -1
                ‘  Increment
miles
la source
1
@Arnauld Merci, le conditionnel était un do-while n != 9au lieu d'unwhile n!= 9
miles
7

Python 2 , 129 126 76 68 67 64 54 53 octets

-3 octets grâce à Jonathan Frech. -8 octets grâce à Maltysen. -7 octets grâce à Jonathan Allan. -1 octet merci à M. Xcoder.

f=lambda n:n-9and-~f(n%2*sum(map(int,`n*n`))or 1+n/2)

Essayez-le en ligne!

De la part de quelqu'un qui ne connaît probablement pas assez les mathématiques, cela semble complètement arbitraire. : P

totalement humain
la source
1
Vous pourrez peut-être remplacer )%2and sumpar )%2*sum, en économisant trois octets.
Jonathan Frech
1
y a-t-il une raison pour python 3? sinon vous pouvez utiliser `for str repr
Maltysen
1
Vous pouvez vous débarrasser kentièrement et économiser encore sept octets
Jonathan Allan
8
J'avoue que j'ai complètement perdu de vue comment cela fonctionne il y a quelques minutes. > _ <
totalement humain
6

Mathematica, 58 octets

1 indexé

If[#!=9,#0@If[OddQ@#,Total@IntegerDigits[#^2],#/2+1]+1,0]&

Essayez-le en ligne! (afin de travailler sur les mathématiques, Trest remplacé par Total)

voici la version -1 octet par @JungHwanMin (mais cela ne fonctionne pas sur les mathématiques donc j'ai gardé les deux)

Mathematica, 57 octets

If[#!=9,#0@If[2∣#,#/2+1,Total@IntegerDigits[#^2]]+1,0]&
J42161217
la source
1
-1 octet: utilisez 2∣#au lieu de OddQ@#et permutez les deux expressions de If.
JungHwan Min
6

JavaScript (ES6), 59 50 octets

0 indexé.

f=n=>n-9&&f(n%2?eval([...""+n*n].join`+`):n/2+1)+1

Essayez-le

o.innerText=(
f=n=>n-9&&f(n%2?eval([...""+n*n].join`+`):n/2+1)+1
)(i.value=5);oninput=_=>o.innerText=f(+i.value)
<input id=i min=3 type=number><pre id=o>


Explication

La première chose que nous faisons est de calculer n-9. Si n==9alors cela, évidemment, donne 0et les choses s'arrêtent là. Si n!=9alors n-9donnera une valeur non nulle qui, étant véridique, signifie que nous pouvons continuer à travers le ET logique. Nous appelons à nouveau la fonction, en lui passant une nouvelle n, calculée comme suit:

n%2?

Si nmodulo 2est véridique, c'est-à-dire qu'il nest étrange.

[...""+n*n]

Multipliez-le nlui-même, convertissez-le en chaîne et détruisez-la en un tableau de caractères individuels (chiffres).

 .join`+`

Rejoins les caractères à une chaîne en utilisant +une expression mathématique.

eval(                   )

Évaluez cette expression en nous donnant la somme des chiffres de n*n.

:n/2+1

Si n%2est falsey (c'est-à-dire, nest pair) alors nous divisons simplement npar 2et ajoutons 1.

Au résultat de l'appel de la fonction à nouveau, nous ajoutons ensuite 1. Ainsi, en utilisant une entrée initiale de 5, le processus se déroule comme suit:

f(5)
= -4&&f(7)+1
= -2&&(f(13)+1)+1
=  4&&((f(16)+1)+1)+1
=  7&&(((f(9)+1)+1)+1)+1
=     (((0+1)+1)+1)+1
= 4
Hirsute
la source
4

Gelée ,  16  15 octets

-1 octet grâce aux miles (utilisation du ternaire si)

²DSµH‘µḂ?_9$пL

Un lien monadique prenant et renvoyant des numéros.
1 indexé

Essayez-le en ligne! ou voir une suite de tests (contraint les résultats à être indexés 0 et les formats comme bloc de code OP)

Comment?

²DSµH‘µḂ?_9$пL - Link: number, n
            п  - collect results in a list while:
           $    -   last two links as a monad:
         _9     -     subtract nine
        ?       -   if:
       Ḃ        -     bit - current loop input modulo by 2 (1 if odd, 0 if even)
   µ            -   ...then:
²               -     square the current loop input
 D              -     cast to a list of its decimal digits
  S             -     sum
      µ         -   ...else:
    H           -     halve current loop input
     ‘          -     increment
              L - length (get the number of results collected
                -         - this includes the 9, so is 1-indexed w.r.t. k)
Jonathan Allan
la source
Je crois que vous pouvez enregistrer un octet combinant l'instruction if que j'ai utilisée avec votre boucle while. ²DSµH‘$Ḃ?n9$пL
miles
4

Haskell, 62 59 octets

f 9=0
f a=1+f(cycle[div a 2+1,sum[read[d]|d<-show$a^2]]!!a)

Essayez-le en ligne!

Edit: -3 octets grâce à @ Ørjan Johansen.

nimi
la source
1
last$x:[y|odd a]peut être raccourci cycle[x,y]!!a.
Ørjan Johansen
2

Perl 5 , 56 + 1 (-n) = 57 octets

$|++,$_=$_%2?eval$_**2=~s/./+$&/gr:1+$_/2while$_-9;say$|

Essayez-le en ligne!

Xcali
la source
Cela ne donne aucune sortie pour 9.
Shaggy
Rien n'est identique à 0, non? :) Le code a changé.
Xcali
2

05AB1E , 16 octets

[Ð9Q#Èi2÷>ënSO]N

Essayez-le en ligne!

Explication

[                  # start a loop
 Ð                 # triplicate current number
  9Q#              # if it equals 9, break
     Èi            # if even
       2÷>         # divide by 2 and increment
          ë        # else
           n       # square
            SO     # sum digits
              ]    # end loop
               N   # push the iteration counter N
Emigna
la source
1

VB.NET (.NET 4.5.2), 107 + 20 (importations) = 117 octets

A besoin Imports System.Linq

Function A(n)
While n<>9
n=If(n Mod 2=0,n/2+1,CStr(n^2).Sum(Function(c)Val(c)))
A+=1
End While
End Function

Fonction qui prend ncomme entrée entière et renvoie une base 0 k.

Non golfé:

Function A(n) ' input/output types are Object, but we will be casting to integer
    'A = 0 ' VB will create an implicit variable with the same name as the function

    ' loop until a(n, k) = 9
    ' using n as the variable to store a(n, k)
    While n <> 9

        n = If(n Mod 2 = 0, ' equivalent to c# ternary ?: operator

            n / 2 + 1, ' even case

            CStr(n ^ 2).Sum(Function(c) Val(c)))
            ' odd case
            ' cast number to string
            ' then convert each char to the number it represents
            ' and do a linq sum

        A += 1 ' Object + Integer will coerce to an integer
    End While

    ' Where's the return?
    ' That implicit variable with the matching name will get returned if there's no explicit return
End Function
Brian J
la source
1

Golfscript, 34 octets

Essayez-le en ligne!

J'ai vraiment besoin d'un meilleur moyen que de additionner les chiffres d'un nombre.

~{9-}{.2%{.*`{+48-}*48-}{2/)}if}/,
Josiah Winslow
la source
1

Pyth ,  23  22 octets

Pour l'instant, il s'agit d'une fonction récursive, mais j'essaierai de passer à .W(fonctionnel pendant) pour enregistrer des octets à la place .

L&-b9hy|*%b2sj^b2Th/b2

Essayez-le ici! (avec code supplémentaire pour appeler la fonction - utiliser- sans espaces)y<your_number>

M. Xcoder
la source
1

Java 8, 110 98 octets

n->{int k=0,s;for(;n!=9;k++){s=0;for(int c:(n*n+"").getBytes())s+=c-48;n=n%2<1?n/2+1:s;}return k;}

0 indexé

Explication:

Essayez-le ici.

 n->             // Method with integer as both input and return-type
   int k=0,      //  Result-integer `k` starting at 0
       s;        //  Sum-integer
   for(;n!=9;    //  Loop (1) as long as `n` is not 9
        k++){    //    And increase `k` by 1 after every iteration
     s=0;        //   Reset sum `s` to 0
     for(int c:(n*n+"").getBytes())
                 //   Do `n*n` and inner loop (2) over the digits as characters
       s+=c-48;  //    And increase the sum `s` with these digits
                 //   End of inner loop (2) (implicit / single-line body)
     n=n%2<1?    //   If `n` is even:
        n/2+1    //    Change `n` to `n/2+1`
       :         //   Else:
        s;       //    Change `n` to sum `s`
  }              //  End of loop (1)
  return k;      //  Return the result `k`
}                // End of separated method (2)
Kevin Cruijssen
la source
1

Clojure v1.8, 124 113 112 octets

0 indexé

(fn[n](loop[a n k 0](if(= a 9)k(recur(if(even? a)(+(/ a 2)1)(apply +(map #(-(int %)48)(str(* a a)))))(inc k)))))

Essayez-le en ligne!

Explication

(loop[a n k 0](if(= a 9)...))  Loop until a=9
(if(even? a)(+(/ a 2)1)...)    If even, a(n, k) / 2 + 1 if a(n, k)
(if(even? a)...(apply +(map #(-(int %)48)(str(* a a)))))  If odd, calculate the sum of digits of a(n, k)²
#(-(int %)48)                  Convert character to number
Chris
la source
1

Pyth, 18 octets

tl.u?%N2sj*NNTh/N2

Essayez-le en ligne: Démonstration

Explication:

tl.u?%N2sj*NNTh/N2
  .u                 apply the following function to the input, 
                     until it runs into a fixed point
    ?%N2                if value % 2 == 1:
          *NN               value * value
         j   T              convert to digits
        s                   sum
                        else:
               /N2          value / 2
              h              + 1
 l                   get the length of all visited values
t                     - 1
Jakube
la source
1

Japt, 22 21 octets

0 indexé.

NcUÆ=v ?U/2Ä:U²ìxà b9

Essayez-le


Explication

Saisie implicite d'entier U.

UÆ             Ã

Générez un tableau d'entiers de 0à U-1et passez chacun par une fonction.

=

Définissez la valeur de U.

v ?

Si Uest divisible par 2.

U/2Ä

Udivisé par 2, plus 1 ( Ä).

:U²ìx

Sinon: Uà la puissance de 2 ( ²), divisé en un tableau de chiffres ( ì) et réduit par addition ( x).

Nc

Ajoutez le tableau résultant au tableau d'entrées.

b9

Recherchez l'index de la première occurrence de 9dans le tableau. Sortie implicite du résultat.

Hirsute
la source
Dang. J'avais l'impression que l'utilisation d'une méthode de fonction serait beaucoup mieux, mais je ne l'ai réduite qu'à 23 octets: @¥9}a@=u ?U²ìx :U/2Ä;°Tsi seulement il y avait une méthode qui
renvoyait
@ETHproductions: Cela génère 1 pour 9 au lieu de 0, mais voici une version de 22 octets (qui échoue toujours pour 9).
Shaggy
J'ai proposé une version de 20 octets hier soir, mais il y avait le même problème.
Shaggy