A sequência do RATS

30

Sua tarefa é gerar o enésimo termo da sequência do RATS, em que n é a entrada. A sequência do RATS também é conhecida como sequência reversa de adição e classificação. Essa sequência também pode ser encontrada aqui: http://oeis.org/A004000 .

casos de teste:

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

Por exemplo, a saída para 5 é 77 ​​porque 16 + 61 = 77. Depois disso, o 77 é classificado.

O menor envio vence. Este é o meu primeiro desafio, por isso espero que não seja uma duplicata ou algo assim.

justaprogrammer
fonte
A entrada precisa ser um número inteiro ou também pode ser uma string?
Denker
@ DenkerAffe, você quer dizer um número na forma de uma string?
Justaprogrammer 31/01/16
@justaprogrammer Sim, para que eu possa obter "123" em vez de 123 como Inteiro. Talvez economize alguns bytes.
Denker
2
não é 77 ​​+ 77 = 154? Ou eu perdi alguma coisa? EDIT: Ah, sim, eu esqueci de classificar.
Denham Coote
6
@DenhamCoote Eu acho que você quis dizer "oh rato s , eu esqueci de classificar!"
Martin Ender

Respostas:

11

MATL , 11 12 bytes

1i"tVPU+VSU

Entrada é uma string (com aspas simples) representando um número inteiro em unário . A entrada de string é permitida pelo desafio e unary é um formato válido .

Experimente online!

Explicação

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    
Luis Mendo
fonte
4
Eu não sei o que me assusta / me deixa mais perplexa, MATL ou Jelly ... +1
Downgoat
9

05AB1E , 6 bytes

Código:

$FDR+{

Explicação:

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

Isso também funciona com um programa de 0 byte .

Adnan
fonte
@ Adnan Três dias atrás , na verdade. Ainda assim, bem jogado ...
Maçaneta da porta
@Doorknob Just in time haha
Adnan
19
Você pode economizar 6 bytes, eliminando o código fonte.
Dennis
2
Você também pode reduzir 05AB1E, eliminando primeiro o zero inicial e depois omitindo o 1, como 1E==E. Então você obtém apenas 5ABE-2 bytes.
flawr
1
@Dennis great observação
Adnan
8

CJam, 15 bytes

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

Teste aqui.

Explicação

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.
}*
Martin Ender
fonte
3
Como todas essas linguagens ser tão curta
justaprogrammer
2
@justaprogrammer Nomes de caracteres únicos para funções incorporadas ajudam. ;) CJam, Pyth e Brachylog são todos idiomas de golfe, projetados especificamente com o código de golfe em mente. (Consulte en.wikipedia.org/wiki/Code_golf#Dedicated_golfing_languages. ) Existem também idiomas como APL e J que não são idiomas de golfe, mas são igualmente concisos, porque os designers pensaram que seria uma boa idéia.
Martin Ender
Qual deles você mais recomenda para vencer desafios como esses?
Justprogrammer 31/01
3
@justaprogrammer Eu não escolheria um com base no qual está vencendo esses desafios (que provavelmente seriam Pyth ou Jelly). Ele pode ser tão divertido de golfe em uma linguagem "normal" (especialmente porque pode haver mais concorrência dentro de que a linguagem). Para um idioma de golfe, provavelmente é mais importante que você goste de usá-lo. O CJam é bastante divertido - é baseado em pilha que o faz pensar um pouco mais do que em outras línguas e, ao mesmo tempo, é uma linguagem bastante poderosa, que comecei a usar para scripts descartáveis ​​simples fora do golfe, que é um bom impulso para minha produtividade.
Martin Ender
Essas línguas parecem muito interessantes e mal posso esperar para aprender uma. Eu não sei o que é geléia? Isso é algum tipo de gelatina ou algo assim?
Justaprogrammer 31/01
8

Pitão, 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

Experimente no intérprete online .

Maçaneta da porta
fonte
4
O que é essa mágica? Como é que isso funciona?
Justaprogrammer 31/01
1
@justaprogrammer Adicionei uma explicação. :)
Maçaneta da porta
Huh, mas como. Como você testa esse código?
Justaprogrammer 31/01
1
@justaprogrammer Adicionei um link para um intérprete on-line no qual você pode executar o código.
Maçaneta
Isto é incrível, é tão curta, mas tão bonita
justaprogrammer
5

Python 2, 72

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

Função recursiva, utiliza a abreviação de Python 2 para __repr__, que será interrompida quando a função atingir valores muito grandes (um Lserá anexado à sequência do número). Não sei ao certo se há um lugar onde possamos parar. , mas se não mudar para str()adicionar apenas 6 bytes, torna-se um pouco mais curto para gerar uma string, a 75 bytes:

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

1 byte economizado graças ao trichoplax nesta versão

FryAmTheEggman
fonte
Isso é um espaço excedente antes do orno segundo bloco de código?
Trichoplax
1
@trichoplax graças para a captura :)
FryAmTheEggman
5

JavaScript ES6, 70 bytes

Guardado 1 byte graças a @ user81655

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

