Przejdźmy do 9!

21

Biorąc pod uwagę liczbę całkowitą n> 2 , wydrukuj lub zwróć najmniejszą nieujemną liczbę całkowitą k, tak aby a (n, k) = 9 , gdzie a (n, k) jest zdefiniowane przez:

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n, k) / 2 + 1, jeśli a (n, k) jest parzyste
    • suma cyfr a (n, k) ² (w podstawie 10), jeśli a (n, k) jest nieparzysta

Przykłady

Dla n = 5 oczekiwane wyjście to 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)

Dla n = 40 oczekiwanym wynikiem jest k = 2 :

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

Wyjaśnienia i zasady

  • Gwarantowane wejście jest większe niż 2.
  • Twój program powinien teoretycznie działać dla dowolnej wartości n . (W praktyce może być ograniczony maksymalnym rozmiarem liczby całkowitej obsługiwanym przez Twój język).
  • k może być indeksowane 0 lub indeksowane 1. Proszę podać to w swojej odpowiedzi.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

Pierwsze wartości

Poniżej znajdują się pierwsze wartości od n = 3 do n = 422 , z k0 indeksowane. (W przypadku indeksowania 1 wystarczy dodać 1te wartości).

 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
źródło
23
Obowiązkowe nitpick w tytule:9! ≠ 9
JungHwan Min
1
Fajna sekwencja. Odkryłeś to sam?
Robert Fraser,
@RobertFraser Zrobiłem to, ale jestem pewien, że gdzieś istnieją podobne sekwencje (nie mogłem znaleźć, ale nie spędzałem dużo czasu na wyszukiwaniu.)
Arnauld
Po hipotezie Collatza, Hipoteza Arnaulda! Co dalej?
sergiol
@sergiol Według lmgtfy.com/?q=koncepcja domniemanie jestan opinion or conclusion formed on the basis of incomplete information.
Roman Gräf

Odpowiedzi:

6

Łuska , 13 bajtów

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

Jest to indeks 1. Wypróbuj online!

Wyjaśnienie

Nic nadzwyczajnego.

€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
źródło
Myślę, że byłoby miło, gdyby udało się to rozwiązać.
H.PWiz
10

Perl 6 , 41 bajtów (40 znaków)

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

Wypróbuj online!

Używa 1-indeksowania k, więc daje 1 wyższe odpowiedzi niż przykłady w OP. Jeśli nie to oznacza indeksowanie 1, będę musiał dodać jeszcze 1 bajt.

Objaśnienie : To anonimowa funkcja. Po prostu używamy funkcji Perla 6 do generowania list przy użyciu rekurencji :—). Wygląda to tak: (first element),(block that takes the previous element and gives the next)...(end condition). W tym przypadku pierwszym elementem jest $_(argument funkcji głównej), a warunek końcowy jest 9(spełniony, gdy wygenerujemy 9). W środkowym bloku używamy $_odwołania do jego argumentu (= poprzedni element sekwencji). Jest ?? !!to stary operator trójskładnikowy (lepiej znany jako ? :). Na koniec bierzemy długość tej listy, wymuszając kontekst liczbowy przez +(...).

Ostatnią dziwną rzeczą jest tutaj suma cyfr. Liczby są Cool(zachowują się jak ciągi i liczby), więc używamy metody ciągu .combna $_²(podaj listę znaków = cyfry), a następnie dodając znaki do góry (co konwertuje je z powrotem na liczby).

Ramillies
źródło
Tak, to właśnie oznacza indeksowanie 1.
Arnauld
7

Galaretka , 17 bajtów

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

Wypróbuj online!

Proste podejście. Wykorzystuje indeksowanie 0.

Wyjaśnienie

²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
mile
źródło
1
@Arnauld Dzięki, warunkowe było do-while n != 9zamiastwhile n!= 9
mil
7

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

-3 bajty dzięki Jonathanowi Frechowi. -8 bajtów dzięki Maltysen. -7 bajtów dzięki Jonathanowi Allanowi. -1 bajt dzięki Mr. Xcoder.

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

Wypróbuj online!

Od kogoś, kto prawdopodobnie nie zna wystarczającej matematyki, wydaje się to całkowicie arbitralne. : P

