Виведіть послідовність іканобіфів


22

Напишіть програму або названу функцію, яка виведе або поверне послідовність до nпершого числа в послідовності Iccanobif, задокументована на OEIS як A014258 . Зауважте, що лише нульовий елемент у послідовності ( 0) буде надрукований, якщо nдорівнює нулю.

Послідовність створюється, починаючи подібно до стандартної послідовності Фібоначчі, але після додавання двох попередніх чисел ви перегортаєте результат і скидаєте будь-які провідні нулі. Цікавий мені принаймні факт, що ця послідовність не суворо зростає (див. Список нижче). Він також здається (і, мабуть, є) суворо більшим або рівним послідовності Фібоначчі.

Вхід вашої програми має бути цілим числом.

Перші 20 номерів послідовності надані тут для вашого задоволення від перегляду:

0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297, 8964541, 8389769

Стандартні лазівки заборонені.

Найкоротша програма виграє.

EDIT: Додано примітку, щоб уточнити, що послідовність починається з нульового елемента і повинна бути включена, якщо nдорівнює нулю.

Приклад можливостей IO:

0    ->    0
1    ->    0 1
6    ->    0 1 1 2 3 5 8
17   ->    [0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297]

Тепер, коли є кілька відповідей, нижче - мої реалізації в Python 2, над якими я працював, щоб приховати розмітку:

Ітеративний:

# Закрити мою початкову програму. 73 байти. Слід також зазначити, що ця програма
 не може досягти переповнення стека. Він працює протягом n = 5000 менш ніж за 10 секунд.

i,a,b=input(),0,1
print a
while i:print b;i,a,b=i-1,b,int(str(a+b)[::-1])

Рекурсивна:

# Зауважте, що це друкує зворотні nрядки. 64 байти.
 Буде потрапляє помилка переповнення стека для великих значень n.

def f(n,i=0,j=1):print i,n and f(n-1,j,int(str(i+j)[::-1]))or'';


8
+1 для роздумів про щось, що стосується послідовності Фібоначчі, що раніше не робилося
Level River St,

@steveverrill Я вирішив, що хочу зробити ще один виклик, а потім почав із того, щоб вирішити, як виглядатиме послідовність, після того, як я це уявив. Тому я написав програму. Потім я здійснив обшук у OEIS і зробив виклик.
mbomb007

Чи надихнуло це питання ?
JohnE

@JohnE Ні. Я це бачив і раніше, але ця проблема є однією з найпростіших проблем на цьому сайті. Ні, я просто створював числову послідовність виключно із своєї уяви, яку я міг би використати як виклик.
mbomb007

3
Я думаю, вам слід почекати ще трохи, перш ніж приймати відповідь. Якщо одна з відповідей явно не перемогла (наприклад, рішення в 1 байті), доцільно почекати хоча б тиждень.
Денніс

Відповіді:


3

Піта, 17 15 14

