Hãy hội tụ đến 9!


21

Cho một số nguyên n> 2 , in hoặc trả về số nguyên không âm nhỏ nhất k sao cho a (n, k) = 9 , trong đó a (n, k) được xác định bởi:

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n, k) / 2 + 1 nếu a (n, k) chẵn
    • tổng các chữ số của a (n, k) ² (trong cơ sở 10) nếu a (n, k) là số lẻ

Ví dụ

Với n = 5 , sản lượng dự kiến ​​là 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)

Với n = 40 , sản lượng dự kiến ​​là k = 2 :

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

Làm rõ và quy tắc

  • Đầu vào được đảm bảo lớn hơn 2.
  • Về mặt lý thuyết, chương trình của bạn sẽ hoạt động với mọi giá trị của n . (Trong thực tế, nó có thể bị giới hạn bởi kích thước số nguyên tối đa được hỗ trợ bởi ngôn ngữ của bạn.)
  • k có thể là 0-index hoặc 1-index. Hãy nêu nó trong câu trả lời của bạn.
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

Giá trị đầu tiên

Dưới đây là các giá trị đầu tiên từ n = 3 đến n = 422 , với k 0 được lập chỉ mục. (Đối với lập chỉ mục 1, chỉ cần thêm 1vào các giá trị này.)

 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

23
Nghĩa vụ bắt buộc trên tiêu đề:9! ≠ 9
JungHwan Min

1
Trình tự mát mẻ. Bạn đã tự khám phá điều này?
Robert Fraser

@RobertFraser Tôi đã làm, nhưng tôi chắc chắn các chuỗi tương tự tồn tại ở đâu đó (tôi không thể tìm thấy, nhưng tôi đã không dành nhiều thời gian để tìm kiếm.)
Arnauld

Sau khi phỏng đoán Collatz, phỏng đoán của Arnauld! Cái gì tiếp theo?
sergiol

@sergiol Theo lmgtfy.com/?q=conjecture một phỏng đoán làan opinion or conclusion formed on the basis of incomplete information.
La Mã Graf

Câu trả lời:


6

Husk , 13 byte

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

Đây là 1 chỉ mục. Hãy thử trực tuyến!

Giải trình

Không có gì quá lạ mắt ở đây.

€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.

Tôi nghĩ rằng nó sẽ tốt đẹp nếu giải quyết điều này.
H.PWiz

10

Perl 6 , 41 byte (40 ký tự)

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

Hãy thử trực tuyến!

Điều này sử dụng lập chỉ mục 1 của k, vì vậy nó cho 1 câu trả lời cao hơn so với các ví dụ trong OP. Nếu đây không phải là ý nghĩa của việc lập chỉ mục 1, tôi sẽ phải thêm 1 byte nữa.

Giải thích : Đó là một chức năng ẩn danh. Chúng tôi chỉ sử dụng cơ sở của Perl 6 để tạo danh sách bằng cách sử dụng đệ quy:. Nó trông như thế này : (first element),(block that takes the previous element and gives the next)...(end condition). Trong trường hợp này, phần tử đầu tiên là $_(đối số của hàm chính) và điều kiện kết thúc là 9(hoàn thành khi chúng ta tạo 9). Trong khối giữa, chúng tôi sử dụng $_để tham chiếu đến đối số của nó (= phần tử trước của chuỗi). Đây ?? !!là toán tử ternary cũ (được gọi là ? :). Cuối cùng, chúng tôi lấy độ dài của danh sách này bằng cách buộc bối cảnh số bằng +(...).

Điều kỳ lạ cuối cùng ở đây là tổng các chữ số. Các số là Cool(hoạt động cả như chuỗi và số), vì vậy chúng tôi sử dụng phương thức chuỗi .combtrên $_²(đưa ra danh sách các ký tự = chữ số), sau đó thêm các ký tự lên (chuyển đổi chúng thành số).


Vâng, đây là ý nghĩa của việc lập chỉ mục 1.
Arnauld

7

Thạch , 17 byte

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

Hãy thử trực tuyến!

Phương pháp tiếp cận thẳng. Sử dụng lập chỉ mục dựa trên 0.

Giải trình

²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

1
@Arnauld Cảm ơn, các điều kiện là một do-while n != 9thay vì mộtwhile n!= 9
dặm

7

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

-3 byte nhờ Jonathan Frech. -8 byte nhờ Maltysen. -7 byte nhờ Jonathan Allan. -1 byte nhờ ông Xcoder.

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

Hãy thử trực tuyến!

Từ một người có lẽ không biết đủ toán, điều này dường như hoàn toàn tùy ý. : P


1
Bạn có thể thay thế )%2and sumbằng )%2*sum, lưu ba byte.
Jonathan Frech

