Послідовність 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 як Integer. Може зберегти кілька байтів.
Денкер

2
не 77 + 77 = 154? Або я щось пропустив? EDIT: О, так, я забув сортувати.
Denham Coote

6
@DenhamCoote Я думаю , що ви мали в виду : «Про щура s , я забув сортувати!»
Мартін Ендер

Відповіді:


11

MATL , 11 12 байт

1i"tVPU+VSU

Введення - це рядок (з одинарними лапками), що представляє ціле число в одинаковому . Введення рядків дозволено викликом, а unary - допустимим форматом .

Спробуйте в Інтернеті!

Пояснення

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
Пуховик

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

@Doorknob Щойно в часі ха-ха
Аднан

19
Ви можете зберегти 6 байт, видаливши свій вихідний код.
Денніс

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

1
@Dennis велике спостереження
Аднан

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

Пітон 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у другому блоці коду?
трихоплакс

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'якщо дозволено повернути рядок
l4m2

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 байт!
Gaurav Agarwal

3

Джулія, 77 байт

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

Це лямбда-функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній.

Безголовки:

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

EDIT: Збережено 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наприклад).
Katenkyo

ми були б раді - я був би радий - повернути вас.
Leaky Nun

2

Брахілог 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

Пітон 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

Математика 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;}

Спробуйте в Інтернеті!

Не найдовший запис! \ o /


@Katenkyo дивіться це
Leaky Nun

Це нормально 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.