33
\$\begingroup\$

Your task is to generate the nth term of the RATS sequence, where n is the input. The RATS sequence is also known as the Reverse Add Then Sort sequence. This sequence can also be found here: http://oeis.org/A004000.

test cases:

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

For example, the output for 5 is 77 because 16 + 61 = 77. After this the 77 is sorted.

Shortest submission wins. This is my first challenge so i hope this is not a duplicate or something.

\$\endgroup\$
6
  • \$\begingroup\$ Does the input have to be an Integer or could it also be a string? \$\endgroup\$
    – Denker
    Jan 31, 2016 at 15:36
  • \$\begingroup\$ @DenkerAffe do you mean a number in the form of a string? \$\endgroup\$ Jan 31, 2016 at 15:37
  • \$\begingroup\$ @justaprogrammer Yea, so I can get "123" instead of 123 as Integer. Would mayve save some bytes. \$\endgroup\$
    – Denker
    Jan 31, 2016 at 15:40
  • 2
    \$\begingroup\$ isn't 77+77=154? Or have I missed something? EDIT: Oh, yes, I forgot to sort. \$\endgroup\$ Feb 1, 2016 at 10:48
  • 7
    \$\begingroup\$ @DenhamCoote I think you meant "oh rats, I forgot to sort!" \$\endgroup\$ Feb 2, 2016 at 10:49

33 Answers 33

12
\$\begingroup\$

MATL, 11 12 bytes

1i"tVPU+VSU

Input is a string (with single quotes) representing an integer in unary. String input is allowed by the challenge, and unary is a valid format.

Try it online!

Explanation

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    
\$\endgroup\$
1
  • 4
    \$\begingroup\$ I don't know which scares/perplexes me more, MATL or Jelly... +1 \$\endgroup\$
    – Downgoat
    Jan 31, 2016 at 19:00
10
\$\begingroup\$

05AB1E, 6 bytes

Code:

