Xuất trình tự Iccanobif


22

Viết chương trình hoặc hàm được đặt tên sẽ xuất hoặc trả lại chuỗi lên nsố nguyên thứ trong chuỗi Iccanobif, được ghi lại trên OEIS là A014258 . Lưu ý rằng chỉ phần tử zeroth trong chuỗi ( 0) sẽ được in nếu nbằng không.

Chuỗi được tạo bằng cách bắt đầu giống như chuỗi Fibonacci tiêu chuẩn, nhưng sau khi thêm hai số trước đó, bạn lật kết quả và thả bất kỳ số 0 đứng đầu nào. Một sự thật thú vị, với tôi ít nhất, là trình tự này không tăng nghiêm ngặt (xem danh sách dưới đây). Nó dường như cũng (và có lẽ là) hoàn toàn lớn hơn hoặc bằng chuỗi Fibonacci.

Đầu vào chương trình của bạn phải là một số nguyên.

20 số đầu tiên của chuỗi được cung cấp ở đây để bạn thưởng thức:

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

Sơ hở tiêu chuẩn bị cấm.

Chương trình ngắn nhất sẽ thắng.

EDIT: Đã thêm một ghi chú để làm rõ rằng chuỗi bắt đầu bằng phần tử zeroth và nên được bao gồm nếu nbằng không.

Ví dụ về khả năng 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]

Bây giờ có một số câu trả lời, dưới đây là các triển khai của tôi trong Python 2 mà tôi đã làm việc chăm chỉ để ẩn với đánh dấu:

Lặp lại:

#Closest vào chương trình ban đầu của tôi. 73 byte. Cũng cần lưu ý rằng chương trình này
 không thể đạt đến một tràn ngăn xếp. Nó chạy trong n = 5000 trong chưa đầy 10 giây.

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

Đệ quy:

# Lưu ý rằng điều này in ndòng mới. 64 byte.
 Sẽ gặp lỗi tràn ngăn xếp đối với các giá trị lớn của n.

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


8
+1 để nghĩ về một cái gì đó để làm với chuỗi Fibonacci đã được thực hiện trước đó
Level River St

@steveverrill Tôi quyết định tôi muốn thực hiện một thử thách khác, sau đó bắt đầu chỉ bằng quyết định xem chuỗi sẽ như thế nào, sau khi tôi tưởng tượng ra nó. Vì vậy, tôi đã viết một chương trình. Sau đó, tôi đã tìm kiếm OEIS và thực hiện thử thách.
mbomb007

Có phải nó được truyền cảm hứng bởi câu hỏi này ?
JohnE

@ John Không. Tôi đã thấy nó trước đây, nhưng thử thách đó là một trong những thử thách đơn giản nhất trên trang web này. Không, tôi chỉ tạo ra một chuỗi số hoàn toàn từ trí tưởng tượng của mình mà tôi có thể sử dụng như một thử thách.
mbomb007

3
Tôi nghĩ bạn nên chờ thêm một thời gian nữa trước khi chấp nhận câu trả lời. Trừ khi một trong những câu trả lời rõ ràng là không thể đánh bại (ví dụ: giải pháp 1 byte), bạn nên đợi ít nhất một tuần.
Dennis

Câu trả lời:


3

Bình thường, 17 15 14

