RATS序列


30

您的任务是生成RATS序列的第n个项,其中n是输入。RATS序列也称为反向先添加后排序序列。也可以在以下位置找到此序列:http : //oeis.org/A004000

测试用例:

0 > 1
1 > 2
2 > 4
3 > 8
4 > 16
5 > 77
6 > 145
7 > 668

例如,5的输出为77,因为16 + 61 =77。此后,对77进行排序。

提交时间最短者获胜。这是我的第一个挑战,所以我希望这不是重复的东西。


输入是否必须是Integer或也可以是字符串?
Denker

@DenkerAffe是指字符串形式的数字吗?
justaprogrammer

@justaprogrammer是的,因此我可以将“ 123”而不是123作为Integer。可能会节省一些字节。
Denker

2
77 + 77 = 154不是吗?还是我错过了什么?编辑:哦,是的,我忘了排序。
Denham Coote

6
@DenhamCoote我想你指的是“哦老鼠小号,我忘了排序!”
Martin Ender

Answers:


11

MATL,11 12字节

1i"tVPU+VSU

输入是一个字符串(带有单引号),表示一元整数。质询允许字符串输入,一元是有效格式

在线尝试!

说明

1      % push number 1 to the stack
i      % input. Will be a string of "n" ones 
"      % for loop: repeat n times (consumes string)
  t    %   duplicate
  V    %   convert to string
  P    %   reverse
  U    %   convert to number
  +    %   add
  V    %   convert to string
  S    %   sort
  U    %   convert to number
       % loop is implicitly ended
       % stack content is implicitly displayed    

4
我不知道是哪个让我更害怕/困惑,MATL或Jelly ... +1
Downgoat

9

05AB1E,6个字节

码:

$FDR+{

说明:

$       # Push 1 and input
 F      # For N in range(0, input)
  D     # Duplicate top of the stack
   R    # Reverse top of the stack
    +   # Add top two items
     {  # Sort top of the stack
        # Implicitly print top of the stack

这也适用于0字节程序。


@Adnan 三天前,其实。仍然表现出色……
门把手

@Doorknob准时哈哈
Adnan

19
通过消除源代码,您可以节省6个字节。
丹尼斯,

2
您也可以缩短05AB1E先消除前导零,然后省略1,如1E==E。然后,您得到5ABE-2个字节。
瑕疵的

1
@丹尼斯大观
阿德南

8

CJam,15个字节

1ri{_sW%i+s$i}*

在这里测试。

说明

1     e# Push 1 as the start of the sequence.
ri    e# Read input and convert to integer N.
{     e# Run this block N times...
  _s  e#   Duplicate and convert to string.
  W%  e#   Reverse string.
  i+  e#   Convert back to integer and add to previous value.
  s$  e#   Convert to string and sort.
  i   e#   Convert back to integer for the next iteration.
}*

3
这些语言怎么这么短
justaprogrammer

2
@justaprogrammer内置函数的单字符名称帮助。;)CJam,Pyth和Brachylog都是高尔夫语言,在设计时特别考虑了代码高尔夫。(请参阅en.wikipedia.org/wiki/Code_golf#Dedicated_golfing_languages。)然后还有APL和J之类的语言,它们根本不是高尔夫语言,但同样简洁,因为设计师认为这是一个好主意。
Martin Ender

您最推荐以下哪项来赢得此类挑战?
justaprogrammer

3
@justaprogrammer我不会根据赢得这些挑战的人选一个(可能是Pyth或Jelly)。它可以是一样的乐趣高尔夫在一个“正常”的语言(尤其是因为可能有更多的竞争该语言)。对于高尔夫语言,可能更喜欢使用它。CJam非常有趣-它是基于堆栈的,它使您比其他语言更灵活地对待自己的想法,同时,它是一种非常强大的语言,我已开始在高尔夫球场之外将其用于简单的一次性脚本,对我的生产力有很大的帮助。
Martin Ender

这些语言看起来非常有趣,我等不及要自己学。我不知道什么是果冻?那是明胶之类的吗?
justaprogrammer '16

8

Pyth,17 13 12字节

uS`+vGv_GQ\1
u        Q\1    reduce range(input()) on base case of "1" (string)
   +vG          eval the string (to get a number), and add...
      v_G       the same number, reversed first and then eval'd
 S`             convert back to string and sort

在在线解释器上尝试一下


4
这是什么魔术?这是如何运作的?
justaprogrammer

1
@justaprogrammer我添加了一个解释。:)
门把手

but,但是如何。您如何测试此代码?
justaprogrammer

1
@justaprogrammer我已经添加了一个指向在线解释器的链接,您可以在该解释器上运行代码。
门把手

这太棒了,它是如此简短,却如此美丽
justaprogrammer

5

Python 2,72

f=lambda x,n=1:x and f(x-1,int(''.join(sorted(`n+int(`n`[::-1])`))))or n

递归函数,使用Python 2的简写形式__repr__,一旦函数达到非常大的值(L将在数字的字符串后附加一个),该函数就会中断,从规范中我不确定是否可以停止,但如果不更改为,str()只会增加6个字节,但是输出为75个字节的字符串时会略短一些:

f=lambda x,n='1':x and f(x-1,''.join(sorted(str(int(n)+int(n[::-1])))))or n

这个版本上的trichoplax节省了1个字节


or第二个代码块中的之前是否有多余的空间?
trichoplax '16

1
@trichoplax,谢谢你的收获:)
FryAmTheEggman '16