całkowicie ludzki
źródło
1
Możesz być w stanie wymienić )%2and sumz )%2*sum, oszczędzając trzy bajty.
Jonathan Frech,
1
czy istnieje powód dla Pythona 3? w przeciwnym razie możesz użyć `for str repr
Maltysen
1
Możesz się kcałkowicie pozbyć i zaoszczędzić kolejne siedem bajtów
Jonathan Allan,
8
Przyznaję się, całkowicie straciłem orientację, jak to działa kilka minut temu. > _ <
całkowicie ludzki,
6

Mathematica, 58 bajtów

1-indeksowany

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

Wypróbuj online! (w celu pracy z matematyką Trjest zastąpiony przez Total)

tutaj jest wersja -1-bajtowa @JungHwanMin (ale nie działa z matematyki, więc zachowałem oba)

Mathematica, 57 bajtów

If[#!=9,#0@If[2∣#,#/2+1,Total@IntegerDigits[#^2]]+1,0]&
J42161217
źródło
1
-1 bajt: użyj 2∣#zamiast OddQ@#i zamień dwa wyrażenia If.
JungHwan Min.
6

JavaScript (ES6), 59 50 bajtów

0-indeksowane.

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

Spróbuj

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>


Wyjaśnienie

Pierwszą rzeczą, którą robimy, jest obliczanie n-9. Jeśli n==9tak, to oczywiście daje 0i wszystko się kończy. Jeśli n!=9to n-9da wartość niezerową, co, zgodnie z prawdą, oznacza, że ​​możemy kontynuować logiczne ORAZ. Ponownie wywołujemy funkcję, przekazując ndo niej nową , obliczoną w następujący sposób:

n%2?

Jeśli nmodulo 2jest prawdą, nto znaczy jest dziwne.

[...""+n*n]

Pomnóż nsam, przekonwertuj go na ciąg i zniszcz strukturę tego ciągu na tablicę pojedynczych znaków (cyfr).

 .join`+`

Połącz ponownie znaki za pomocą ciągu +, co da nam matematyczny wyraz.

eval(                   )

Oceń to wyrażenie, podając nam sumę cyfr n*n.

:n/2+1

Jeśli n%2falsey (tzn. nJest parzysty), po prostu dzielimy nprzez 2i dodajemy 1.

Do wyniku ponownego wywołania funkcji dodajemy 1. Tak więc, używając początkowego wejścia 5, proces przebiega następująco:

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
Kudłaty
źródło
4

Galaretka ,  16  15 bajtów

-1 bajt dzięki milom (użycie trójskładnika, jeśli)

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

Monadyczny link pobierający i zwracający liczby.
1-indeksowany

Wypróbuj online! lub zobacz zestaw testów (wymusza indeksowanie 0 i formaty takie jak blok kodu OP)

W jaki sposób?

²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
źródło
Wierzę, że możesz zapisać bajt łączący instrukcję if, której użyłem z twoją pętlą while. ²DSµH‘$Ḃ?n9$пL
mile
4

Haskell, 62 59 bajtów

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

Wypróbuj online!

Edycja: -3 bajty dzięki @ Ørjan Johansen.

nimi
źródło
1
last$x:[y|odd a]można skrócić do cycle[x,y]!!a.
Ørjan Johansen
2

Perl 5 , 56 + 1 (-n) = 57 bajtów

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

Wypróbuj online!

Xcali
źródło
Nie daje to żadnego wyniku dla 9.
Kudłaty
Nic nie jest takie samo jak 0, prawda? :) Kod zmieniony.
Xcali,
2

05AB1E , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

[                  # 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
źródło
1

VB.NET (.NET 4.5.2), 107 + 20 (import) = 117 bajtów

Wymaga 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

Funkcja, która przyjmuje ndane wejściowe jako liczbę całkowitą i zwraca wartość 0k .

Nie golfowany:

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.
źródło
1

Golfscript, 34 bajty

Wypróbuj online!

Naprawdę potrzebuję lepszego sposobu niż dodawanie cyfr liczby.

~{9-}{.2%{.*`{+48-}*48-}{2/)}if}/,
Josiah Winslow
źródło
1

Pyth ,  23  22 bajtów

Na razie jest to funkcja rekurencyjna, ale spróbuję przełączyć się na .W(funkcjonalny podczas), aby zamiast tego zapisać bajty .

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

Wypróbuj tutaj! (z dodatkowym kodem do wywołania funkcji - użyj- bez spacji)y<your_number>

Pan Xcoder
źródło
1

Java 8, 110 98 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

 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
źródło
1

Clojure v1.8, 124 113 112 bajtów

0-indeksowane

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

Wypróbuj online!

Wyjaśnienie

(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
źródło
1

Pyth, 18 bajtów

tl.u?%N2sj*NNTh/N2

Wypróbuj online: demonstracja

Wyjaśnienie:

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
źródło
1

Japt, 22 21 bajtów

0-indeksowane.

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

Spróbuj


Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U.

UÆ             Ã

Wygeneruj tablicę liczb całkowitych od 0do U-1i przekaż każdą z nich przez funkcję.

=

Ustaw wartość U.

v ?

Jeśli Umożna podzielić przez 2.

U/2Ä

Upodzielone przez 2 plus 1 ( Ä).

:U²ìx

W przeciwnym razie: Udo potęgi 2 ( ²), podzielone na tablicę cyfr ( ì) i zmniejszone przez dodanie ( x).

Nc

Dołącz wynikową tablicę do tablicy danych wejściowych.

b9

Znajdź indeks pierwszego wystąpienia 9w tablicy. Wynik niejawnie wyprowadza wynik.

Kudłaty
źródło
Dang. Miałem przeczucie, że użycie metody funkcji byłoby znacznie lepsze, ale zmniejszyłem ją tylko do 23 bajtów: @¥9}a@=u ?U²ìx :U/2Ä;°TGdyby tylko istniała metoda
zwracająca
@ETHproductions: Daje 1 dla 9 zamiast 0, ale tutaj jest wersja 22-bajtowa (która nadal nie działa dla 9).
Shaggy
Ostatniej nocy wymyśliłem wersję 20-bajtową, ale miała ten sam problem.
Shaggy