Lasst uns zu 9 konvergieren!

21

Bei einer Ganzzahl n> 2 wird die kleinste nicht negative Ganzzahl k ausgegeben oder zurückgegeben, so dass a (n, k) = 9 ist , wobei a (n, k) definiert ist durch:

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n, k) / 2 + 1, wenn a (n, k) gerade ist
    • die Summe der Ziffern von a (n, k) ² (in Basis 10), wenn a (n, k) ungerade ist

Beispiele

Für n = 5 ist die erwartete Ausgabe 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)

Für n = 40 ist die erwartete Ausgabe k = 2 :

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

Erläuterungen und Regeln

  • Die Eingabe ist garantiert größer als 2.
  • Ihr Programm sollte theoretisch für jeden Wert von n funktionieren . (In der Praxis kann dies durch die maximale Ganzzahlgröße begrenzt sein, die von Ihrer Sprache unterstützt wird.)
  • k kann entweder 0-indiziert oder 1-indiziert sein. Bitte geben Sie dies in Ihrer Antwort an.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes!

Erste Werte

Unten sind die ersten Werte von n = 3 bis n = 422 mit k 0 -Idex. (Für die 1-Indizierung addieren Sie einfach 1diese Werte.)

 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
quelle
23
Obligatorischer Nitpick auf den Titel:9! ≠ 9
JungHwan Min
1
Coole Sequenz. Hast du das selbst entdeckt?
Robert Fraser
@RobertFraser Ich habe es getan, aber ich bin sicher, dass es irgendwo ähnliche Sequenzen gibt (ich konnte keine finden, aber ich habe nicht viel Zeit damit verbracht zu suchen.)
Arnauld
Nach Collatz Vermutung, Arnauld Vermutung! Was kommt als nächstes?
Sergiol
@sergiol Laut lmgtfy.com/?q=conjecture ist eine Vermutungan opinion or conclusion formed on the basis of incomplete information.
Roman Gräf

Antworten:

6

Schale , 13 Bytes

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

Dies ist 1-indiziert. Probieren Sie es online!

Erläuterung

Nichts Besonderes hier.

€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
quelle
Ich denke, es wäre schön, wenn dies gelöst würde.
H.PWiz
10

Perl 6 , 41 Bytes (40 Zeichen)

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

Probieren Sie es online!

Dies verwendet die 1-Indizierung von ks, sodass 1 höhere Antworten als in den Beispielen in OP angegeben werden. Wenn dies nicht die Bedeutung der 1-Indizierung ist, muss 1 Byte mehr hinzugefügt werden.

Erläuterung : Es handelt sich um eine anonyme Funktion. Wir verwenden nur die Perl 6-Funktion zum Generieren von Listen unter Verwendung der Rekursion: -). Es sieht wie folgt aus : (first element),(block that takes the previous element and gives the next)...(end condition). In diesem Fall ist das erste Element $_(Argument der Hauptfunktion) und die Endebedingung ist 9(erfüllt, wenn wir eine 9 erzeugen). Im mittleren Block $_verweisen wir auf sein Argument (= das vorherige Element der Sequenz). Das ?? !!ist der alte ternäre Operator (besser bekannt als ? :). Schließlich nehmen wir die Länge dieser Liste durch Erzwingen des numerischen Kontexts durch +(...).

Das letzte Seltsame hier ist die Summe der Ziffern. Zahlen sind Cool(verhalten sich wie Zeichenfolgen und Zahlen), daher verwenden wir eine Zeichenfolgenmethode .combfür $_²(Liste der Zeichen = Ziffern) und addieren dann die Zeichen (die sie wieder in Zahlen umwandeln).

Ramillies
quelle
Ja, das bedeutet 1-Indizierung.
Arnauld
7

Gelee , 17 Bytes

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

Probieren Sie es online!

Unkomplizierter Ansatz. Verwendet eine 0-basierte Indizierung.

Erläuterung

²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
Meilen
quelle
1
@Arnauld Danke, die Bedingung war ein do-while n != 9statt einwhile n!= 9
Meilen
7

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

-3 Bytes dank Jonathan Frech. -8 Bytes dank Maltysen. -7 Bytes dank Jonathan Allan. -1 Byte danke an Herrn Xcoder.

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

Probieren Sie es online!

Von jemandem, der wahrscheinlich nicht genug Mathe weiß, scheint dies völlig willkürlich zu sein. : P