$FDR+{

Explanation:

$       # 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

This also works with a 0 byte program.

\$\endgroup\$
12
  • \$\begingroup\$ @Adnan Three days ago, actually. Still, well played... \$\endgroup\$
    – Doorknob
    Jan 31, 2016 at 19:23
  • \$\begingroup\$ @Doorknob Just in time haha \$\endgroup\$
    – Adnan
    Jan 31, 2016 at 19:28
  • 24
    \$\begingroup\$ You can save 6 bytes by eliminating your source code. \$\endgroup\$
    – Dennis
    Jan 31, 2016 at 21:00
  • 2
    \$\begingroup\$ You can also shorten 05AB1E by first eliminating the leading zero, and then omitting the 1, as 1E==E. Then you get just 5ABE, -2 bytes. \$\endgroup\$
    – flawr
    Jan 31, 2016 at 23:49
  • 1
    \$\begingroup\$ @Dennis great observation \$\endgroup\$
    – Adnan
    Feb 1, 2016 at 20:48
9
\$\begingroup\$

Pyth, 17 13 12 bytes

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

Try it on the online interpreter.

\$\endgroup\$
5
  • 4
    \$\begingroup\$ What is this magic? How does this work? \$\endgroup\$ Jan 31, 2016 at 15:42
  • 1
    \$\begingroup\$ @justaprogrammer I've added an explanation. :) \$\endgroup\$
    – Doorknob
    Jan 31, 2016 at 16:00
  • \$\begingroup\$ Huh, but how. How do you test this code? \$\endgroup\$ Jan 31, 2016 at 16:02
  • 1
    \$\begingroup\$ @justaprogrammer I've added a link to an online interpreter that you can run the code on. \$\endgroup\$
    – Doorknob
    Jan 31, 2016 at 16:06
  • \$\begingroup\$ This is awesome, it is so short, yet so beautiful \$\endgroup\$ Jan 31, 2016 at 16:11
8
\$\begingroup\$

CJam, 15 bytes

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

Test it here.

Explanation

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.
}*
\$\endgroup\$
6
  • 3
    \$\begingroup\$ how can all these languages be so short \$\endgroup\$ Jan 31, 2016 at 15:52
  • 2
    \$\begingroup\$ @justaprogrammer Single-character names for built-in functions help. ;) CJam, Pyth and Brachylog are all golfing languages, specifically designed with code golf in mind. (See en.wikipedia.org/wiki/Code_golf#Dedicated_golfing_languages.) Then there's also languages like APL and J that aren't golfing languages at all but are similarly terse, because the designers thought it would be a good idea. \$\endgroup\$ Jan 31, 2016 at 15:54
  • \$\begingroup\$ Which one do you recommend the most for winning challenges like these? \$\endgroup\$ Jan 31, 2016 at 16:03
  • 3
    \$\begingroup\$ @justaprogrammer I wouldn't pick one based on which one is winning these challenges (that would likely be Pyth or Jelly). It can be just as fun to golf in a "normal" language (especially because there might be more competition within that language). For a golfing language, it's probably more important that you enjoy using it. CJam is quite fun - it's a stack-based which makes you bend your mind a bit more than other languages, and at the same time it's quite a powerful language, that I've started to use for simple throwaway scripts outside of golf, which is a good boost to my productivity. \$\endgroup\$ Jan 31, 2016 at 16:07
  • \$\begingroup\$ These languages look very interesting and I can't wait to learn one myself. I don't know what jelly is? Is that some kind of gelatine or something? \$\endgroup\$ Jan 31, 2016 at 16:23
6
\$\begingroup\$

Python 2, 72

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

Recursive function, makes use of the Python 2 shorthand for __repr__, which will break once the function reaches very large values (an L will be appended to the number's string), I'm not certain from the spec if there is a place where we can stop, but if not changing to str() only adds 6 bytes, but then it becomes slightly shorter to output as a string, at 75 bytes:

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

1 byte saved thanks to trichoplax on this version

\$\endgroup\$
2
  • \$\begingroup\$ Is that a surplus space before the or in the second code block? \$\endgroup\$ Feb 1, 2016 at 2:09
  • 1
    \$\begingroup\$ @trichoplax thanks for the catch :) \$\endgroup\$ Feb 1, 2016 at 2:21
6
\$\begingroup\$

JavaScript ES6, 70 bytes

Saved 1 byte thanks to @user81655

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

sigh JavaScript is really verbose. A lot (> 50%) of the code is just case to string + array function + join + cast to int. I've tried reduce, eval, and all sorts of stuff but this seems to be the shortest.

Try it online (All browsers work)

\$\endgroup\$
4
  • 2
    \$\begingroup\$ Just like mine, but better (and posted earlier). Bah! \$\endgroup\$
    – edc65
    Jan 31, 2016 at 16:04
  • \$\begingroup\$ String Manipulation is JS is so long, you have my condolences \$\endgroup\$
    – bren
    Jan 31, 2016 at 18:24
  • \$\begingroup\$ @user81655 cool, thanks! I would of never thought to re-order that way \$\endgroup\$
    – Downgoat
    Feb 1, 2016 at 3:17
  • \$\begingroup\$ f=n=>n?[...+[...b=f(n-1)].reverse().join``+b+''].sort().join``:'1' if returning string allowed \$\endgroup\$
    – l4m2
    Apr 26, 2018 at 3:47
5
\$\begingroup\$

Brachylog, 19 bytes

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

Explanation

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.
\$\endgroup\$
4
\$\begingroup\$

Haskell, 67 bytes

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

Usage example: (g"1"!!) 7-> "668".

It's a direct implementation of the definition: starting with "1", repeatedly append the reverse-add-sort result of the current element. The main function (g"1"!!) picks the ith element.

\$\endgroup\$
1
  • \$\begingroup\$ This is the most readable program under 70 bytes! \$\endgroup\$ Feb 1, 2016 at 23:54
4
\$\begingroup\$

Julia, 77 bytes

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

This is a lambda function that accepts an integer and returns an integer. To call it, assign it to a variable.

Ungolfed:

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
\$\endgroup\$
4
\$\begingroup\$

Jelly, 13 12 bytes

I'm sure this can probably be golfed, as this is my first answer in Jelly/in a tacit language.

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

EDIT: Saved 1 byte, thanks to Dennis

\$\endgroup\$
3
\$\begingroup\$

Perl 6, 40 bytes

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

( If you want it to return an Int put a + right before [~] )

Usage:

# 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)
\$\endgroup\$
3
\$\begingroup\$

Java 1.8, 251 bytes

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);}}

