9로 수렴합시다!


21

정수 주어 N> 2 인쇄하거나 가장 작은 음이 아닌 정수 리턴 K 되도록 A (N, K) = 9 , A는 (N, K)은 에 의해 정의된다 :

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n , k) 가 짝수이면 a (n, k) / 2 + 1
    • a (n, k) 가 홀수 인 경우 a (n, k) ² (10 진법 ) 의 자릿수 합계

들면 N = 5 , 예상 출력은 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)

들면 N = 40 , 예상 출력은 K = 2 :

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

설명 및 규칙

  • 입력은 2보다 커야합니다.
  • 프로그램은 이론적으로 n 값에 대해 작동해야합니다 . 실제로는 언어에서 지원하는 최대 정수 크기에 의해 제한 될 수 있습니다.
  • k 는 0- 인덱싱되거나 1- 인덱싱 될 수있다. 귀하의 답변에 기재하십시오.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

첫 번째 값

아래에 제 값인 N = 3 에 대한 N = 422 로, K 0 인덱스는. 1- 인덱싱의 경우이 1값에 추가하십시오 .

 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
제목에 의무적 인 nitpick :9! ≠ 9
JungHwan Min

1
멋진 순서. 이걸 직접 발견 했습니까?
Robert Fraser

@RobertFraser 내가했지만 비슷한 시퀀스가 어딘가에 있다고 확신합니다 (찾을 수는 없지만 검색하는 데 많은 시간을 소비하지 않았습니다).
Arnauld

Collatz 추측 후, Arnauld의 추측! 무엇 향후 계획?
sergiol

@sergiol에 따르면 lmgtfy.com/?q=conjecture 추측이며an opinion or conclusion formed on the basis of incomplete information.
로마 그라프

답변:


6

껍질 , 13 바이트

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

이것은 1 인덱스입니다. 온라인으로 사용해보십시오!

설명

여기서 너무 멋진 것은 없습니다.

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

이 문제를 해결하면 좋을 것 같습니다.
H.PWiz September

10

Perl 6 , 41 바이트 (40 자)

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

온라인으로 사용해보십시오!

이것은 k의 1- 인덱싱을 사용하므로 OP의 예보다 1 더 높은 답변을 제공합니다. 이것이 1 인덱싱의 의미가 아닌 경우 1 바이트를 더 추가해야합니다.

설명 : 익명의 기능입니다. 우리는 재귀 :—)를 사용하여 목록을 생성하기 위해 Perl 6의 기능을 사용합니다. 다음과 같이 보입니다 : (first element),(block that takes the previous element and gives the next)...(end condition). 이 경우 첫 번째 요소는 $_(주 함수의 인수)이고 종료 조건은 9(우리가 9를 생성 할 때 채워짐)입니다. 중간 블록에서 $_인수 (= 시퀀스의 이전 요소)를 참조하는 데 사용 합니다. 는 ?? !!(더 잘 알려진 기존의 삼항 연산자입니다 ? :). 마지막으로, 우리는 숫자 문맥을로하여이리스트의 길이를 취합니다 +(...).

마지막으로 이상한 것은 자릿수입니다. 숫자는 Cool(문자열과 숫자처럼 작동합니다) 따라서 (문자 목록 = 숫자 제공) .comb에 문자열 방법 을 사용한 $_²다음 문자를 추가하여 숫자로 다시 변환합니다.


예, 이것이 1- 인덱싱의 의미입니다.
Arnauld

7

젤리 , 17 바이트

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

온라인으로 사용해보십시오!

직접적인 접근. 0 기반 인덱싱을 사용합니다.

설명

²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 덕분에, 조건이 있었다 do-while n != 9대신의while n!= 9
마일

7

파이썬 (2) , 129 (126) 76 68 67 64 54 53 바이트

Jonathan Frech 덕분에 -3 바이트 Maltysen 덕분에 -8 바이트 Jonathan Allan 덕분에 -7 바이트 Mr. Xcoder 덕분에 -1 바이트.

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

온라인으로 사용해보십시오!

아마도 충분한 수학을 모른다는 누군가로부터, 이것은 완전히 임의적 인 것 같습니다. :피


1
로 교체 )%2and sum하여 )%2*sum3 바이트를 절약 할 수 있습니다 .
Jonathan Frech

1
파이썬 3에 대한 이유가 있습니까? 그렇지 않으면 U는 str repr에``를 사용할 수 있습니다
Maltysen


8
몇 분 전에 이것이 어떻게 작동하는지 완전히 잃어 버렸습니다. > _ <
완전히 인간적인


