数字的RTA(逆向加法)根


22

逆序加法(RTA)序列是通过在逆序上加一个数字,并对结果重复该过程而获得的序列。例如

5+5=1010+01=1111+11=2222+22=44 ...

因此,5的RTA序列包含10、11、22、44、88、176等。

数字nRTA根是等于n或在其RTA序列中加n的最小数字。nnn

例如,在RTA序列5、10、11、13、22、31等中找到44。其中5是最小的,因此RTA​​root(44)= 5。

72不是任何数字的RTA序列的一部分,因此被视为其自己的RTA根。

输入是您的语言自然可以处理的范围内的正整数。

如上所述,输出是给定数字的RTA根。

测试用例

Input
Output

44
5

72
72

132
3

143
49

1111
1

999
999

相关OEIS:A067031。输出将是此序列中的数字。

Answers:


13

Perl 6的45 44个字节

->\a{first {a∈($_,{$_+.flip}...*>a)},1..a}

在线尝试!

说明:

->\a{                                    }  # Anonymous code block
->\a     # That takes a number a
     first  # Find the first element
                                     1..a  # In the range 1 to a
           {                       },    # Where
            a       # a is an element of
              (             ...   )  # A sequence defined by
               $_,  # The first element is the number we're checking
                  {$_+.flip}  # Each element is the previous element plus its reverse
                               *>$a  # The last element is larger than a

5
每当我遇到Perl 6省略号语法时,它就会变得更加神奇。那种基于lambda的序列规范真是个好主意!
sundar-恢复莫妮卡

@sundar,该语法实际上是我进入Perl 6的主要原因之一(以及为什么一段时间后它成为我最喜欢的语言)
Ramillies

7

Brachylog24 22字节

{~{ℕ≤.&≜↔;?+}{|↰₁}|}ᶠ⌋
  • 2个字节,感谢sundar注意到我有一个{{}}

说明

                --  f(n):
                --      g(x):
 {              --          h(y):
  ~             --              get z where k(z) = y
   {            --              k(z):
    ℕ≤.         --                  z>=0 and z<=k(z) (constrain so it doesn't keep looking)
    &≜          --                  label input (avoiding infinite stuff)
      ↔;?+      --                  return z+reverse(z)
   }            --
    {           --                  
     |↰₁        --              return z and h(z) (as in returning either)
    }           --                  
  |             --          return h(x) or x (as in returning either)
 }              --
ᶠ               --      get all possible answers for g(n)
  ⌋             --      return smallest of them

抱歉,您无法解释,这是我能提出的最好的解释

在线尝试!


1
{|↰₁}那里的用法很简单但是很出色。干得好!
sundar-恢复莫妮卡

5

Haskell59 57字节

感谢user1472751 -2个字节(使用第二个until而不是list-comprehension&head)!

f n=until((n==).until(>=n)((+)<*>read.reverse.show))(+1)1

在线尝试!

说明

True对于任何RTA根,这将评估为:

(n==) . until (n<=) ((+)<*>read.reverse.show)

这个词(+)<*>read.reverse.show

\r-> r + read (reverse $ show r)

这给本身增加了一个数字。

该功能会until反复应用,(+)<*>read.reverse.show直到超出我们的目标。

将所有这些包装在另一个until开头(并以11加)(+1)将找到第一个RTA根。

如果没有适当的RTA根目录n,我们最终会到达从nuntil不应用该功能的地方n<=n


1
您也可以通过使用until外部循环来节省2个字节:TIO
user1472751 '18

5

05AB1E,7个字节

使用新版本的05AB1E(用Elixir重写)。

L.ΔλjÂ+

在线尝试!

说明

L           # Create the list [1, ..., input]
 .Δ         # Iterate over each value and return the first value that returns a truthy value for:
   λ        #   Where the base case is the current value, compute the following sequence:
     Â+     #   Pop a(n - 1) and bifurcate (duplicate and reverse duplicate) and sum them up.
            #   This gives us: a(0) = value, a(n) = a(n - 1) + reversed(a(n - 1))
    j       #   A λ-generator with the 'j' flag, which pops a value (in this case the input)
            #   and check whether the value exists in the sequence. Since these sequences will be 
            #   infinitely long, this will only work strictly non-decreasing lists.

等待.. j在递归环境中有特殊含义吗?我只知道递归环境中的穿透及其λ本身。还有更多j吗?编辑:啊,我£也在源代码中看到了一些东西。用在哪里?
Kevin Cruijssen

1
@KevinCruijssen是的,这些是在递归环境中使用的标志。j本质上检查输入值是否在序列中。£确保它返回序列的前n个值(与相同λ<...>}¹£)。
阿德南