Expanded

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);
}
}
\$\endgroup\$
2
  • \$\begingroup\$ Why do you use interface R instead of class R which is 4 bytes shorter? \$\endgroup\$ Feb 2, 2016 at 5:04
  • 2
    \$\begingroup\$ @WillSherwood because you can then omit the public modifier on main(), making it shorter overall :) \$\endgroup\$ Feb 2, 2016 at 8:08
3
\$\begingroup\$

Seriously, 17 bytes

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

Try it online!

Explanation:

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

Lua, 179 156 Bytes

I can't see how I could golf it more, but I'm sure there's a way. Thanks to @LeakyNun I took the time to come down on this and golf it the proper way, I could maybe still win some bytes by using another approach.

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)

Ungolfed and explanations

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)
\$\endgroup\$
3
  • \$\begingroup\$ Well it looks like you aren't here anymore... but maybe you can refer to my java answer. \$\endgroup\$
    – Leaky Nun
    May 2, 2017 at 11:10
  • \$\begingroup\$ @LeakyNun Well, I'm not participating a lot this times but still peaking at challenges from time to times, I'll try to take a look at your answer, but even without that I see some thing that can be golfed pretty easily (a=a<1 and 1or for instance). \$\endgroup\$
    – Katenkyo
    May 3, 2017 at 20:07
  • \$\begingroup\$ we would be glad – I would be glad – to have you back. \$\endgroup\$
    – Leaky Nun
    May 4, 2017 at 1:54
3
\$\begingroup\$

Brachylog 2, 11 bytes, language postdates challenge

;1{↔;?+o}ⁱ⁽

Try it online!

Explanation

;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

I'm not quite clear on what this does with zero digits, but the question doesn't state any particular handling, and they probably don't appear in the sequence anyway.

\$\endgroup\$
3
\$\begingroup\$

Husk, 10 bytes

!¡ödOdS+↔1

Try it online!

1-indexed.

\$\endgroup\$
3
\$\begingroup\$

Python 2, 70 66 bytes

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

Try it online!

\$\endgroup\$
2
\$\begingroup\$

ES6, 79 bytes

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

82 bytes without eval:

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

All those conversions are painful.

@edc65 I actually saved 4 bytes by switching from map to reduce this time... no doubt you'll prove me wrong again though.

\$\endgroup\$
2
  • \$\begingroup\$ for is shorter: n=>eval("for(r=1;n--)r=+[...+[...r+''].reverse().join``+r+''].sort().join``") \$\endgroup\$
    – Downgoat
    Jan 31, 2016 at 16:01
  • \$\begingroup\$ @Doᴡɴɢᴏᴀᴛ Doesn't work for n=0, even after I've fixed the syntax errors. \$\endgroup\$
    – Neil
    Jan 31, 2016 at 16:03
2
\$\begingroup\$

Python 2, 91 Bytes

Input as Integer, result is printed to the screen.

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

This could be a lot shorter with some recursion magic I guess, but I cant wrap my head around it yet. Gonna have a fresh look later and hopefully improve this one.

\$\endgroup\$
2
\$\begingroup\$

Python 2, 83 bytes

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

