Mari kita konvergen ke 9!

21

Dengan bilangan bulat n> 2 , cetak atau kembalikan bilangan bulat non-negatif terkecil k sehingga a (n, k) = 9 , di mana a (n, k) ditentukan oleh:

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n, k) / 2 + 1 jika a (n, k) genap
    • jumlah digit a (n, k) ² (dalam basis 10) jika a (n, k) ganjil

Contohnya

Untuk n = 5 , output yang diharapkan adalah 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)

Untuk n = 40 , output yang diharapkan adalah k = 2 :

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

Klarifikasi dan aturan

  • Input dijamin lebih besar dari 2.
  • Program Anda secara teoritis harus bekerja untuk nilai n . (Dalam praktiknya, ini mungkin dibatasi oleh ukuran bilangan bulat maksimum yang didukung oleh bahasa Anda.)
  • k dapat berupa 0-diindeks atau 1-diindeks. Silakan sebutkan dalam jawaban Anda.
  • Ini , jadi jawaban tersingkat dalam byte menang!

Nilai pertama

Di bawah ini adalah nilai pertama dari n = 3 hingga n = 422 , dengan k 0 diindeks. (Untuk pengindeksan 1, tambahkan saja 1nilai-nilai ini.)

 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
sumber
23
Nitpick wajib pada judul:9! ≠ 9
JungHwan Min
1
Urutan keren. Apakah Anda menemukan ini sendiri?
Robert Fraser
@RobertFraser saya lakukan, tapi saya yakin urutan yang sama ada di suatu tempat (saya tidak bisa menemukan satu, tapi saya tidak menghabiskan banyak waktu mencari.)
Arnauld
Setelah dugaan Collatz, dugaan Arnauld! Apa berikutnya?
sergiol
@sergiol Menurut lmgtfy.com/?q=conjecture dugaan adalahan opinion or conclusion formed on the basis of incomplete information.
Roman Gräf

Jawaban:

6

Sekam , 13 byte

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

Ini 1-diindeks. Cobalah online!

Penjelasan

Tidak ada yang terlalu mewah di sini.

€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
sumber
Saya pikir akan lebih baik jika menyelesaikan ini.
H.PWiz
10

Perl 6 , 41 byte (40 karakter)

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

Cobalah online!

Ini menggunakan 1-indexing dari k, sehingga memberikan 1 jawaban yang lebih tinggi daripada contoh di OP. Jika ini bukan arti dari pengindeksan 1, saya harus menambahkan 1 byte lagi.

Penjelasan : Ini adalah fungsi anonim. Kami hanya menggunakan fasilitas Perl 6 untuk membuat daftar menggunakan rekursi :—). Ini terlihat seperti ini: (first element),(block that takes the previous element and gives the next)...(end condition). Dalam hal ini, elemen pertama adalah $_(argumen fungsi utama) dan kondisi akhirnya adalah 9(dipenuhi ketika kita menghasilkan 9). Di blok tengah, kita gunakan $_untuk merujuk argumennya (= elemen sebelumnya dari urutan). Ini ?? !!adalah operator ternary lama (lebih dikenal sebagai ? :). Akhirnya, kami mengambil panjang daftar ini dengan memaksa konteks numerik oleh +(...).

Hal aneh terakhir di sini adalah jumlah digit. Angka adalah Cool(berperilaku seperti string dan angka), jadi kami menggunakan metode string .combaktif $_²(berikan daftar karakter = digit), lalu tambahkan karakter ke atas (yang mengubahnya kembali menjadi angka).

Ramillies
sumber
Ya, inilah yang dimaksud dengan 1-pengindeksan.
Arnauld
7

Jelly , 17 byte

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

Cobalah online!

Pendekatan lurus ke depan. Menggunakan pengindeksan berbasis 0.

Penjelasan

²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
mil
sumber
1
@Arnauld Terima kasih, syaratnya adalah do-while n != 9bukannyawhile n!= 9
mil
7

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

-3 byte terima kasih kepada Jonathan Frech. -8 byte terima kasih kepada Maltysen. -7 byte terima kasih kepada Jonathan Allan. -1 byte terima kasih kepada Tn. Xcoder.

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

Cobalah online!

Dari seseorang yang mungkin tidak cukup tahu matematika, ini tampaknya sepenuhnya sewenang-wenang. : P