3

果冻12 11字节

ṚḌ+ƊС€œi¹Ḣ

9991111

感谢@JonathanAllan打高尔夫球1个字节!

在线尝试!

怎么运行的

ṚḌ+ƊС€œi¹Ḣ  Main link. Argument: n

      €      Map the link to the left over [1, ..., n].
    С         For each k, call the link to the left n times. Return the array of k
               and the link's n return values.
   Ɗ           Combine the three links to the left into a monadic link. Argument: j
Ṛ                Promote j to its digit array and reverse it.
 Ḍ               Undecimal; convert the resulting digit array to integer.
  +              Add the result to j.
       œi¹   Find the first multindimensional index of n.
          Ḣ  Head; extract the first coordinate.

3

Ruby,66 57字节

f=->n{(1..n).map{|m|m+(m.digits*'').to_i==n ?f[m]:n}.min}

在线尝试!

递归函数,它反复“撤消” RTA操作,直到得出无法生成的数字,然后返回最小值。

而不是使用filter冗长的,我只是map在1到数字之间的范围内。对于此范围内的每个m,如果m + rev(m)是数字,它将在m上递归调用该函数;否则,返回n。这既消除了对a的需求,filter又免费提供了f(n)= n的基本情况。

重点包括使用以下命令保存字节Integer#digits

m.to_s.reverse.to_i
(m.digits*'').to_i
eval(m.digits*'')

最后一个要短一个字节,但是可悲的是,Ruby解析0以八进制开头的数字。



2

Pyth,12个字节

fqQ.W<HQ+s_`

查看测试套件!

出人意料的快速和高效。所有测试用例一次运行不到2秒。

怎么运行的

fqQ.W<HQ+s_` – Full program. Q is the variable that represents the input.
f            – Find the first positive integer T that satisfies a function.
   .W        – Functional while. This is an operator that takes two functions A(H)
               and B(Z) and while A(H) is truthy, H = B(Z). Initial value T.
     <HQ     – First function, A(H) – Condition: H is strictly less than Q.
        +s_` – Second function, B(Z) – Modifier.
         s_` – Reverse the string representation of Z and treat it as an integer.
        +    – Add it to Z.
             – It should be noted that .W, functional while, returns the ending
               value only. In other words ".W<HQ+s_`" can be interpreted as
               "Starting with T, while the current value is less than Q, add it
               to its reverse, and yield the final value after the loop ends".
 qQ          – Check if the result equals Q.

2

05AB1E,13个字节

LʒIFDÂ+})Iå}н

在线尝试!

说明

L               # push range [1 ... input]
 ʒ         }    # filter, keep elements that are true under:
  IF   }        # input times do:
    D           # duplicate
     Â+         # add current number and its reverse
        )       # wrap in a list
         Iå     # check if input is in the list
            н   # get the first (smallest) one

聪明!我知道我的21个字节的版本已经太长了(我已经用相同的方法将其压缩到16个字节),但是无法真正找到一种使它更短的方法。不敢相信我没有考虑过在过滤器之后使用head。.我一直尝试使用循环索引+1,或global_counter..>。>
Kevin Cruijssen

2

JavaScript(ES6),61个字节

n=>(g=k=>k-n?g(k>n?++x:+[...k+''].reverse().join``+k):x)(x=1)

在线尝试!

已评论

n =>                        // n = input
  (g = k =>                 // g() = recursive function taking k = current value
    k - n ?                 //   if k is not equal to n:
      g(                    //     do a recursive call:
        k > n ?             //       if k is greater than n:
          ++x               //         increment the RTA root x and restart from there
        :                   //       else (k is less than n):
          +[...k + '']      //         split k into a list of digit characters
          .reverse().join`` //         reverse, join and coerce it back to an integer
          + k               //         add k
      )                     //     end of recursive call
    :                       //   else (k = n):
      x                     //     success: return the RTA root
  )(x = 1)                  // initial call to g() with k = x = 1

2

05AB1E21 16 15 字节

G¼N¹FÂ+йQi¾q]¹

-1个字节感谢@Emigna

在线尝试。

说明:

G               # Loop `N` in the range [1, input):
 ¼              #  Increase the global_counter by 1 first every iteration (0 by default)
 N              #  Push `N` to the stack as starting value for the inner-loop
  ¹F            #  Inner loop an input amount of times
    Â           #   Bifurcate (short for Duplicate & Reverse) the current value
                #    i.e. 10 → 10 and '01'
     +          #   Add them together
                #    i.e. 10 and '01' → 11
      Ð         #   Triplicate that value
                #   (one for the check below; one for the next iteration)
       ¹Qi      #   If it's equal to the input:
          ¾     #    Push the global_counter
           q    #    And terminate the program
                #    (after which the global_counter is implicitly printed to STDOUT)
]               # After all loops, if nothing was output yet:
 ¹              # Output the input

由于隐式打印,您不需要打印。
Emigna

1

木炭,33字节

Nθ≔⊗θηW›ηθ«≔L⊞OυωηW‹ηθ≧⁺I⮌Iηη»ILυ

在线尝试!链接是详细版本的代码。说明:

Nθ

输入项 q

≔⊗θη

分配 2qH 这样循环就开始了。

W›ηθ«

重复一会儿 H>q

≔L⊞Oυωη

将虚拟的null字符串推送到 ü 从而增加其长度,并将结果长度分配给 H;

W‹ηθ

重复一会儿 H<q

≧⁺I⮌Iηη

添加相反的 HH

»ILυ

打印最终长度 ü 这是所需的根。


1

MATL,17个字节

`@G:"ttVPU+]vG-}@

在线尝试!

说明

`         % Do...while loop
  @       %   Push iteration index, k (starting at 1)
  G:"     %   Do as many times as the input
    tt    %     Duplicate twice
    VPU   %     To string, reverse, to number
    +     %     Add
  ]       %   End
  v       %   Concatenate all stack into a column vector. This vector contains
          %   a sufficient number of terms of k's RTA sequence
  G-      %   Subtract input. This is used as loop condition, which is falsy
          %   if some entry is zero, indicating that we have found the input
          %   in k's RTA sequence
}         % Finally (execute on loop exit)
  @       %   Push current k
          % End (implicit). Display (implicit)

1
顺便提一句,我使用MATL来生成测试用例输出,使用的是这31个字节的版本::!`tG=~yV2&PU*+tG>~*tXzG=A~]f1) 在线尝试!
sundar-恢复莫妮卡

1

Java 8,103字节

n->{for(int i=0,j;;)for(j=++i;j<=n;j+=n.valueOf(new StringBuffer(j+"").reverse()+""))if(n==j)return i;}

在线尝试。

说明:

n->{                // Method with Integer as both parameter and return-type
  for(int i=0,j;;)  //  Infinite loop `i`, starting at 0
    for(j=++i;      //  Increase `i` by 1 first, and then set `j` to this new `i`
        j<=n        //  Inner loop as long as `j` is smaller than or equal to the input
        ;           //    After every iteration:
         j+=        //     Increase `j` by:
            n.valueOf(new StringBuffer(j+"").reverse()+""))
                    //     `j` reversed
     if(n==j)       //   If the input and `j` are equal:
       return i;}   //    Return `i` as result

算术地将整数反转1个字节(104个字节):

n->{for(int i=0,j,t,r;;)for(j=++i;j<=n;){for(t=j,r=0;t>0;t/=10)r=r*10+t%10;if((j+=r)==n|i==n)return i;}}

在线尝试。


1

C(GCC) 120个 100 99字节

f(i,o,a,b,c,d){for(a=o=i;b=a;o=i/b?a:o,a--)for(;b<i;b+=c)for(c=0,d=b;d;d/=10)c=c*10+d%10;return o;}

在线尝试!

给定输入i,检查从i到0的每个整数是否包含序列i

  • i 是输入值
  • o 是输出值(到目前为止找到的最小根)
  • a 是正在检查的当前整数
  • ba的序列的当前元素
  • cd用于增加b其反向

编译-DL=for将为您节省2个字节。

从头开始;数学做错了。

但是,i=o;如果使用-O0,则可以返回输出值,这样可以节省5个字节。

1

Japt16 15 11字节

@ÇX±swÃøU}a

试试吧

@ÇX±swÃøU}a     :Implicit input of integer U
@        }a     :Loop over the positive integers as X & output the first that returns true
 Ç              :  Map the range [0,U)
  X±            :    Increment X by
    sw          :    Its reverse
      Ã         :  End map
       øU       :  Contains U?


0

C(gcc),89个字节

我运行[1,n)中的每个序列,直到获得匹配;零是特殊情况,因为它不会终止。

j,k,l,m;r(i){for(j=k=0;k-i&&++j<i;)for(k=j;k<i;k+=m)for(l=k,m=0;l;l/=10)m=m*10+l%10;j=j;}

在线尝试!

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.