เอาท์พุทลำดับ Iccanobif


22

เขียนโปรแกรมหรือฟังก์ชั่นที่มีชื่อที่ออกจะกลับมาหรือลำดับขึ้นไปnจำนวนเต็ม TH ในลำดับ Iccanobif, เอกสารเกี่ยวกับ OEIS เป็นA014258 โปรดทราบว่าเฉพาะองค์ประกอบศูนย์ในลำดับ ( 0) จะถูกพิมพ์หากnเป็นศูนย์

ลำดับถูกสร้างขึ้นโดยเริ่มต้นเช่นลำดับ Fibonacci มาตรฐาน แต่หลังจากเพิ่มหมายเลขก่อนหน้านี้สองหมายเลขคุณพลิกผลลัพธ์และวางศูนย์นำหน้าใด ๆ ความจริงที่น่าสนใจสำหรับฉันอย่างน้อยก็คือลำดับนี้ไม่เพิ่มขึ้นอย่างเข้มงวด (ดูรายการด้านล่าง) มันก็ดูเหมือนจะเป็น (และอาจจะเป็น) มากกว่าหรือเท่ากับลำดับฟีโบนักชีอย่างเคร่งครัด

โปรแกรมที่คุณป้อนต้องเป็นจำนวนเต็ม

ลำดับ 20 หมายเลขแรกมีให้ที่นี่เพื่อความสุขในการรับชมของคุณ:

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

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

โปรแกรมที่สั้นที่สุดชนะ

แก้ไข: เพิ่มหมายเหตุเพื่อชี้แจงว่าลำดับเริ่มต้นด้วยองค์ประกอบศูนย์และควรรวมหาก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])

recursive:

# หมายเหตุว่านี่จะพิมพ์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 สำหรับการคิดถึงสิ่งที่จะทำกับลำดับฟีโบนักชีที่ไม่เคยทำมาก่อน
เลเวลริเวอร์เซนต์

@ สตีฟเวอร์ริลล์ฉันตัดสินใจว่าฉันต้องการท้าทายอีกครั้งจากนั้นก็เริ่มด้วยการตัดสินใจว่าจะเรียงลำดับอย่างไรหลังจากที่ฉันจินตนาการถึงมัน ดังนั้นฉันจึงเขียนโปรแกรม จากนั้นฉันค้นหา OEIS และทำการท้าทาย
mbomb007

มันเป็นแรงบันดาลใจจากคำถามนี้หรือไม่?
JohnE

@ JohnE ไม่ฉันเคยเห็นมาก่อน แต่ความท้าทายนั้นเป็นหนึ่งในความท้าทายที่ง่ายที่สุดในเว็บไซต์นี้ ไม่ฉันเพิ่งสร้างลำดับตัวเลขจากจินตนาการที่ฉันสามารถใช้เป็นความท้าทายได้
mbomb007

3
ฉันคิดว่าคุณควรรออีกสักครู่ก่อนที่จะตอบรับ หากไม่มีคำตอบอย่างใดอย่างหนึ่งที่ชัดเจนว่าไม่สามารถเอาชนะได้ (เช่นโซลูชัน 1 ไบต์) ขอแนะนำให้รออย่างน้อยหนึ่งสัปดาห์
เดนนิส

คำตอบ:


3

Pyth, 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ในการแปลงมากกว่า backticks เพราะจำนวนที่มากพอใน 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

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

สิ่งนี้จะสร้างฟังก์ชันที่รับจำนวนเต็มเป็นอินพุตและส่งกลับอาร์เรย์จำนวนเต็ม

คำอธิบาย Ungolfed +:

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 การเพิ่ม CAST สำหรับ 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

K, 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จะเป็นตัวระบุเมื่อฉันต้องการ "วาง" xผู้ประกอบนำไปใช้กับตัวแปรที่เรียกว่า


2
ตาม OP ผลลัพธ์ควรเริ่มต้นด้วยศูนย์
ยืด Maniac

ถูกต้อง - ควรได้รับการแก้ไขแล้ว
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และ prepends0


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

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

คุณอาจย่อให้สั้นลงโดยใช้วิธีตัวเลขเพื่อย้อนกลับจำนวนเนื่องจากการจัดการสตริงของ Java มีค่าใช้จ่ายสูง
mbomb007

ฉันรู้ว่ามันใช้เวลานานกว่า 1.5 ปี แต่คุณสามารถบันทึกได้ 6 ไบต์โดยแทนที่Integer.valueOf(ด้วยnew Long((แล้วเปลี่ยนintค่า for-loop 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] 

ใช้เวลาประมาณ 10 วินาทีในการแสดงผลลัพธ์a(10000,X).บนคอมพิวเตอร์ของฉัน

แก้ไข: เวอร์ชัน 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{~~~{/

คุณสามารถทดสอบได้ ที่นี่โดยระบุความยาวที่ต้องการในสแต็กเริ่มต้น

แก้ไข: มากกว่าจำนวนครึ่งที่ลดลงครึ่งหนึ่ง


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

ไม่มีอะไรแฟนซีเพียงฟีโบนักชีอัลกอริธึมเฉลี่ยกับเวทมนตร์ย้อนกลับสตริง

Ungolfed:

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

ผลลัพธ์จะถูกพิมพ์ทีละแถวในคอลัมน์ A:

เอาท์พุต


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

Pip , 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

Pushy , 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.
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.