5

JavaScript ES6,70个字节

由于@ user81655,节省了1个字节

f=n=>n?+[...+[...''+(b=f(n-1))].reverse().join``+b+''].sort().join``:1

感叹 JavaScript确实很冗长。甲大量代码的(> 50%)只是情况下为字符串+数组函数+加入+铸造为INT。我已经尝试了reduce,eval和各种各样的东西,但这似乎是最短的。

在线尝试(所有浏览器都可以使用)


2
就像我的一样,但更好(并在之前发布)。呸!
edc65 '16

字符串操作是JS 这么长,您对我表示慰问
MayorMonty 2016年

@ user81655太棒了,谢谢!我从没想过要重新排序
Downgoat

f=n=>n?[...+[...b=f(n-1)].reverse().join``+b+''].sort().join``:'1'如果允许返回字符串
l4m2

4

Brachylog,19个字节

0,1 .|-1=:0&Rr+R=o.

说明

0,1 .               § If Input is 0, unify the Output with 1
     |              § Else
      -1=:0&R       § unify R with the output of this main predicate, with input = Input - 1
             r+R=o. § Reverse R, add it to itself and order it, then unify with the Output.

3

Haskell,67个字节

import Data.List
g i=i:g(sort$show$read i+read(reverse i))
(g"1"!!)

用法示例:(g"1"!!) 7-> "668"

它是该定义的直接实现:从开始"1",重复添加当前元素的反向添加排序结果。主要功能(g"1"!!)选择第ith个元素。


这是70字节以下最易读的程序!
Gaurav Agarwal

3

朱莉娅77字节

n->(x=1;for _=1:n x=(p=parse)(join(sort(["$(x+p(reverse("$x")))"...])))end;x)

这是一个lambda函数,它接受一个整数并返回一个整数。要调用它,请将其分配给变量。

取消高尔夫:

function f(n::Int)
    # Begin x at 1
    x = 1

    # Repeat this process n times
    for _ = 1:n
        # Add x to itself with reversed digits
        s = x + parse(reverse("$x"))

        # Refine x as this number with the digits sorted
        x = parse(join(sort(["$s"...])))
    end

    # Return x after the process (will be 1 if n was 0)
    return x
end

3

果冻,13 12字节

我确信这可能是打高尔夫球的,因为这是我用果冻/默认语言的第一个答案。

DUḌ+ðDṢḌ Performs RATS
1Ç¡      Loops

D        Converts integer to decimal
 U       Reverses
  Ḍ      Converts back to integer
   +     Adds original and reversed
    ð    Starts new chain
     D   Converts back to decimal
      Ṣ  Sorts
       Ḍ Back to integer again

1        Uses 1 instead of input
 Ḍ       Uses line above
  ¡      For loop

编辑:由于丹尼斯,保存了1个字节


2

Java 1.8,251个字节

interface R{static void main(String[]a){int i,r,n=1,c=0,t=Byte.valueOf(a[0]);while(++c<=t){i=n;for(r=0;i!=0;i/=10){r=r*10+i%10;}n+=r;a[0]=n+"";char[]f=a[0].toCharArray();java.util.Arrays.sort(f);n=Integer.valueOf(new String(f));}System.out.print(n);}}

展开式

interface R{
static void main(String[]args){
    int input,reversed,nextValue=1,count=0,target=Byte.valueOf(args[0]);
    while(++count<=target){
        input=nextValue;
        for(reversed=0;input!=0;input/=10){reversed=reversed*10+input%10;}
        nextValue+=reversed;
        args[0]=nextValue+"";
        char[]sortMe=args[0].toCharArray();
        java.util.Arrays.sort(sortMe);
        nextValue=Integer.valueOf(new String(sortMe));
    }
    System.out.print(nextValue);
}
}

为什么使用interfaceR而不是class短4字节的R?
Will Sherwood

1
@WillSherwood,因为您随后可以省略main()上的public修饰符,从而使整体更短:)
Denham Coote

2

认真地,17个字节

1,`;$R≈+$S≈`n

在线尝试!

说明:

1,`;$R≈+$S≈`n
1              push 1
 ,`       `n   do the following n times:
   ;$R≈        reverse
       +       add
        $S≈    sort

2

Lua,179156字节

我看不到如何打更多的高尔夫球,但是我敢肯定有办法。多亏了@LeakyNun,我花了一些时间研究这个问题并以正确的方式进行了练习,通过使用另一种方法,我仍然可以赢得一些字节。