1
Có một lý do cho python 3? nếu không, bạn có thể sử dụng `cho str repr
Maltysen

1
Bạn có thể thoát khỏi khoàn toàn và lưu thêm bảy byte
Jonathan Allan

8
Tôi sẽ thú nhận, tôi hoàn toàn mất dấu về cách thức hoạt động của một vài phút trước đây. > _ <
hoàn toàn là


6

Toán học, 58 byte

1 chỉ mục

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

Hãy thử trực tuyến! (để làm việc trên Mathics, Trđược thay thế bằng Total)

ở đây là phiên bản -1 byte bởi @JungHwanMin (nhưng nó không hoạt động trên toán học nên tôi giữ cả hai)

Toán học, 57 byte

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

1
-1 byte: Sử dụng 2∣#thay vì OddQ@#và hoán đổi hai biểu thức của If.
JungHwan Min

6

JavaScript (ES6), 59 50 byte

Chỉ số 0.

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

Thử nó

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>


Giải trình

Điều đầu tiên chúng ta làm là tính toán n-9. Nếu n==9sau đó, rõ ràng, cho 0và mọi thứ dừng lại ở đó. Nếu n!=9sau đó n-9sẽ cho một giá trị khác không, có nghĩa là sự thật, có nghĩa là chúng ta có thể tiếp tục thông qua AND. Chúng ta gọi lại hàm, chuyển một hàm mới ncho nó, được tính như sau:

n%2?

Nếu nmodulo 2là sự thật - tức là, nlà số lẻ.

[...""+n*n]

Nhân nvới chính nó, chuyển đổi nó thành một chuỗi và phá hủy chuỗi đó thành một mảng các ký tự riêng lẻ (chữ số).

 .join`+`

Nối các ký tự vào một chuỗi bằng cách sử dụng +, cho chúng ta một biểu thức toán học.

eval(                   )

Đánh giá biểu thức đó, cho chúng ta tổng các chữ số của n*n.

:n/2+1

Nếu n%2là falsey (ví dụ, nlà chẵn) sau đó chúng tôi chỉ đơn giản là chia nbằng 2và thêm 1.

Để kết quả gọi hàm một lần nữa, sau đó chúng tôi thêm 1. Vì vậy, bằng cách sử dụng đầu vào ban đầu của 5, quá trình sẽ diễn ra như sau:

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

4

Thạch ,  16  15 byte

-1 byte nhờ dặm (sử dụng ternary nếu)

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

Một liên kết đơn và lấy số.
1 chỉ mục

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm (ép buộc các kết quả được lập chỉ mục 0 và các định dạng như khối mã OP)

Làm sao?

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

Tôi tin rằng bạn có thể lưu một byte kết hợp câu lệnh if mà tôi đã sử dụng với vòng lặp while của bạn. ²DSµH‘$Ḃ?n9$пL
dặm



2

05AB1E , 16 byte

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

Hãy thử trực tuyến!

Giải trình

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

1

VB.NET (.NET 4.5.2), 107 + 20 (nhập) = 117 byte

Đòi hỏi 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

Hàm lấy nđầu vào số nguyên và trả về 0 dựa trên k.

Ung dung:

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


1

Bình thường ,  23  22 byte

Hiện tại, đây là một hàm đệ quy nhưng tôi sẽ cố gắng chuyển sang .W(trong khi chức năng) để lưu byte thay thế .

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

Hãy thử nó ở đây! (với mã bổ sung để gọi hàm - sử dụng- không có dấu cách)y<your_number>


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

Chỉ số 0

Giải trình:

Hãy thử nó ở đây.

 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)

1

Clojure v1.8, 124 113 112 byte

Chỉ số 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)))))

Hãy thử trực tuyến!

Giải trình

(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

1

Bình thường, 18 byte

tl.u?%N2sj*NNTh/N2

Dùng thử trực tuyến: Trình diễn

Giải trình:

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

1

Japt, 22 21 byte

Chỉ số 0.

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

Thử nó


Giải trình

Đầu vào ngầm định của số nguyên U.

UÆ             Ã

Tạo một mảng các số nguyên từ 0đến U-1và chuyển từng thông qua một hàm.

=

Đặt giá trị của U.

v ?

Nếu Uchia hết cho 2.

U/2Ä

Uchia cho 2, cộng 1 ( Ä).

:U²ìx

Khác: Uvới sức mạnh của 2 ( ²), chia thành một mảng các chữ số ( ì) và giảm bằng phép cộng ( x).

Nc

Nối mảng kết quả vào mảng đầu vào.

b9

Tìm chỉ số của lần xuất hiện đầu tiên 9trong mảng. Ngẫu nhiên đưa ra kết quả.


Đăng. Tôi có cảm giác sử dụng một phương thức hàm sẽ tốt hơn rất nhiều, nhưng tôi chỉ giảm xuống còn 23 byte: @¥9}a@=u ?U²ìx :U/2Ä;°TNếu chỉ có một phương thức trả về số lần lặp cho đến khi một giá trị ngừng thay đổi ...
ETHproductions

@ETHproductions: Điều đó xuất ra 1 cho 9 thay vì 0, nhưng đây là phiên bản 22 byte (vẫn không thành công cho 9).
Xù xì

Tôi đã đưa ra một phiên bản 20 byte đêm qua nhưng nó có cùng một vấn đề.
Shaggy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.