Последовательность RATS


30

Ваша задача - сгенерировать n-й член последовательности RATS, где 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 сортируется.

Самое короткое представление выигрывает. Это мой первый вызов, поэтому я надеюсь, что это не дубликат или что-то в этом роде.


Входные данные должны быть целым числом или это также может быть строка?
Денкер

@DenkerAffe Вы имеете в виду число в виде строки?
justaprogrammer

@justaprogrammer Да, так что я могу получить "123" вместо 123 как целое число. Может сэкономить несколько байтов.
Денкер

2
не 77 + 77 = 154? Или я что-то пропустил? РЕДАКТИРОВАТЬ: О, да, я забыл сортировать.
Денхам Кут

6
@DenhamCoote Я думаю , что вы имели в виду : «О крысу s , я забыл сортировать!»
Мартин Эндер

Ответы:


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 Как раз вовремя, ха-ха
Аднан

19
Вы можете сэкономить 6 байт, исключив исходный код.
Деннис

2
Вы также можете сократить 05AB1E, сначала удалив начальный ноль, а затем пропустив 1, как 1E==E. Тогда вы получите только 5ABE-2 байта.
flawr

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, которые вообще не являются языками для игры в гольф, но также кратки, потому что дизайнеры решили, что это будет хорошей идеей.
Мартин Эндер

Какой из них вы порекомендуете для победы в таких соревнованиях?
justaprogrammer

3
@justaprogrammer Я бы не выбрал тот, в зависимости от того, кто выигрывает эти испытания (это, вероятно, Pyth или Jelly). Это может быть так же весело в гольф в «нормальном» языке (особенно потому , что там может быть больше конкуренции в этом языке). Для языка игры в гольф, вероятно, более важно, чтобы вы наслаждались им. CJam довольно увлекателен - он основан на стеке, что заставляет вас думать немного больше, чем в других языках, и в то же время это довольно мощный язык, который я начал использовать для простых одноразовых скриптов вне гольфа, которые хороший прирост моей производительности.
Мартин Эндер

Эти языки выглядят очень интересно, и я не могу дождаться, чтобы выучить их самостоятельно. Я не знаю, что такое желе? Это какой-то желатин или что-то в этом роде?
justaprogrammer

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 Я добавил объяснение. :)
Дверная ручка

Да, но как. Как вы тестируете этот код?
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

1 байт сохранен благодаря Trichoplax на этой версии


Это лишнее пространство перед orвторым блоком кода?
trichoplax

1
@trichoplax спасибо за улов :)
FryAmTheEggman

5

JavaScript ES6, 70 байт

Сохранено 1 байт благодаря @ user81655

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

вздох JavaScript действительно многословен. Много (> 50%) код только случай с функцией струны + массив + присоединиться + бросок к междунар. Я пытался уменьшить, eval и все виды вещей, но это, кажется, самый короткий.

Попробуйте онлайн (все браузеры работают)


2
Прямо как у меня, но лучше (и выложено ранее). Ба!
edc65

Манипулирование
строками

@ user81655 круто, спасибо! Я бы никогда не подумал
переупорядочить

f=n=>n?[...+[...b=f(n-1)].reverse().join``+b+''].sort().join``:'1'если разрешена
возвратная

4

Брахилог , 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"!!)выбирает iй элемент.


Это самая читаемая программа до 70 байт!
Гаурав Агарвал

3

Юлия, 77 байт

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

Это лямбда-функция, которая принимает целое число и возвращает целое число. Чтобы вызвать его, назначьте его переменной.

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

3

Желе, 13 12 байт

Я уверен, что это, вероятно, можно сыграть в гольф, так как это мой первый ответ на Jelly / на молчаливом языке.

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 вместо classR, который на 4 байта короче?
Уилл Шервуд

1
@WillSherwood, потому что вы можете опустить публичный модификатор в main (), что делает его короче в целом :)
Denham Coote


2

Луа, 179 156 байт

Я не вижу, как я мог бы играть в гольф больше, но я уверен, что есть способ. Благодаря @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.
Утренняя монахиня

@LeakyNun Ну, я не часто участвую в этот раз, но все еще время от времени испытываю трудности, я постараюсь взглянуть на ваш ответ, но даже без этого я вижу кое-что, что можно довольно легко сыграть в гольф ( a=a<1 and 1orнапример).
Катенкё

мы были бы рады - я был бы рад - чтобы вы вернулись.
Дрянная Монахиня

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 я фактически спас 4 байта при переходе от mapк reduceэтому времени ... не сомневаюсь , что вы будете доказать , что я неправ снова , хотя.


forКороче:n=>eval("for(r=1;n--)r=+[...+[...r+''].reverse().join``+r+''].sort().join``")
Вниз

@ 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

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

Mathematica 10,3, 66 61 байт

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

Довольно просто.



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

Попробуйте онлайн!

Не самая длинная запись! \ О /


@Katenkyo увидит это
Лики Монахиня,

Это нормально f (1) ... f (20) Но из f (21) результат кажется неправильным ...
RosLuP

Потеря точности, я полагаю.
Дрянная монахиня


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.