k=0z=table
for i=0,io.read()do
t={}(""..k+(""..k):reverse()):gsub("%d",function(d)t[#t+1]=d
end)z.sort(t)k=k<1 and 1or tonumber(z.concat(t,""))
end
print(k)

脱节和解释

k=0                                  
z=table                              -- z is a pointer on the table named table
                                     -- it allows me to use its functions
                                     -- while saving 4 bytes/use

for i=0,io.read()                    -- Iterate n times for the nth element
do
  t={}
  (""..a+(""..a):reverse())          -- we add k with its "reversed" value
                                     -- and convert the whole thing to a string
    :gsub(".",function(d)            -- for each character in it, use an anonymous fucntion
       t[#t+1]=d end)                -- which insert them in the array t
  z.sort(t)                          
  a=a<1 and 1 or                     -- if i==0, k=1
     tonumber(z.concat(t,""))        -- else we concat t in a string and convert it to number
end
print(k)

好吧,看来您已经不在这里了……但是也许您可以参考我的Java答案。
Leaky Nun

@LeakyNun好吧,这次我参加的次数并不多,但有时仍会遇到挑战,我会尽力看一下您的答案,但即使没有这一点,我仍然看到一些可以轻松打高尔夫球的东西(a=a<1 and 1or例如)。
Katenkyo '17

我们会很高兴–我会很高兴–让您回来。
Leaky Nun

2

Brachylog 2,11个字节,语言日期挑战

;1{↔;?+o}ⁱ⁽

在线尝试!

说明

;1{↔;?+o}ⁱ⁽
  {     }ⁱ  Repeatedly apply the following,
 1            starting at 1,
;         ⁽   a number of times equal to the input:
   ↔            reverse,
    ;?+         add the original input,
       o        then sort the resulting number

我不太清楚这对于零位数字有什么作用,但是这个问题并没有说明任何特殊的处理方式,而且它们可能也不会出现在序列中。


1

ES6,79个字节

n=>eval("r=1;while(n--)r=+[...+[...r+''].reverse().join``+r+''].sort().join``")

82个字节,不包含eval

n=>[...Array(n)].reduce(r=>+[...+[...r+''].reverse().join``+r+''].sort().join``,1)

所有这些转换都是痛苦的。

@ edc65我实际上是通过从切换mapreduce这次来保存4个字节的。。。毫无疑问,你会再次证明我错了。


for较短:n=>eval("for(r=1;n--)r=+[...+[...r+''].reverse().join``+r+''].sort().join``")
Downgoat

@Doᴡɴɢᴏᴀᴛ不适用于n=0,即使我已修复语法错误。
尼尔

1

Python 2,91字节

输入为整数,结果打印到屏幕上。

def f(n):
 t=1
 for i in range(n):t=int("".join(sorted(str(int(str(t)[::-1])+t))))
 print t

我猜想使用一些递归魔术可能会更短一些,但是我还无法解决这个问题。稍后将有新的外观,并希望对此有所改善。


1

Python 2,83字节

def f(n):
 v='1'
 for _ in v*n:v=''.join(sorted(str(int(v)+int(v[::-1]))))
 print v

1

Perl 6,40个字节

{(1,{[~] ($_+.flip).comb.sort}...*)[$_]} # 40

(如果您希望它返回一个Int,则将+权利放在前面[~]

用法:

# give it a lexical name
my &RATS = {…}

say RATS 5; # 77

# This implementation also accepts a list of indexes

# the first 10 of the sequence
say RATS ^10; # (1 2 4 8 16 77 145 668 1345 6677)


1

PHP,102字节

$r=[1];$i++<$argn;sort($v),$r[]=join($v))$v=str_split(bcadd(strrev($e=end($r)),$e));echo$r[$argn];

在线版本

PHP,95字节

n <= 39

for($r=[1];$i++<$argn;sort($v),$r[]=join($v))$v=str_split(strrev($e=end($r))+$e);echo$r[$argn];

1

Java的171个 167 163 160字节

int f(int n){int a=n>0?f(n-1):0,x=10,b[]=new int[x],c=a,d=0;for(;c>0;c/=x)d=d*x+c%x;for(a+=d;a>0;a/=x)b[a%x]++;for(;a<x;c=b[a++]-->0?c*x+--a:c);return n>0?c:1;}

在线尝试!

没有最长的条目!\ o /


@Katenkyo看到了这个
Leaky Nun

没关系f(1)... f(20)但是从f(21)的结果看来是错误的……
RosLuP

我想精度下降。
Leaky Nun


0

公理,146字节

c(r:String):NNI==reduce(+,[(ord(r.i)-48)*10^(#r-i) for i in 1..#r]);f(n:INT):NNI==(n<1=>1;v:=f(n-1);v:=v+c(reverse(v::String));c(sort(v::String)))

测试和结果[RATS顺序]

(3) -> [[i, f(i)] for i in 0..20]
   (3)
   [[0,1], [1,2], [2,4], [3,8], [4,16], [5,77], [6,145], [7,668], [8,1345],
    [9,6677], [10,13444], [11,55778], [12,133345], [13,666677], [14,1333444],
    [15,5567777], [16,12333445], [17,66666677], [18,133333444], [19,556667777],
    [20,1233334444]]

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.