benar-benar manusiawi
sumber
1
Anda mungkin dapat mengganti )%2and sumdengan )%2*sum, menghemat tiga byte.
Jonathan Frech
1
apakah ada alasan untuk python 3? jika tidak, Anda dapat menggunakan `untuk str repr
Maltysen
1
Anda dapat menyingkirkan kseluruhnya dan menyimpan tujuh byte lagi
Jonathan Allan
8
Saya akui, saya benar-benar lupa bagaimana ini bekerja beberapa menit yang lalu. > _ <
totallyhuman
6

Mathematica, 58 byte

1-diindeks

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

Cobalah online! (untuk mengerjakan Matematika, Trdigantikan dengan Total) di

sini adalah versi -1 byte oleh @JungHwanMin (tetapi tidak bekerja pada matematika jadi saya tetap menggunakan keduanya)

Mathematica, 57 byte

If[#!=9,#0@If[2∣#,#/2+1,Total@IntegerDigits[#^2]]+1,0]&
J42161217
sumber
1
-1 byte: Gunakan 2∣#alih-alih OddQ@#dan tukarkan dua ekspresi dari If.
JungHwan Min
6

JavaScript (ES6), 59 50 byte

Diindeks 0.

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

Cobalah

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>


Penjelasan

Hal pertama yang kita lakukan adalah menghitung n-9. Jika n==9demikian, tentu saja, memberi 0dan berhenti di situ. Jika n!=9kemudian n-9akan memberikan nilai non-nol yang, karena jujur, berarti kita dapat melanjutkan melalui logika AND. Kami memanggil fungsi lagi, meneruskan yang baru nke sana, dihitung sebagai berikut:

n%2?

Jika nmodulo 2benar - yaitu, naneh.

[...""+n*n]

Lipat gandakan ndengan sendirinya, ubah menjadi string dan hancurkan string itu menjadi array karakter individu (digit).

 .join`+`

Bergabung kembali dengan karakter menggunakan string +, memberikan kita ekspresi matematika.

eval(                   )

Evaluasi ungkapan itu, beri kami jumlah digit n*n.

:n/2+1

Jika n%2adalah falsey (yaitu, nbahkan) maka kita hanya membagi noleh 2dan menambahkan 1.

Untuk hasil memanggil fungsi lagi, kami kemudian menambahkan 1. Jadi, menggunakan input awal 5, prosesnya sebagai berikut:

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
Shaggy
sumber
4

Jelly ,  16  15 byte

-1 byte berkat mil (penggunaan terner jika)

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

Tautan monadik yang mengambil dan mengembalikan nomor.
1-diindeks

Cobalah online! atau lihat test-suite (memaksa hasil untuk diindeks 0 dan format seperti blok kode OP)

Bagaimana?

²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
sumber
Saya percaya Anda dapat menyimpan byte yang menggabungkan if-statement yang saya gunakan dengan loop while Anda. ²DSµH‘$Ḃ?n9$пL
mil
4

Haskell, 62 59 byte

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

Cobalah online!

Sunting: -3 byte terima kasih kepada @ Ørjan Johansen.

nimi
sumber
1
last$x:[y|odd a]dapat disingkat menjadi cycle[x,y]!!a.
Ørjan Johansen
2

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

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

Cobalah online!

Xcali
sumber
Ini tidak menghasilkan output untuk 9.
Shaggy
Tidak ada yang sama dengan 0, kan? :) Kode berubah.
Xcali
2

05AB1E , 16 byte

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

Cobalah online!

Penjelasan

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

VB.NET (.NET 4.5.2), 107 + 20 (impor) = 117 byte

Membutuhkan 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

Fungsi yang dibutuhkan n input integer dan mengembalikan berbasis 0k .

Tidak Disatukan:

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

Golfscript, 34 byte

Cobalah online!

Saya benar-benar membutuhkan cara yang lebih baik daripada saya harus menjumlahkan angka angka.

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

Pyth ,  23  22 byte

Untuk saat ini, ini adalah fungsi rekursif tetapi saya akan mencoba untuk beralih ke .W(sementara fungsional) untuk menyimpan byte sebagai gantinya .

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

Coba di sini! (dengan kode tambahan untuk memanggil fungsi - gunakan- tanpa spasi)y<your_number>

Tuan Xcoder
sumber
1

Java 8, 110 98 byte

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;}

Diindeks 0

Penjelasan:

Coba di sini.

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

Clojure v1.8, 124 113 112 byte

Diindeks 0

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

Cobalah online!

Penjelasan

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

Pyth, 18 byte

tl.u?%N2sj*NNTh/N2

Cobalah online: Demonstrasi

Penjelasan:

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

Japt, 22 21 byte

Diindeks 0.

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

Cobalah


Penjelasan

Input bilangan bulat implisit U.

UÆ             Ã

Buat array bilangan bulat dari 0ke U-1dan melewati masing-masing melalui fungsi.

=

Tetapkan nilai U.

v ?

Jika Uhabis dibagi 2.

U/2Ä

Udibagi 2, ditambah 1 ( Ä).

:U²ìx

Lain: Udengan kekuatan 2 ( ²), pisahkan menjadi array angka ( ì) dan dikurangi dengan penjumlahan ( x).

Nc

Tambahkan array yang dihasilkan ke array input.

b9

Temukan indeks kemunculan pertama 9dalam array. Secara implisit mengeluarkan hasilnya.

Shaggy
sumber
Dang. Saya punya perasaan menggunakan metode fungsi akan jauh lebih baik, tapi saya hanya mendapatkannya turun menjadi 23 byte: @¥9}a@=u ?U²ìx :U/2Ä;°TJika saja ada metode yang mengembalikan jumlah iterasi sampai nilai berhenti berubah ...
ETHproduksi
@ ETHproductions: Output 1 untuk 9 bukan 0, tapi ini versi 22 byte (yang masih gagal untuk 9).
Shaggy
Saya memang datang dengan versi 20 byte tadi malam tetapi memiliki masalah yang sama.
Shaggy