Pu+Gs_`s>2GQU2

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

Дуже основна реалізація, починається з range(2)і додає кількість елементів, рівних вводу, потім відрізає додаткові елементи, що спливають останній елемент.

Дякую @Jakube за те, що вказав на >реверс.

Пояснення

Pu+Gs_`s>2GQU2    : Q = eval(input) (implicit)
P                 : all but the last element
 u         QU2    : reduce Q times starting with [0, 1]
  +G              : add to the previous result
       s>2G       : sum of the last two elements of G
    s_`           : int(reversed(repr(above value)))

4

Python 2, 58 байт

a=0;b=1
exec"print a;a,b=b,int(str(a+b)[::-1]);"*-~input()

Використовується strдля конвертації, а не для зворотних посилань, оскільки достатньо великі числа в Python 2 записуються з L в кінці. Я спробував рекурсивну функцію, але вийшло довше (61):

f=lambda n,a=0,b=1:-~n*[0]and[a]+f(n-1,b,int(str(a+b)[::-1]))

3

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

f=n->(t=[0,1];for i=2:n push!(t,t[i]+t[i-1]|>string|>reverse|>int)end;t[1:n+1])

Це створює функцію, яка приймає ціле число як вхідне і повертає цілий масив.

Недоліки + пояснення:

function f(n)
    # Start with the usual Fibonacci stuff
    t = [0,1]

    # Looooooooooooooop
    for i = 2:n
        # Compute the Iccanobif number by piping results
        iccanobif = t[i] + t[i-1] |> string |> reverse |> int

        # Jam it into t
        push!(t, iccanobif)
    end

    # Return the first n + 1
    t[1:n+1]
end

Приклади:

julia> f(1)
2-element Array{Int64,1}:
 0
 1

julia> f(17)
18-element Array{Int64,1}:
      0
      1
      1
      2
      3
      5
      8
     31
     93
    421
    415
    638
   3501
   9314
  51821
  53116
 739401
 715297

3

T-SQL, 149

Дуже пряма вбудована функція таблиці вбудованих даних, яка використовує рекурсивний запит CTE. Оскільки він використовує INT, цей показник закінчиться на 37. Якщо додавати CASTs для bigints, це дозволить йому перейти далі до 63

create function i(@ int)returns table return with r as(select 0I,1N union all select n,reverse(i+n)+0from r)select 0n union all select top(@)n from r

Він використовується наступним чином

select * from i(0)
n
-----------
0

(1 row(s) affected)

select * from i(1)
n
-----------
0
1

(2 row(s) affected)

select * from i(6)
n
-----------
0
1
1
2
3
5
8

(7 row(s) affected)

select * from i(17)
n
-----------
0
1
1
2
3
5
8
31
93
415
421
638
3501
9314
51821
53116
715297
739401

(18 row(s) affected)

3

К, 25 23 байти

{-1_ x{x,.|$+/-2#x}/!2}

Проста модифікація одного з прикладів у " Без смердючих циклів" .

Фраза .|$кидає число до рядка, перевертає його і потім оцінює.

Редагувати:

Недбала увага до граничних умов з мого боку. Більш правильне зараз:

  {-1_ x{x,.|$+/-2#x}/!2}'0 1 6 10
(,0
 0 1
 0 1 1 2 3 5 8
 0 1 1 2 3 5 8 31 93 421 415)

Редагувати 2:

(x+1)#можна замінити -1_, збереження 2 символів. Простір необхідний, оскільки в іншому випадку _xбуде ідентифікатором, коли я хочу, щоб оператор "drop" застосований до змінної, що називається x.


2
Згідно з ОП, вихід повинен починатися з нуля.
Maniac Stretch

Правильно - слід виправити зараз.
JohnE

1
Сюди прийшов, щоб опублікувати відповідь, лише побачивши, що у вас був такий самий. Чудово зроблено.
tmartin

3

Haskell, 64 49 байт

a!b=a:b!(read$reverse$show$a+b)
q n=0:take n(1!1)

Приклад використання: q 15->[0,1,1,2,3,5,8,31,93,421,415,638,3501,9314,51821,53116]

Як це працює: !рекурсивно створює нескінченний список номерів iccanobif, починаючи з першого аргументу (другий аргумент повинен бути наступним номером iccanobif). qприймає перші nномери зі списку iccanobif, починаючи з 1, 1і додає a 0.


2

CJam, 18 байт

U1{_2$+sW%i}ri*;]p

Як це працює

U1                      e# First two numbers in the series
  {        }ri*         e# Run the loop input numbers times
   _2$+                 e# Get sum of last two numbers in the series
       sW%i             e# Convert to string, inverse and convert back to a number
                ;       e# Remove the last number to get only first n + 1 numbers.
                 ]p     e# Wrap all numbers in an array and print the array

Спробуйте його онлайн тут


2

Ява - 126 124

Я не бачив Java навколо цього сайту за деякий час ...

void f(int b){for(int c=0,d=1,g;b-->=0;d=Integer.valueOf(new StringBuilder(c+(c=d)+"").reverse()+""))System.out.println(c);}

f(5) відбитки 0 1 1 2 3 5 8 31 93 421 415 638


Я також прийняв би...System.out.println(c);
mbomb007

@ mbomb007 Дякую! Зберегли мені 2 байти.
Maniac Stretch

Можливо, ви могли б скоротити його за допомогою цифрового методу, щоб повернути число, оскільки обробка рядка Java дорога.
mbomb007

Я знаю, що минуло більше 1,5 років, але ви можете зберегти 6 байтів, замінивши Integer.valueOf(на new Long((а потім змінити intв фор-циклі longтакож на). Якщо ви віддаєте перевагу просто працювати з цілими числами, new Integer(це все-таки коротше, ніж Integer.valueOf(.
Kevin Cruijssen

2

SWI-Prolog, 141 131 121 байт

a(X,R):-X>1,A is X-1,a(A,B),reverse(B,[K,L|_]),W is K+L,name(W,Z),reverse(Z,Y),name(E,Y),nth0(X,R,E,B);X=1,R=[0,1];R=[0].

Виконання a(17,X).результатів:

[0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297] 

Виводить результат a(10000,X).на моєму комп’ютері приблизно 10 секунд .

Редагувати: Версія з 121 байтом вище - це визначення одного предиката = один вкладиш. Стара версія 131 байтів така (повинна бути запущена як p(17,X)):

a(0,[0]).
a(1,[1,0]).
a(X,[E|B]):-A is X-1,a(A,B),B=[K,L|_],W is K+L,name(W,Z),reverse(Z,Y),name(E,Y).
p(X,Y):-a(X,Z),reverse(Z,Y).

2

> <> (Риба) 592 254 байт

Не супер-гольф (42/43 заготовки, які нічого не роблять, і в цілому 30 жетонів перенаправлення), але було цікавим вправою, що працювало в першу чергу.

10!/{:}0=?v/{1-}}:{+:0}!/a,:1%-:0=?!v~{:1!/$:@0=?!v$~}}:&{{&*\
/-$/    ;n/\oo", "n:    \       }+1{/     \$-1$*a /|.!20}}01@/
* :{:}(?v:{!":}-1!/$:@0=?!v$~{:}1!/$:@0=?!v$~}}}:&{{{&*:1%-*&{{&+}}{1+}02.
b .1 +bb   \      \$-1$*a /       \$-1$,a /
\*9{~~~{/

Ви можете протестувати його тут , забезпечивши бажану довжину в початковому стеку.

EDIT: Кількість байтів удвічі менша


2

PHP, 114 , 109 байт

function f($n){if($n==0)return 0;$f=[0,1];for($i=2;$i<=$n;++$i){$f[$i]=strrev($f[$i-1]+$f[$i-2]);}return $f;}

Нічого фантазійного, лише середній алгоритм середнього рівня зі зворотною магією рядків.

Безголівки:

function f($n)
{
    if($n == 0) return 0;
    $f = [0, 1];
    for ($i=2; $i<=$n; ++$i){
        $f[$i] = strrev($f[$i-1] + $f[$i-2]);
    }
    return $f;
}

1

Excel VBA, 279 байт

n = InputBox("n")
For i = 0 To n
If i < 2 Then
Cells(i + 1, 1) = i
ElseIf i > 6 Then
x = Cells(i, 1) + Cells(i - 1, 1)
l = Len(x)
v = CStr(x)
For j = 1 To l
r = r + Right(v, 1)
v = Left(v, l - j)
Next j
Cells(i + 1, 1) = r
r = ""
Else
Cells(i + 1, 1) = Cells(i, 1) + Cells(i - 1, 1)
End If
Next i

Запуск макросу запропонує користувачеві ввести значення n.

Потім результати буде надруковано рядок за рядком у стовпці А:

Вихідні дані


1
Чи можете ви видалити пробіли в коді, щоб скоротити його?
mbomb007

@ mbomb007 при написанні в Excel VBA пробіли вводяться автоматично, тому я просто залишаю їх.
Wightboy

1

JavaScript (ES2015), 81 73 байт

(a,b=0,c=1)=>{for(;a-->-1;c=[...(b+(b=+c)+"")].reverse().join``)alert(b)}

Запуск цієї функції (названий f) за допомогою 6:

f(6);// alerts: 0, 1, 1, 2, 3, 5, 8

1

Піп , 13 байт

Я впевнений, що всі функції, використані в цій програмі, були присутніми в Pip до того, як було задано це питання.

LaSio:+RVi+oi

Вводиться як аргумент командного рядка. Спробуйте в Інтернеті!

Пояснення

               a is 1st cmdline arg; i is 0; o is 1 (implicit)
La             Loop (a) times:
       RVi+o   Reverse of i+o
      +        Unary + treats its operand as a number, thus removing leading 0's
    o:         Assign the result to o...
  Si           ... before swapping i and o
            i  After the loop, output i

Значення двох змінних розвиваються так:

Iter   o   i (output)
   0   1   0
   1   0   1
   2   1   1
   3   1   2
   4   2   3
   5   3   5
   6   5   8
   7   8  31
   8  31  93
   9  93 421
  10 421 415

0

Пушистий , 18 байт (неконкурентний)

Z1{:2d+vFs@KjkvF;_

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

Це не найвишуканіша з програм, але вона працює.

Z1     \ Push 0 and 1 to begin the sequence
{:     \ Input times do:
 2d+   \   Add the last two terms
 vF    \   Send to second stack
 s     \   Split into digits
 @Kjk  \   Reverse and join into one number
 vF;    \   Send back to first stack
_      \ At the end of the program, print the whole stack.

@ mbomb007 так, вибачте!
FlipTack


0

R, 134 байти

i=function(n){s=c(0,1);for(i in 3:n){s[i]=as.numeric(paste0(rev(strsplit(as.character(s[i-2]+s[i-1]),'')[[1]]),collapse=''))};cat(s)}

Приклад:

> i(10)
0 1 1 2 3 5 8 31 93 421

Хочеться побачити, чи є у когось краща альтернатива R, ніж взяти ваш номер, зробити його рядком, перевернути його і знову перетворити на номер.


0

Groovy, 70 байт

{r={"$it".reverse() as int};f={n->n<3?1:r(f(n-1))+r(f(n-2))};r(f(it))}

{
    r={"$it".reverse() as int};       // Reverse digits, costly using string.
    f={n->n<3?1:r(f(n-1))+r(f(n-2))}; // Recursive Iccanobbif implementation.
    r(f(it))                          // Reverse final output.
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.