total menschlich
quelle
1
Sie können in der Lage sein , zu ersetzen )%2and summit )%2*sum, spart drei Bytes.
Jonathan Frech
1
Gibt es einen Grund für Python 3? Andernfalls können Sie `for str repr
Maltysen
1
Sie können kvollständig loswerden und weitere sieben Bytes speichern
Jonathan Allan
8
Ich muss gestehen, ich habe vor ein paar Minuten den Überblick verloren, wie das funktioniert. > _ <
totalhuman
6

Mathematica, 58 Bytes

1-indiziert

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

Probieren Sie es online! (um mit Mathematik zu arbeiten, Trwird ersetzt durch Total)

hier ist eine -1-Byte-Version von @JungHwanMin (aber es funktioniert nicht mit Mathematik, also habe ich beide beibehalten)

Mathematica, 57 Bytes

If[#!=9,#0@If[2∣#,#/2+1,Total@IntegerDigits[#^2]]+1,0]&
J42161217
quelle
1
-1 Byte: Verwenden Sie 2∣#anstelle von OddQ@#und vertauschen Sie die beiden Ausdrücke von If.
JungHwan Min
6

JavaScript (ES6), 59-50 Byte

0-indiziert.

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

Versuch es

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>


Erläuterung

Das erste, was wir tun, ist zu berechnen n-9. Wenn n==9dann das offensichtlich gibt 0und die Dinge dort aufhören. Wenn n!=9dann n-9ein Wert ungleich Null angegeben wird, bedeutet dies, dass wir mit dem logischen UND fortfahren können, da dies wahr ist. Wir rufen die Funktion erneut auf und übergeben ihr eine neue n, die wie folgt berechnet wird:

n%2?

Wenn nModulo 2wahr ist, nist es ungerade.

[...""+n*n]

Multiplizieren Sie es nmit sich selbst, konvertieren Sie es in eine Zeichenfolge und zerlegen Sie diese Zeichenfolge in ein Array einzelner Zeichen (Ziffern).

 .join`+`

Fügen Sie die Zeichen mithilfe von wieder zu einer Zeichenfolge zusammen +und geben Sie uns einen mathematischen Ausdruck.

eval(                   )

Bewerten Sie diesen Ausdruck und geben Sie die Summe der Ziffern von n*n.

:n/2+1

Wenn n%2falsch ist (dh gerade nist), dann teilen wir einfach ndurch 2und addieren 1.

Zum Ergebnis des erneuten Aufrufs der Funktion fügen wir dann hinzu 1. Unter Verwendung einer ersten Eingabe von läuft 5der Prozess also wie folgt ab:

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
Zottelig
quelle
4

Jelly ,  16  15 Bytes

-1 Byte dank Meilen (Verwendung von ternary if)

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

Ein monadischer Link, der Nummern aufnimmt und zurückgibt.
1-indiziert

Probieren Sie es online! oder sehen eine Testsuite (nötigen Ergebnisse 0-indizieren und Formate wie OPCode-Block zu sein)

Wie?

²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
quelle
Ich glaube, Sie können ein Byte speichern, indem Sie die von mir verwendete if-Anweisung mit Ihrer while-Schleife kombinieren. ²DSµH‘$Ḃ?n9$пL
Meilen
4

Haskell, 62 59 Bytes

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

Probieren Sie es online!

Edit: -3 Bytes dank @ Ørjan Johansen.

nimi
quelle
1
last$x:[y|odd a]kann auf gekürzt werden cycle[x,y]!!a.
Ørjan Johansen
2

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

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

Probieren Sie es online!

Xcali
quelle
Dies ergibt keine Ausgabe für 9.
Shaggy
Nichts ist dasselbe wie 0, oder? :) Code geändert.
Xcali
2

05AB1E , 16 Bytes

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

Probieren Sie es online!

Erläuterung

[                  # 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
quelle
1

VB.NET (.NET 4.5.2), 107 + 20 (Importe) = 117 Byte

Benötigt 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

Funktion, die neine Ganzzahleingabe annimmt und eine 0-basierte zurückgibt k.

Ungolfed:

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
quelle
1

Golfscript, 34 Bytes

Probieren Sie es online!

Ich brauche wirklich einen besseren Weg, als die Ziffern einer Zahl zu addieren.

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

Pyth ,  23  22 Bytes

Im Moment ist dies eine rekursive Funktion, aber ich werde versuchen, auf .W(funktionsfähig während) umzuschalten , um stattdessen Bytes zu sparen .

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

Probieren Sie es hier aus! (mit zusätzlichem Code zum Aufrufen der Funktion - verwenden- ohne Leerzeichen)y<your_number>

Mr. Xcoder
quelle
1

Java 8, 110 98 Bytes

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-indiziert

Erläuterung:

Probieren Sie es hier aus.

 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
quelle
1

Clojure v1.8, 124 113 112 Bytes

0-indiziert

(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)))))

Probieren Sie es online!

Erläuterung

(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
quelle
1

Pyth, 18 Bytes

tl.u?%N2sj*NNTh/N2

Probieren Sie es online aus: Demonstration

Erläuterung:

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
quelle
1

Japt, 22 21 Bytes

0-indiziert.

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

Versuch es


Erläuterung

Implizite Eingabe einer Ganzzahl U.

UÆ             Ã

Generieren Sie ein Array von Ganzzahlen von 0bis U-1und übergeben Sie diese jeweils einer Funktion.

=

Stellen Sie den Wert von ein U.

v ?

If Uist teilbar durch 2.

U/2Ä

Ugeteilt durch 2 plus 1 ( Ä).

:U²ìx

Sonst: Uhoch 2 ( ²), aufgeteilt in eine Reihe von Ziffern (ì ) und durch Addition ( x) reduzieren .

Nc

Hängen Sie das resultierende Array an das Array der Eingaben an.

b9

Suchen Sie den Index des ersten Vorkommens 9im Array. Das Ergebnis implizit ausgeben.

Zottelig
quelle
Dang. Ich hatte das Gefühl, dass die Verwendung einer Funktionsmethode viel besser wäre, aber ich habe es nur auf 23 Bytes @¥9}a@=u ?U²ìx :U/2Ä;°T
reduziert
@ETHproductions: Das gibt 1 für 9 anstelle von 0 aus, aber hier ist eine 22-Byte- Version (die für 9 immer noch fehlschlägt).
Shaggy
Ich habe mir letzte Nacht eine 20-Byte- Version ausgedacht, aber sie hatte das gleiche Problem.
Shaggy