Mathematica 10.3, 66 61 bytes

Nest[FromDigits@Sort@IntegerDigits[#+IntegerReverse@#]&,1,#]&

Quite simple.

\$\endgroup\$
0
2
\$\begingroup\$

PHP, 102 Bytes

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

Online Version

PHP, 95 Bytes

n <= 39

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

Java, 171 167 163 160 bytes

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;}

Try it online!

Not the longest entry! \o/

\$\endgroup\$
3
  • \$\begingroup\$ @Katenkyo see this \$\endgroup\$
    – Leaky Nun
    May 7, 2017 at 14:46
  • \$\begingroup\$ It is ok f(1)...f(20) But from f(21) result seems wrong... \$\endgroup\$
    – user58988
    May 7, 2017 at 18:42
  • \$\begingroup\$ Loss of precision I suppose. \$\endgroup\$
    – Leaky Nun
    May 7, 2017 at 18:43
2
\$\begingroup\$

K (oK), 20 bytes

{x{.o@<o:$x+.|$x}/1}

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Scala, 56 bytes

Stream.iterate("1"){p=>p.toInt+p.reverse.toInt+""sorted}

Try it online!

An infinite stream.

\$\endgroup\$
2
\$\begingroup\$

cQuents, 9 bytes

=1:sZ+\rZ

Try it online!

1-indexed.

Explanation

=1            first term is 1
  :           sequence mode
              each term equals
   s                           sort(                                   )
    Z                                previous
     +                                        plus
      \r                                           reverse(          )
        Z                                                   previous
\$\endgroup\$
2
\$\begingroup\$

Perl 5 -a, 51 bytes

$.=join'',sort(($.+reverse$.)=~/./g)while$_--;say$.

Try it online!

\$\endgroup\$
1
2
\$\begingroup\$

Vyxal, 7 5 bytes

1?(ms

Try it Online!

Explained

1?(ms

1?          # Push 1 followed by the input
  (         # for n in range(0, input):
    m       #   push tos + tos[::-1] (palindromize on integers doesn't make it a palindrome)
     +s     #   add and sort the result

It's a shame how in order to remain competitive, one has to port other answers. Why do I say this? Because I have a nifty 21 byte function that accomplishes the same task:

@f:1|0=[1|n⨪@f;:ʼn+]s;

Example usage:

6 @f; , # Single number
0 11 r °f; z # Provide a test case unit kinda display
\$\endgroup\$
7
  • \$\begingroup\$ what does ʼn do? \$\endgroup\$
    – Razetime
    Nov 11, 2020 at 5:56
  • \$\begingroup\$ @Razetime it reverses the top of the stack \$\endgroup\$
    – lyxal
    Nov 11, 2020 at 6:01
  • \$\begingroup\$ would m work instead of ? \$\endgroup\$
    – Razetime
    Nov 11, 2020 at 6:03
  • \$\begingroup\$ @Razetime no, because it pushes a + reversed(a) not a, reversed(a) \$\endgroup\$
    – lyxal
    Nov 11, 2020 at 6:04
  • \$\begingroup\$ I meant 1?(ms, it says TODO is not defined \$\endgroup\$
    – Razetime
    Nov 11, 2020 at 6:11
2
\$\begingroup\$

PowerShell Core, 91 89 87 76 bytes

$ofs=''
for($c="1";$args[0]--){$c="$("$(+$c+"$($c[20..0])")"|% t*y|sort)"}$c

Try it online!

PowerShell converts strings to long by default. The maximum length would always be 19 chars.

Cool challenge! -2 bytes thanks to Mazzy!

\$\endgroup\$
1
  • 1
    \$\begingroup\$ for is shorter in the Powershell. Try it online! \$\endgroup\$
    – mazzy
    Nov 11, 2020 at 5:23
1
\$\begingroup\$

Axiom, 146 bytes

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

test and results [RATS sequence]

(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]]
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.