Keluarkan Urutan Iccanobif

22

Tulis sebuah program atau fungsi bernama yang akan menampilkan atau mengembalikan urutan nke bilangan bulat dalam urutan Iccanobif, didokumentasikan pada OEIS sebagai A014258 . Perhatikan bahwa hanya elemen nol di urutan ( 0) yang akan dicetak jika nnol.

Urutan ini dihasilkan dengan memulai seperti urutan Fibonacci standar, tetapi setelah menambahkan dua angka sebelumnya, Anda membalik hasilnya dan menjatuhkan angka nol di depan. Fakta yang menarik, setidaknya bagi saya, adalah bahwa urutan ini tidak meningkat secara ketat (lihat daftar di bawah). Tampaknya juga (dan mungkin) benar-benar lebih besar dari atau sama dengan urutan Fibonacci.

Input program Anda harus berupa bilangan bulat.

20 angka pertama dari urutan disediakan di sini untuk kesenangan Anda:

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

Celah standar dilarang.

Kemenangan program terpendek.

EDIT: Menambahkan catatan untuk memperjelas bahwa urutan dimulai dengan elemen nnol dan harus dimasukkan jika nol.

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

Sekarang ada beberapa jawaban, di bawah ini adalah implementasi saya di Python 2 yang saya susah payah sembunyikan dengan markup:

Berulang:

#Tutup untuk program awal saya. 73 byte. Perlu dicatat juga bahwa program ini
 tidak dapat mencapai stack overflow. Ini berjalan selama n = 5000 dalam waktu kurang dari 10 detik.

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

Rekursif:

# Perhatikan bahwa ini akan mencetak nbaris baru. 64 byte
 Akan mengenai kesalahan stack overflow untuk nilai n yang besar.

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

mbomb007
sumber
8
+1 untuk memikirkan sesuatu yang harus dilakukan dengan deret Fibonacci yang belum pernah dilakukan sebelumnya
Level River St
@steveverrill Saya memutuskan ingin membuat tantangan lain, kemudian mulai dengan hanya memutuskan untuk melihat seperti apa urutannya, setelah saya bayangkan. Jadi saya menulis sebuah program. Kemudian saya mencari OEIS dan membuat tantangan.
mbomb007
Apakah itu terinspirasi oleh pertanyaan ini ?
JohnE
@ John. Tidak. Saya pernah melihatnya sebelumnya, tetapi tantangan itu adalah salah satu tantangan paling sederhana di situs ini. Tidak, saya hanya menciptakan urutan angka murni dari imajinasi saya yang dapat saya gunakan sebagai tantangan.
mbomb007
3
Saya pikir Anda harus menunggu sedikit lebih lama sebelum menerima jawaban. Kecuali salah satu jawaban jelas tidak terkalahkan (misalnya, solusi 1 byte), disarankan untuk menunggu setidaknya satu minggu.
Dennis

Jawaban:

3

Pyth, 17 15 14

