9に収束しましょう!


21

整数n> 2が与えられた場合、a(n、k)= 9である最小の非負整数kを出力または返します。ここで、a(n、k)は次のように定義されます。

  • a(n、0)= n
  • a(n、k + 1)=
    • (N、K)/ 2 + 1であれば(N k)が偶数であります
    • 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
タイトルの必須の選択:9! ≠ 9
ジョンファンミン

1
クールなシーケンス。これを自分で発見しましたか?
ロバートフレイザー

@RobertFraserしましたが、どこかに同様のシーケンスが存在するはずです(1つは見つかりませんでしたが、検索にあまり時間をかけませんでした)
Arnauld

Collat​​zの予想の後、Arnouldの予想!次は何ですか?
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

10

Perl 6、41バイト(40文字)

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

オンラインでお試しください!

これはkの1インデックスを使用するため、OPの例よりも1高い答えが得られます。これが1-indexingの意味ではない場合、1バイトを追加する必要があります。

説明:これは匿名関数です。再帰を使用してリストを生成するには、Perl 6の機能を使用します:—)。次のようになります(first element),(block that takes the previous element and gives the next)...(end condition)。この場合、最初の要素は$_(メイン関数の引数)であり、終了条件は9(9を生成するときに満たされます)です。中央のブロックでは$_、引数(=シーケンスの前の要素)を参照するために使用します。?? !!(より良いとして知られている古い三項演算子です? :)。最後に、数値コンテキストをで強制することにより、このリストの長さを取得し+(...)ます。

ここで最後の奇妙なことは、数字の合計です。数字はCool(文字列と数字の両方のように振る舞う)ので.comb$_²(文字のリスト=数字を与える)で文字列メソッドを使用し、次に文字を加算します(数字に変換します)。


はい、これが1インデックスの意味です。
アーナルド

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

パイソン2129 126 76 68 67 64の 54の 53バイト

Jonathan Frechのおかげで-3バイト。Maltysenのおかげで-8バイト。ジョナサン・アランのおかげで-7バイト。Xcoder氏のおかげで-1バイト。

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

オンラインでお試しください!

おそらく十分な数学を知らない人からは、これは完全にarbitrary意的なようです。:P


1
に置き換え)%2and sum)%2*sum、3バイト節約できる場合があります。
ジョナサン

1
Python 3の理由はありますか?それ以外の場合はuがSTRのreprのために`使用することができます
Maltysen

1
あなたは取り除くことができk、完全にと別の7バイトの保存
ジョナサン・アラン・

8
告白しますが、数分前にこれがどのように機能するか完全に見失いました。> _ <
完全に人間


6

Mathematica、58バイト

1インデックス付き

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

オンラインでお試しください!(数学で動作するため、Trに置き換えられ ますTotal

ここは@JungHwanMinによる -1バイトバージョンです(ただし、数学では動作しないため、両方を保持しました)

Mathematica、57バイト

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

1
-1バイト:の2∣#代わりに使用しOddQ@#、の2つの式を交換しIfます。
ジョンファンミン

6

JavaScript(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!=9n-9ゼロ以外の値が返されますが、これは真実であるため、論理ANDを続行できます。n次のように計算された新しい関数を渡して、関数を再度呼び出します。

n%2?

nモジュロ2が真実である場合-すなわち、n奇数です。

[...""+n*n]

nそれ自体で乗算し、それを文字列に変換し、その文字列を個々の文字(数字)の配列に分解します。

 .join`+`

を使用して文字を文字列に再結合し+、数式を提供します。

eval(                   )

その式を評価して、の数字の合計を求めますn*n

:n/2+1

場合n%2(つまり、falseyで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バイト(3値の場合)

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

whileループで使用したif文を組み合わせて1バイト節約できると思います。²DSµH‘$Ḃ?n9$пL
マイル




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

Java 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

Japt、22 21バイト

0インデックス。

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

それを試してみてください


説明

integerの暗黙的な入力U

UÆ             Ã

0to から整数の配列を生成し、U-1それぞれを関数に渡します。

=

の値を設定しますU

v ?

Uが2で割り切れる場合。

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.