suspiro JavaScript é realmente detalhado. Um monte (> 50%) do código é apenas caso a função string + variedade + juntar + elenco para int. Eu tentei reduzir, avaliar e todo tipo de coisa, mas isso parece ser o mais curto.

Experimente online (todos os navegadores funcionam)

Downgoat
fonte
2
Assim como o meu, mas melhor (e publicado anteriormente). Bah!
edc65
Manipulação de Strings é JS é tão longo, você tem as minhas condolências
MayorMonty
@ user81655 legal, obrigado! Gostaria de nunca pensou em re-fim de que maneira
Downgoat
f=n=>n?[...+[...b=f(n-1)].reverse().join``+b+''].sort().join``:'1'se string retornando permitido
l4m2
4

Braquilog , 19 bytes

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

Explicaçã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.
Fatalizar
fonte
3

Haskell, 67 bytes

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

Exemplo de uso: (g"1"!!) 7-> "668".

É uma implementação direta da definição: começando com "1", acrescente repetidamente o resultado de inversão-adição-classificação do elemento atual. A função principal (g"1"!!)seleciona o ielemento th.

nimi
fonte
Este é o programa mais legível abaixo de 70 bytes!
Gaurav Agarwal
3

Julia, 77 bytes

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

Esta é uma função lambda que aceita um número inteiro e retorna um número inteiro. Para chamá-lo, atribua-o a uma variável.

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
Alex A.
fonte
3

Geléia, 13 12 bytes

Tenho certeza de que isso provavelmente pode ser praticado, pois esta é minha primeira resposta em Jelly / em um idioma tácito.

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: Salvo 1 byte, graças a Dennis

Somente ASCII
fonte
2

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

Expandido

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);
}
}
Denham Coote
fonte
Por que você usa interfaceR em vez de classR, que é 4 bytes mais curto?
Will Sherwood
1
@WillSherwood porque você pode, então, omitir o modificador pública no main (), tornando-o mais curto global :)
Denham Coote
2

Sério, 17 bytes

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

Experimente online!

Explicação:

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

Lua, 179 156 Bytes

Não vejo como poderia jogar mais, mas tenho certeza de que há uma maneira. Graças ao @LeakyNun, dediquei um tempo para analisar e jogar da maneira correta, talvez ainda conseguisse ganhar alguns bytes usando outra abordagem.

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 e explicações

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)
Katenkyo
fonte
Bem, parece que você não está mais aqui ... mas talvez você possa se referir à minha resposta em java.
Leaky Nun
@LeakyNun Bem, eu não estou participando muito dessa vez, mas ainda estou enfrentando desafios de tempos em tempos; tentarei dar uma olhada em sua resposta, mas mesmo sem isso, vejo algo que pode ser jogado com facilidade ( a=a<1 and 1orpor exemplo).
Katenkyo
nós ficaríamos felizes - eu ficaria feliz - por tê-lo de volta.
Leaky Nun
2

Braquilog 2, 11 bytes, desafio de pós-datas de idiomas

;1{↔;?+o}ⁱ⁽

Experimente online!

Explicaçã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

Não sei ao certo o que isso faz com zero dígitos, mas a pergunta não indica nenhum tratamento específico e, provavelmente, eles não aparecem na sequência.


fonte
1

ES6, 79 bytes

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

82 bytes sem eval:

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

Todas essas conversões são dolorosas.

@ edc65 Na verdade, salvei 4 bytes ao mappassar para reduceeste momento ... sem dúvida, você me mostrará errado novamente.

Neil
fonte
foré mais curto:n=>eval("for(r=1;n--)r=+[...+[...r+''].reverse().join``+r+''].sort().join``")
Downgoat 31/01
@ Doᴡɴɢᴏᴀᴛ não funciona n=0, mesmo depois de corrigir os erros de sintaxe.
Neil
1

Python 2, 91 bytes

Entrada como Inteiro, o resultado é impresso na tela.

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

Acho que isso pode ser muito mais curto, com alguma magia de recursão, mas ainda não consigo entender. Vou dar uma nova olhada mais tarde e espero melhorar essa.

Denker
fonte
1

Python 2, 83 bytes

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

Perl 6 , 40 bytes

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

(Se você quiser retornar um Int, coloque um +direito antes [~])

Uso:

# 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)
Brad Gilbert b2gills
fonte
1

Mathematica 10.3, 66 61 bytes

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

Bem simples.

LegionMammal978
fonte
1

PHP, 102 bytes

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

Versão Online

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];
Jörg Hülsermann
fonte
1

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

Experimente online!

Não é a entrada mais longa! \ o /

Freira Furada
fonte
@Katenkyo see this
Leaky Nun
É ok f (1) ... f (20), mas a partir de f (21) resultado parece errado ...
RosLuP
Perda de precisão, suponho.
Leaky Nun
1

Python 2 , 70 bytes

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

Experimente online!

ovs
fonte
0

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

teste e resultados [sequência 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]]
RosLuP
fonte
0

Tcl , 91 bytes

proc R n {join [lsort [split [expr {$n?[set v [R [expr $n-1]]]+[string rev $v]:1}] ""]] ""}

Experimente online!

sergiol
fonte