6

수학, 58 바이트

1- 색인

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

온라인으로 사용해보십시오! (Mathics에서 작업하기 위해으로 Tr교체 됨 Total)

여기 @JungHwanMin의 -1 바이트 버전입니다 (그러나 수학 에서는 작동하지 않으므로 둘 다 유지했습니다)

매스 매 티카, 57 바이트

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

1
-1 바이트 : 2∣#대신 OddQ@#두 개의 표현식을 대신 사용하십시오 If.
JungHwan Min

6

자바 스크립트 (ES6), 59 50 바이트

인덱스가 0입니다.

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

시도 해봐

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>


설명

우리가 가장 먼저하는 일은 계산 n-9입니다. 그렇다면 n==9그것은 분명히 포기 0하고 일이 멈 춥니 다. 만약n!=9 그렇다면 n-9, 0이 아닌 값을 주면, 진실하다는 것은 우리가 논리적 인 AND를 통해 계속할 수 있음을 의미합니다. n다음과 같이 계산 하여 함수를 다시 호출하여 새 함수를 전달 합니다.

n%2?

만약 n모듈로 2가 진실한 , 즉 n홀수입니다.

[...""+n*n]

n자체적으로 곱하면 문자열로 변환하고 해당 문자열을 개별 문자 (숫자) 배열로 구조화합니다.

 .join`+`

다음을 사용하여 문자를 문자열에 다시 결합 + 수학 표현식을 제공하십시오.

eval(                   )

그 표현을 평가하여 n*n .

:n/2+1

n%2거짓 인 경우 (즉, n짝수 인 경우) 간단히 나누기n 하여 2추가합니다 1.

함수를 다시 호출 한 결과에을 추가 1합니다. 따라서 초기 입력을 사용 5하면 프로세스는 다음과 같습니다.

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

젤리 ,  16  15 바이트

마일로 인한 -1 바이트 (삼항 if 사용)

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

숫자를 가져오고 리턴하는 모나드 링크.
1- 색인

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오(결과가 0으로 색인 작성되고 OP 코드 블록과 같은 형식으로 강제 변환 됨)

방법?

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

내가 사용한 if 문을 while 루프와 결합하여 바이트를 저장할 수 있다고 생각합니다. ²DSµH‘$Ḃ?n9$пL
마일



2

05AB1E , 16 바이트

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

온라인으로 사용해보십시오!

설명

[                  # 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 (가져 오기) = 117 바이트

필요 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

n정수 입력으로 받아 0 기반을 반환하는 함수입니다 k.

언 골프 드 :

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

Pyth ,  23  22 바이트

지금은 재귀 함수 이지만 .W바이트를 절약하기 위해 (기능적 while)으로 전환하려고합니다 .

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

여기 사용해보십시오! (공백없이함수를 호출하는 추가 코드 사용)y<your_number>


1

자바 8, 110 98 바이트

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 인덱스

설명:

여기에서 시도하십시오.

 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 바이트

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

온라인으로 사용해보십시오!

설명

(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

Pyth, 18 바이트

tl.u?%N2sj*NNTh/N2

온라인으로 사용해보십시오 : 데모

설명:

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

apt, 22 21 바이트

인덱스가 0입니다.

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

시도 해봐


설명

정수의 묵시적 입력 U.

UÆ             Ã

에서 정수 배열을 생성 0하는 U-1과 기능을 각각 통과한다.

=

의 값을 설정하십시오 U.

v ?

U2로 나눌 수있는 경우

U/2Ä

U2와 1을 더한 값 ( Ä)

:U²ìx

그렇지 않으면 U2의 제곱 ( ²)으로 자릿수 ( ì)로 나누고 더하기 ( x)로 줄입니다.

Nc

결과 배열을 입력 배열에 추가합니다.

b9

9배열에서 처음 나타나는 색인을 찾으십시오 . 암시 적으로 결과를 출력합니다.


댕 함수 메소드를 사용하는 것이 훨씬 나아질 것 같은 느낌이 들었지만 23 바이트로 줄 @¥9}a@=u ?U²ìx :U/2Ä;°T였습니다. 값이 변경을 멈출 때까지 반복 횟수를 반환하는 메소드 만 있다면 ...
ETHproductions

@ETHproductions : 0 대신 9에 1을 출력하지만 22 바이트 버전이 있습니다 (여전히 9에 실패합니다).
얽히고 설킨

나는 지난 밤에 20 바이트 버전을 생각해 냈지만 같은 문제가있었습니다.
얽히고 설킨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.