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.

Lω이 문제를 해결하면 좋을 것 같습니다.
— 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.