让我们收敛到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 = 3n = 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
JungHwan Min

1
很酷的顺序。您自己发现了吗?
罗伯特·弗雷泽

@RobertFraser我做到了,但是我确定类似的序列存在于某个地方(我找不到一个序列,但是我没有花太多时间进行搜索。)
Arnauld

在Collat​​z猜想之后,就是Arnauld的猜想!下一步是什么?
sergiol

@sergiol根据lmgtfy.com/?q=conjecture一个猜想an opinion or conclusion formed on the basis of incomplete information.
罗马格拉夫

Answers:


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索引的含义,那么我将不得不再增加1个字节。

说明:这是一个匿名函数。我们只使用Perl 6的功能来使用递归:-)生成列表。它看起来像这样:(first element),(block that takes the previous element and gives the next)...(end condition)。在这种情况下,第一个元素是$_(main函数的参数),结束条件是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谢谢,条件是a do-while n != 9而不是a while n!= 9
英里

7

Python 2中129 126 76 68 67 64个 54个 53字节

-3个字节,感谢Jonathan Frech。-8字节,感谢Maltysen。-7个字节感谢Jonathan Allan。-1个字节感谢Xcoder先生。

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

在线尝试!

对于可能不太了解数学的人来说,这似乎是完全武断的。:P


1
您可以更换)%2and sum)%2*sum,节省3个字节。
乔纳森·弗雷希

1
python 3有理由吗?否则,您可以将`用作str repr
Maltysen

1
您可以k完全摆脱并保存另外七个字节
Jonathan Allan

8
我要承认,几分钟前我完全不了解它是如何工作的。> _ <
totallyhuman人类


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@#和交换的两个表达式If
JungHwan Min

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!=9那么n-9将给出一个非零值,这是真实的,这意味着我们可以继续进行逻辑与。我们再次调用该函数,n并向其传递一个新值,其计算方式如下:

n%2?

如果取n2为真-即为n奇数。

[...""+n*n]

n自身相乘,将其转换为字符串,然后将该字符串解构为单个字符(数字)的数组。

 .join`+`

使用+,将字符重新连接为字符串,从而给出一个数学表达式。

eval(                   )

计算该表达式,得出的位数之和n*n

:n/2+1

如果n%2是falsey(即,n为偶数)然后我们只需划分n2,并添加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字节归功于英里(如果使用三进制则使用)

²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
英里

4

Haskell,62个 59字节

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

在线尝试!

编辑:-3个字节,感谢@ØrjanJohansen。


1
last$x:[y|odd a]可以缩短为cycle[x,y]!!a
与Orjan约翰森


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

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

试试吧


说明

整数的隐式输入U

UÆ             Ã

0to 生成一个整数数组,U-1并将每个整数传递给一个函数。

=

设置的值U

v ?

如果U被2整除。

U/2Ä

U除以2,再加上1(Ä)。

:U²ìx

否则:U以2(²)的幂为单位,拆分为一个数字数组(ì),然后通过加法(x)进行缩减。

Nc

将结果数组追加到输入数组。

b9

查找9数组中第一次出现的索引。隐式输出结果。


ang 我有使用功能的方法将是一个很大更好的感觉,但我只得到它归结为23个字节:@¥9}a@=u ?U²ìx :U/2Ä;°T要是有一个返回迭代次数的方法,直到值停止变化...
ETHproductions

@ETHproductions:输出1表示9而不是0,但这是22字节的版本(9仍然失败)。
毛茸茸的

昨晚我确实提出了一个20字节的版本,但是它有同样的问题。
毛茸茸的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.