Pu+Gs_`s>2GQU2

Dùng thử trực tuyến

Việc triển khai rất cơ bản, bắt đầu bằng range(2)và thêm một số phần tử bằng với đầu vào, sau đó cắt bỏ phần bổ sung bật ra phần tử cuối cùng.

Cảm ơn @Jakube đã chỉ ra điều >ngược lại.

Giải trình

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 byte

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

Sử dụng strđể chuyển đổi chứ không phải backticks vì số lượng đủ lớn trong Python 2 được viết bằng chữ L ở cuối. Tôi đã thử một hàm đệ quy, nhưng nó bật ra lâu hơn (61):

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

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

Điều này tạo ra một hàm chấp nhận một số nguyên làm đầu vào và trả về một mảng số nguyên.

Ungolfed + giải thích:

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

Ví dụ:

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

Hàm bảng nội tuyến chuyển tiếp rất thẳng sử dụng truy vấn CTE đệ quy. Vì nó đang sử dụng INT, điều này sẽ đứng đầu ở mức 37. Thêm CAST cho các gợi ý sẽ cho phép nó đi xa hơn tới 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

Nó được sử dụng như sau

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

K, 25 23 byte

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

Một sửa đổi đơn giản của một trong những ví dụ tại Vòng lặp không hôi thối .

Cụm từ .|$ép một số thành một chuỗi, đảo ngược nó và sau đó đánh giá nó.

Chỉnh sửa:

Sloppy chú ý đến điều kiện biên trên phần của tôi. Chính xác hơn bây giờ:

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

Chỉnh sửa 2:

(x+1)#có thể được thay thế bằng -1_, lưu 2 ký tự. Không gian là cần thiết bởi vì nếu không _xsẽ là một định danh, khi tôi muốn toán tử "thả" được áp dụng cho một biến được gọi x.


2
Theo OP, đầu ra nên bắt đầu bằng 0.
Căng thẳng maniac

Đúng- Nên sửa ngay.
JohnE

1
Đến đây để đăng câu trả lời chỉ để thấy bạn có cùng một câu trả lời. Hoàn thành tốt
tmartin

3

Haskell, 64 49 byte

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

Ví dụ sử dụng: q 15->[0,1,1,2,3,5,8,31,93,421,415,638,3501,9314,51821,53116]

Cách thức hoạt động: !xây dựng đệ quy một danh sách vô hạn các số iccanobif bắt đầu bằng đối số thứ nhất (đối số thứ hai phải là số iccanobif tiếp theo). qlấy các nsố đầu tiên từ danh sách iccanobif bắt đầu bằng 1, 1và trả trước a 0.


2

CJam, 18 byte

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

Làm thế nào nó hoạt động

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

Dùng thử trực tuyến tại đây


2

Java - 126 124

Tôi đã không thấy Java trên trang web này trong một thời gian ...

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


Tôi cũng sẽ chấp nhận...System.out.println(c);
mbomb007

@ mbomb007 Cảm ơn! Tiết kiệm cho tôi 2 byte.
Căng thẳng điên cuồng

Bạn có thể rút ngắn nó bằng cách sử dụng phương thức số để đảo ngược một số do thao tác chuỗi của Java rất tốn kém.
mbomb007

Tôi biết đã hơn 1,5 năm, nhưng bạn có thể tiết kiệm 6 byte bằng cách thay thế Integer.valueOf(bằng new Long((và sau đó thay đổi intvòng lặp for thành vòng lặp long). Nếu bạn thích chỉ làm việc với số nguyên thay vào đó, new Integer(vẫn còn ngắn hơn Integer.valueOf(.
Kevin Cruijssen 2/2/2017

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

Chạy a(17,X).đầu ra:

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

Mất khoảng 10 giây để xuất kết quả a(10000,X).trên máy tính của tôi.

Chỉnh sửa: Phiên bản 121 byte ở trên là một định nghĩa vị ngữ = một lớp lót. Phiên bản cũ 131 byte là như sau (phải được chạy dưới dạng 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

> <> (Cá) 592 254 byte

Không phải siêu golf (42/43 khoảng trống không làm gì cả và tổng cộng 30 mã thông báo chuyển hướng), nhưng là một bài tập thú vị giúp nó hoạt động ngay từ đầu.

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

Bạn có thể kiểm tra nó ở đây , cung cấp độ dài mong muốn trong ngăn xếp ban đầu.

EDIT: Hơn một nửa số byte


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

Không có gì lạ mắt, chỉ là một thuật toán trung bình của Wikipedia với phép thuật đảo ngược chuỗi.

Ung dung:

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

VBA Excel, 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

Chạy macro sẽ nhắc người dùng nhập giá trị cho n.

Kết quả sau đó sẽ được in từng hàng trong cột A:

Đầu ra


1
Bạn có thể loại bỏ khoảng trắng trong mã của bạn để làm cho nó ngắn hơn?
mbomb007

@ mbomb007 khi viết bằng Excel VBA, các khoảng trắng được nhập tự động, vì vậy tôi chỉ cần để chúng vào.
Wightboy

1

JavaScript (ES2015), 81 73 byte

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

Chạy chức năng này (được đặt tên f) với 6:

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

1

Pip , 13 byte

Tôi khá chắc chắn rằng tất cả các tính năng được sử dụng trong chương trình này đã có mặt trong Pip trước khi câu hỏi này được hỏi.

LaSio:+RVi+oi

Lấy đầu vào làm đối số dòng lệnh. Hãy thử trực tuyến!

Giải trình

               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

Giá trị của hai biến phát triển như vậy:

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

Pushy , 18 byte (không cạnh tranh)

Z1{:2d+vFs@KjkvF;_

Hãy thử trực tuyến!

Nó không phải là chương trình thanh lịch nhất, nhưng nó hoạt động.

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 vâng, xin lỗi!
FlipTack


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

Thí dụ:

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

Rất thích xem ai đó có giải pháp thay thế R tốt hơn là lấy số của bạn, biến nó thành một chuỗi, đảo ngược và biến nó trở lại thành một số.


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.
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.