Pu+Gs_`s>2GQU2

Cobalah online

Implementasi yang sangat mendasar, dimulai dengan range(2)dan menambahkan sejumlah elemen yang sama dengan input, kemudian memotong ekstra yang muncul dari elemen terakhir.

Terima kasih @ Jakube untuk menunjukkan >pembalikan arah.

Penjelasan

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)))
FryAmTheEggman
sumber
4

Python 2, 58 byte

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

Penggunaan struntuk mengkonversi daripada backticks karena angka yang cukup besar di Python 2 ditulis dengan huruf L di bagian akhir. Saya mencoba fungsi rekursif, tetapi ternyata lebih lama (61):

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

Julia, 79 byte

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

Ini menciptakan fungsi yang menerima integer sebagai input dan mengembalikan array integer.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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

T-SQL, 149

Fungsi tabel inline sangat lurus ke depan yang menggunakan kueri CTE rekursif. Karena menggunakan INT, ini akan keluar di 37. Menambahkan CAST untuk bigints akan memungkinkannya untuk melangkah lebih jauh ke 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

Ini digunakan sebagai berikut

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)
MickyT
sumber
3

K, 25 23 byte

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

Modifikasi sederhana dari salah satu contoh di No Stinking Loops .

Ungkapan .|$melemparkan angka ke string, membalikkannya dan kemudian mengevaluasinya.

Edit:

Ceroboh memperhatikan kondisi batas di pihak saya. Lebih benar sekarang:

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

Edit 2:

(x+1)#dapat diganti dengan -1_, menghemat 2 karakter. Ruang diperlukan karena jika tidak _xakan menjadi pengidentifikasi, ketika saya ingin operator "drop" diterapkan pada variabel yang dipanggil x.

JohnE
sumber
2
Menurut OP, output harus dimulai dengan nol.
Stretch Maniac
Benar - Harus diperbaiki sekarang.
JohnE
1
Datang ke sini untuk mengirim jawaban hanya untuk melihat Anda memiliki jawaban yang sama persis. Bagus sekali.
tmartin
3

Haskell, 64 49 byte

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

Contoh penggunaan: q 15->[0,1,1,2,3,5,8,31,93,421,415,638,3501,9314,51821,53116]

Cara kerjanya: !secara rekursif membuat daftar nomor iccanobif yang tak terbatas dimulai dengan argumen pertama (argumen kedua harus nomor iccanobif berikutnya). qmengambil nangka pertama dari daftar iccanobif yang dimulai dengan 1, 1dan diawali dengan a 0.

nimi
sumber
2

CJam, 18 byte

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

Bagaimana itu bekerja

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

Cobalah online di sini

Pengoptimal
sumber
2

Jawa - 126 124

Saya belum melihat Java di sekitar situs ini dalam beberapa saat ...

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) cetakan 0 1 1 2 3 5 8 31 93 421 415 638

Regangkan Maniac
sumber
Saya juga akan menerima...System.out.println(c);
mbomb007
@ mbomb007 Terima kasih! Menyelamatkan saya 2 byte.
Stretch Maniac
Anda mungkin dapat mempersingkatnya menggunakan metode numerik untuk membalikkan angka karena manipulasi string Java mahal.
mbomb007
Aku tahu itu sudah lebih dari 1,5 tahun, tetapi Anda dapat menghemat 6 byte dengan mengganti Integer.valueOf(dengan new Long((dan kemudian mengubah intdalam untuk loop untuk longjuga). Jika Anda lebih suka hanya bekerja dengan bilangan bulat, new Integer(masih lebih pendek dari Integer.valueOf(.
Kevin Cruijssen
2

SWI-Prolog, 141 131 121 byte

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

Menjalankan a(17,X).output:

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

Membutuhkan waktu sekitar 10 detik untuk menampilkan hasil a(10000,X).di komputer saya.

Sunting: Versi 121 byte di atas adalah definisi satu predikat = satu liner. Versi 131 byte yang lama adalah sebagai berikut (harus dijalankan sebagai 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).
Fatalisasi
sumber
2

> <> (Ikan) 592 254 Bytes

Bukan super golf (42/43 kosong yang tidak melakukan apa-apa dan total 30 token redirection), tetapi merupakan latihan yang menarik untuk membuatnya bekerja di tempat pertama.

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{~~~{/

Anda dapat mengujinya di sini , memberikan panjang yang diinginkan di tumpukan awal.

EDIT: Lebih dari setengah jumlah byte

Fongoid
sumber
2

PHP, 114 , 109 byte

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

Tidak ada yang mewah, hanya algoritma fibonacci rata-rata dengan sihir string terbalik.

Tidak Disatukan:

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;
}
Alvaro Arregui
sumber
1

Excel VBA, 279 byte

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

Menjalankan makro akan meminta pengguna untuk memasukkan nilai untuk n.

Hasilnya kemudian akan dicetak baris demi baris di kolom A:

Keluaran

Wightboy
sumber
1
Bisakah Anda menghapus spasi dalam kode Anda untuk membuatnya lebih pendek?
mbomb007
@ mbomb007 saat menulis dalam Excel VBA spasi secara otomatis dimasukkan, jadi saya biarkan saja.
Wightboy
1

JavaScript (ES2015), 81 73 byte

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

Menjalankan fungsi ini (dinamai f) dengan 6:

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

Pip , 13 byte

Saya cukup yakin semua fitur yang digunakan dalam program ini hadir di Pip sebelum pertanyaan ini diajukan.

LaSio:+RVi+oi

Mengambil input sebagai argumen baris perintah. Cobalah online!

Penjelasan

               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

Nilai dua variabel berevolusi seperti ini:

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
DLosc
sumber
0

Pushy , 18 byte (tidak bersaing)

Z1{:2d+vFs@KjkvF;_

Cobalah online!

Ini bukan program yang paling elegan, tetapi berhasil.

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.
FlipTack
sumber
@ mbomb007 ya, maaf!
FlipTack
0

Jelly , 9 byte (tidak bersaing)

0+ṚV$¥Ð¡1

Cobalah online!

Erik the Outgolfer
sumber
0

R, 134 byte

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

Contoh:

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

Ingin melihat apakah seseorang memiliki alternatif R yang lebih baik daripada mengambil nomor Anda, menjadikannya string, membalikkannya, dan mengubahnya kembali menjadi angka lagi.

Andrew Haynes
sumber
0

Groovy, 70 byte

{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.
}
Guci Gurita Ajaib
sumber