ลำดับ Hofstadter Q


25

คำนิยาม

  1. a (1) = 1
  2. a (2) = 1
  3. a (n) = a (na (n-1)) + a (na (n-2)) สำหรับ n> 2 โดยที่ n เป็นจำนวนเต็ม

งาน

ได้รับจำนวนเต็มบวกสร้างna(n)

Testcases

n  a(n)
1  1
2  1
3  2
4  3
5  3
6  4
7  5
8  5
9  6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12

การอ้างอิง


ที่เกี่ยวข้อง
Leun Nun

1
เราสามารถคืนค่าTrue เป็นภาษาที่สามารถใช้เป็น1 ได้หรือไม่?
Dennis

1
@Dennis ถ้าในภาษานั้นจริงเท่ากับ 1 แล้วใช่
Leun Nun

4
นอกเหนือจากลิงค์ OEIS มันอาจเป็นการดีที่จะอ้างอิง GEB ที่มีลำดับแรกปรากฏ
Martin Ender

คำตอบ:


9

เรติน่า , 84 83 79 74 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

.+
$*;1¶1¶
+`;(?=(1)+¶(1)+)(?=(?<-1>(1+)¶)+)(?=(?<-2>(1+)¶)+)
$3$4¶
G3=`
1

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

ฉันจะต้องเล่นกอล์ฟนี้อีกในภายหลัง


9

Haskell, 35 33 ไบต์

a n|n<3=1|b<-a.(-)n=b(b 1)+b(b 2)

aกำหนดฟังก์ชั่น


2
เคล็ดลับที่ดีกับการผูก! จะไม่เหมือน(b.b)1+(b.b)2สั้นกว่ายอดรวมหรือไม่
xnor

ทำไมใช่ขอบคุณ @ xnor
Anders Kaseorg

8

Julia, 29 ไบต์

!n=n<3||!(n-!~-n)+!(n-!~-~-n)

ลองออนไลน์!

มันทำงานอย่างไร

เรากำหนดผู้ประกอบการเอก!เพื่อวัตถุประสงค์ของเรา

ถ้าnเป็น1หรือ2 , n<3ผลตอบแทนที่แท้จริงและนี่คือผลตอบแทนที่คุ้มค่าของเรา

ถ้าnมากกว่า2ให้n<3ส่งคืนค่าfalseและ|| สาขาได้รับการดำเนินการ นี่คือการดำเนินการตรงไปตรงมาของความหมายที่~-nอัตราผลตอบแทนn - 1และ~-~-nอัตราผลตอบแทนn - 2


7

Sesos, 54 ไบต์

0000000: eefb5b 04f83a a75dc2 36f8d7 cf6dd0 af7b3b 3ef8d7  ..[..:.].6...m..{;>..
0000015: cfed12 f661f0 ae9d83 ee63e6 065df7 ce6183 af7383  ....a.....c..]..a..s.
000002a: 76ef3c 3f6383 7eff9c b9e37f                       v.<?c.~.....

ลองออนไลน์

ถอดชิ้นส่วน

set numin
set numout
add 1
fwd 1
add 1
fwd 6
get
sub 1
jmp
    jmp
        sub 1
        fwd 1
        add 1
        rwd 1
    jnz
    fwd 1
    sub 1
    rwd 2
    add 2
    jmp
        rwd 4
        jmp
            sub 1
            fwd 3
            add 1
            rwd 3
        jnz
        fwd 4
        jmp
            sub 1
            rwd 3
            add 1
            rwd 1
            add 1
            fwd 4
        jnz
        rwd 3
        jmp
            sub 1
            fwd 3
            add 1
            rwd 3
        jnz
        fwd 4
        add 2
        jmp
            rwd 5
            jmp
                rwd 1
                jmp
                    sub 1
                    fwd 2
                    add 1
                    rwd 2
                jnz
                fwd 1
                jmp
                    sub 1
                    rwd 1
                    add 1
                    fwd 1
                jnz
                rwd 1
                sub 1
            jnz
            fwd 2
            jmp
                sub 1
                rwd 1
                add 1
                rwd 1
                add 1
                fwd 2
            jnz
            fwd 1
            jmp
                rwd 2
                jmp
                    sub 1
                    fwd 1
                    add 1
                    rwd 1
                jnz
                fwd 2
                jmp
                    sub 1
                    rwd 2
                    add 1
                    fwd 2
                jnz
                fwd 1
            jnz
            fwd 3
            sub 1
        jnz
        rwd 2
        jmp
            sub 1
            rwd 3
            add 1
            fwd 3
        jnz
        fwd 1
        sub 1
    jnz
    fwd 2
jnz
rwd 7
put

หรือในรูปแบบ Brainfuck:

+>+>>>>>>,-[[->+<]>-<<++[<<<<[->>>+<<<]>>>>[-<<<+<+>>>>]<<<[->>>+<<<]>>>>++[<<<<<[<
[->>+<<]>[-<+>]<-]>>[-<+<+>>]>[<<[->+<]>>[-<<+>>]>]>>>-]<<[-<<<+>>>]>-]>>]<<<<<<<.

6

C, 43 42 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @Dennis

ทุกคำตอบเหมือนกันฉันต้องทำสิ่งที่แตกต่าง!

ลองออนไลน์!

a(n){return n<3?:a(n-a(n-2))+a(n---a(n));}

คำอธิบาย: มันเป็นเรื่องปกติa(n-a(n-2))+a(n-a(n-1))แต่มีพฤติกรรมที่ไม่ได้กำหนด (ใช้งานได้บนโทรศัพท์ของฉัน (gcc) และ ideone)


4
1. คุณควรพูดถึงคอมไพเลอร์ด้วย "swag" ของคุณเป็นพฤติกรรมที่ไม่ได้กำหนด 2. GCC คุณไม่จำเป็นต้องใช้1ระหว่างและ? :
Dennis

@Dennis น่าสนใจสูตรเดียวกันนี้ทำงานได้ในคำตอบ PowerShell ซ้ำ ๆ ของฉัน ...$b+=$b[$_-$b[$_-2]]+$b[$_---$b[$_]]
AdmBorkBork

@TimmyD คอมไพเลอร์บางคนอาจรวบรวม a (n) ก่อน n - และไม่มีพฤติกรรมรูปแบบ (หรือที่กำหนด) สำหรับสิ่งนั้น ดังนั้นพฤติกรรมที่ไม่ได้กำหนด
betseg

@betseg ใช่ฉันเห็นด้วย เพียงชี้ให้เห็นว่ามันไม่จำเป็นต้องเป็นเอกลักษณ์ของ C.
AdmBorkBork

@ TimmyD โอ้ฉันเข้าใจผิดว่า ฉันแค่ต้องการเปลี่ยนฟังก์ชั่นที่ทุกคนใช้ดังนั้นของฉันจะแตกต่างกันและมีความเป็นไปได้: D
betseg

5

Mathematica ขนาด 36 ไบต์

นับไบต์ถือว่า ISO 8859-1 เข้ารหัสและ Mathematica ของ$CharacterEncodingชุดWindowsANSI(ค่าเริ่มต้นบน Windows นั้นตั้งค่าอื่น ๆ อาจจะทำงานได้เป็นอย่างดี แต่บางคนชอบUTF-8แน่นอนไม่ได้)

±1=±2=1
±n_:=±(n-±(n-1))+±(n-±(n-2))

กำหนด±เป็นโอเปอเรเตอร์ unary

ฉันพยายามกำจัดความซ้ำซ้อน แต่จบลงด้วยจำนวนไบต์เดียวกัน:

±1=±2=1
±n_:=Tr[±(n-±(n-#))&/@{1,2}]

ฉันอาจให้รางวัลแก่คุณมากกว่า 200 ครั้งถ้าคุณทำใน Retina
Leun Nun

@LeakyNun ไม่เป็นไร? :)
Martin Ender

สองวันต่อมา.
Leun Nun

@LeakyNun เร็ว ๆ นี้คุณกำลังจะไม่มีตัวแทนเหลืออยู่ถ้าคุณให้รางวัลอย่างง่ายดาย
mbomb007

ขอให้เรายังคงอภิปรายนี้ในการแชท
LegionMammal978

4

เยลลี่ , 15 14 ไบต์

2Rạ⁸߀$⁺Sµ1>?2

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด (ใช้เวลาสองสามวินาที)

มันทำงานอย่างไร

2Rạ⁸߀$⁺Sµ1>?2  Main link. Argument: n (integer)

2R              Yield [1, 2].
      $         Combine the previous three links into a monadic chain.
   ⁸                Yield n.
  ạ                 Take the absolute difference of the return value and n.
    ߀              Recursively call the main link on each result.
       ⁺            Duplicate the chain.
                    The first copy maps [1, 2] to [a(n - 1), a(n - 2)].
                    The second copy maps [a(n - 1), a(n - 2)] to
                    [a(n - a(n - 1)), a(n - a(n - 2))].
        S           Take the sum.
         µ          Combine all links to the left into a chain.
            ?       If...
           > 2          n is greater than 2, call the chain.
          1         Else, return 1.

ฉันอาจให้ความช่วยเหลือแก่คุณมากกว่า 400 ถ้าคุณทำมันใน Sesos
Leun Nun

@LeakyNun ดูเหมือนว่าจะมีคำตอบของ Sesos มันออกมาหนึ่งวันหลังจากความคิดเห็นของคุณ
Yytsi

4

เจลลี่ , 14 12 11 ไบต์

ịḣ2S;
1Ç⁸¡2ị

นี่เป็นวิธีการวนซ้ำ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

1Ç¡2ị   Main link. Argument: n

1       Set the return value to 1.
 Ç¡     Call the helper link n times, updating the return value after each call.
   2ị   Extract the second element of the resulting array.


ịḣ2S;   Helper link. Argument: A (array)

ị       At-index; retrieve the elements of A at the values of A.
 ḣ2     Head 2; extract the first two results.
    S   Take the sum of the result.
     ;  Prepend the sum to A.

3

Python ขนาด45 40 ไบต์

a=lambda n:n<3or a(n-a(n-1))+a(n-a(n-2))

การตีความไร้เดียงสาที่เรียบง่ายของความท้าทาย

บันทึก 5 ไบต์ด้วย @LeakyNun!


3

Haskell, 39 37 ไบต์

h n|n<3=1|n>2=h(n-h(n-1))+h(n-h(n-2))

เหมือนที่อธิบายไว้ในความท้าทายโดยใช้ยาม


ขออภัยฉันไม่เห็นวิธีแก้ไขปัญหาของคุณก่อนโพสต์โซลูชัน Haskell (เหมือนกัน) ของฉัน อย่างไรก็ตามไบต์นั้นไม่นับ 38 เนื่องจากต้องขึ้นบรรทัดใหม่หรือไม่
Laikoni

และป้องกันจะต้องมีn<3สำหรับที่จะเป็นh 2 1
Laikoni

@Laikoni เป็น 37 ตามคุณลักษณะ Pythons len ด้วยสตริง multiline ("" ") เว้นแต่คุณจะนับบรรทัดใหม่เป็นสองไบต์ใช่ฉันสังเกตเห็นสิ่งอื่น ๆ ที่ได้รับการแก้ไขแล้วในตอนนี้
KarlKastor

TIL notepad ++ จะนับบรรทัดใหม่เป็นอักขระสองตัว
Laikoni

@Laikoni ได้ยกเลิกการขึ้นบรรทัดใหม่แล้ว 37 ไบต์ไม่อาจโต้แย้งได้
KarlKastor



3

C #, 51 44 ไบต์

int a(int n)=>n<3?1:a(n-a(n-1))+a(n-a(n-2));

ฉันสงสัยว่ามันจะสั้นลงได้ไหมโดยทำให้มันไม่ระบุชื่อ ขอบคุณ pinkfloydx33!


1
c # 6 ฟังก์ชั่นการแสดงออกของร่างกายint a(int n)=>n<3?1:a(n-a(n-a))+a(n-a(n-2));
pinkfloydx33

ดูเหมือนว่าฉันพิมพ์ในขณะที่พิมพ์บนโทรศัพท์ของฉัน ส่วนที่มากที่สุด-aใน parens ชุดแรกควรเป็น-1
pinkfloydx33

ฉันไม่ได้สังเกตเห็นด้วยเช่นกันไม่สามารถแก้ไขได้ rq
downrep_nation

3

JavaScript (ES6), 45 ไบต์ 34 ไบต์

โซลูชันแบบเรียกซ้ำใน ES6 คำแนะนำการเล่นกอล์ฟใด ๆ ชื่นชมมาก

a=n=>n>2?a(n-a(n-1))+a(n-a(n-2)):1

ขอบคุณ/ u / ismilloสำหรับการย่อให้สั้นยิ่งขึ้น




2

APL, 20 ไบต์

{⍵≤2:1⋄+/∇¨⍵-∇¨⍵-⍳2}

คำอธิบาย:

{⍵≤2:1⋄+/∇¨⍵-∇¨⍵-⍳2}
 ⍵≤2:1               If argument is 2 or less, return 1
      ⋄              Otherwise:
               ⍵-⍳2  Subtract [1, 2] from the argument
             ∇¨      Recursive call on both
           ⍵-        Subtract both results from the argument     
         ∇¨          Recursive call on both again
       +/            Sum          

2

VBA Excel 87 ไบต์

Non-recursive เนื่องจากฉันต้องการให้มันใช้งานได้กับ n = 100000 พูดว่า:

Function A(N):ReDim B(N):For i=3 To N:B(i)=B(i-B(i-1)-1)+B(i-B(i-2)-1)+1:Next:A=B(N)+1

... และกดreturn(byte # 87) ที่ท้ายบรรทัดเพื่อรับEnd Functionข้อความ "ฟรี" โปรดทราบว่าค่า B ถูกชดเชยด้วย -1 เพื่อหลีกเลี่ยงการเริ่มต้นสำหรับ n = 1 และ 2

เรียกใช้สเปรดชีตตามปกติเช่น=A(100000)เพื่อรับ48157

รุ่น recursive, 61 ไบต์ ,

Function Y(N):If N<3 Then Y=1 Else Y=Y(N-Y(N-1))+Y(N-Y(N-2))

เริ่มช้าลงอย่างไม่มีเหตุผลสำหรับ n> 30 และไม่สามารถพูดได้ว่าทำงานได้เลยสำหรับ n> 40


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

1
@ mbomb007 เนื่องจากฉันไม่มีทางชนะกอล์ฟฉันจะตัดสินใจด้วยตัวเองในสิ่งที่ถือเป็นโปรแกรมที่ทำงานได้ ไม่สามารถจัดการแม้แต่จำนวนเต็มไบต์เดียวก็ไม่ดีเท่าที่ฉันกังวลเมื่อมีวิธีแก้ปัญหาที่สามารถทำได้อย่างง่ายดาย
Joffan

2

Ruby, 36 ไบต์

การดำเนินการโดยตรง คำแนะนำการเล่นกอล์ฟใด ๆ ยินดีต้อนรับ

a=->n{n<3?1:a[n-a[n-1]]+a[n-a[n-2]]}

ตอนนี้, คุณสามารถกำจัด a = ได้ หากคุณโพสต์ไว้ที่นี่จะพอเพียงเมื่อรหัสของคุณเริ่มต้นด้วย -> มันนับเป็นฟังก์ชั่นที่ไม่ระบุชื่อแล้ว
Seims

@Seims แต่น่าเสียดายที่ฟังก์ชั่นเรียกตัวเองด้วยa[n-1]และฟังก์ชั่นดังกล่าวจะต้องมีชื่อ
Sherlock9

2

Java 7 68 61 51 ไบต์

17 บันทึกแล้วขอบคุณ Leaky Nun

int a(int n){return n<3?1:a(n-a(n-1))+a(n-a(n-2));}

ยินดีต้อนรับสู่ PPCG!
AdmBorkBork

ยินดีต้อนรับสู่ PPCG! คุณอาจชอบเคล็ดลับสำหรับการเล่นกอล์ฟในชวา รูปแบบอื่นจะเป็น: int a(int n){return n<3?1:a(n-a(n-2))+a(n---a(n));}แต่น่าเสียดายที่มันใช้จำนวนไบต์เท่ากันกับคำตอบที่คุณมีอยู่แล้ว .. และฉันจะระบุว่าคำตอบของคุณอยู่ใน Java 7 เนื่องจากคำตอบของ Java 8 จะสั้นกว่า: n->return n<3?1:a(n-a(n-1))+a(n-a(n-2))( 39 ไบต์ ) .
Kevin Cruijssen

ขอบคุณสำหรับการต้อนรับพวกและขอบคุณสำหรับเคล็ดลับใน Java8 - ฉันไม่ได้ตระหนักว่าลูกแกะได้รับอนุญาตเช่นนั้น - แม้ว่าพวกเขาจะได้รับอนุญาตแบบนั้นใน Python ดังนั้นฉันเดาว่าฉันไม่เคยคิดถึงมันเลย แลมบ์ดาต้องการเซมิโคลอนหรือไม่?
Justin

@JustinTervay ฉันไม่ได้ใช้ Java 8 เป็นจำนวนมาก แต่จากสิ่งที่ฉันได้ยินมาเซมิโคลอนไม่ได้ถูกนับในการแสดงออกบรรทัดเดียวตามความคิดเห็นโดย@DavidConradและ@ CAD97ในหนึ่งในคำตอบ Java ของฉันเอง .
Kevin Cruijssen

2

Oasis , 9 7 5 ไบต์ (ไม่ใช่การแข่งขัน)

ไม่ใช่การแข่งขันเนื่องจากภาษาโพสต์ความท้าทาย ขอบคุณKenny Lauสำหรับการบันทึก 4 ไบต์ รหัส:

ece+V

แบบฟอร์มขยาย ( Vย่อมาจาก11):

a(n) = ece+
a(0) = 1
a(1) = 1

รหัส:

e        # Stack is empty, so a(n - 1) is used, and it calculates a(n - a(n - 1))
 c       # Calculate a(n - 2)
  e      # Calculate a(n - a(n - 2))
   +     # Add up

ลองออนไลน์! . คำนวณ n = 1,000 ใน 0.1 วินาที


1

PowerShell v2 +, 85 79 69 ไบต์

param($n)$b=1,1;2..$n|%{$b+=$b[$_-$b[$_-1]]+$b[$_-$b[$_-2]]};$b[$n-1]

จะเข้า$nชุด$bจะเป็นอาร์เรย์ของแล้วจะเข้าสู่วงจาก@(1, 1) 2 .. $nการวนซ้ำแต่ละครั้งเราจะ$bทำการคำนวณล่าสุดในลำดับด้วยการเรียบง่าย+=และนิยามของลำดับ จากนั้นเราจะส่งออกจำนวนที่เหมาะสมจาก$b(โดยมี-1เพราะอาร์เรย์ใน PowerShell นั้นไม่มีค่าดัชนี) งานนี้ถ้า$nเป็น1หรือ2เพราะทั้งสองของค่าเหล่านั้นจะถูก pre-ประชากรออกเป็นดัชนีที่ต่ำกว่าของ$bจากจุดเริ่มต้นดังนั้นแม้ว่า tacks ห่วงขยะก็ไม่สนใจอยู่แล้ว


โซลูชันแบบเรียกซ้ำ78 76 ไบต์

$a={param($k)if($k-lt3){1}else{(&$a($k-(&$a($k-1))))+(&$a($k-(&$a($k-2))))}}

ครั้งแรกที่ฉันใช้แลมบ์ดาเป็นคำตอบโดยปกติแล้ววิธีแก้ซ้ำจะสั้นกว่า (อย่างที่คุณเห็นจาก parens ซ้อนกันทั้งหมด) แต่ในกรณีนี้ parens ที่ซ้อนกันเกือบจะซ้ำกันในโซลูชันวนซ้ำด้วยการเรียก array ที่ซ้อนกันดังนั้นโซลูชันแบบเรียกซ้ำจะสั้นลง ไม่วิธีแก้ซ้ำ ๆ จะสั้นกว่าจริง ๆ (ดูด้านบน)

&$a 20เรียกว่าผ่านการดำเนินการที่ผู้ประกอบการเช่น เพียงแค่เรียกซ้ำแบบเรียกซ้ำ


1

JavaScript (ES6), 66 ไบต์

n=>[...Array(n+1)].reduce((p,_,i,a)=>a[i]=i<3||a[i-p]+a[i-a[i-2]])

เวอร์ชันที่ไม่ใช่แบบเรียกซ้ำเพื่อความรวดเร็ว รุ่นเรียกซ้ำอาจสั้นกว่านี้ แต่ฉันจะปล่อยให้คนอื่นเขียน reduceฉันมักจะชอบมันเมื่อฉันได้รับกับการใช้งาน หมายเหตุ: 1 ไบต์บันทึกไว้โดยกลับมาtrue(ซึ่งปลดเปลื้องไป1เมื่อนำมาใช้ในบริบทจำนวนเต็ม) สำหรับของและa(1)a(2)



1

มา, 76 ไบต์

ในที่สุดฉันก็ทำให้มันทำงานได้!

: Q recursive dup dup 3 < if - 1+ else 2dup 2 - Q - Q -rot 1- Q - Q + then ;

ลองออนไลน์

คำอธิบาย:

: Q recursive                           \ Define a recursive function Q
    dup dup 3 <                         \ I moved a dup here to golf 2 bytes
    if                                  \ If n < 3, return 1
        - 1                             \ Golf: n-n is zero, add one. Same as 2drop 1+
    else
        2dup 2 - Q - Q                  \ Copy n until 4 on stack, find Q(n-Q(n-2))
        -rot                            \ Move the result below 2 copies of n
        1- Q - Q +                      \ Find Q(n-Q(n-2)), then add to previous ^
    then ;

ลองออนไลน์ (ไม่ได้ตีกอล์ฟจากด้านบนเล็กน้อย)

น่าเสียดายที่การเรียกซ้ำซึ่งกันและกันนั้นค่อนข้างใช้คำพูดเกินจริงในการเล่นกอล์ฟ


1

เมเปิ้ล43 41 ไบต์

a:=n->`if`(n>2,a(n-a(n-1))+a(n-a(n-2)),1)

การใช้งาน:

> a(1);
  1
> a(20);
  12

ปัญหานี้เป็นตัวเลือกที่ดีในการบันทึก ใช้แคชตัวเลือกเวลาการทำงานจะลดลงอย่างมีนัยสำคัญ:

aC := proc(n) 
      option cache; 
      ifelse( n > 2, aC( n - aC(n-1) ) + aC( n - aC(n-2) ), 1 ); 
end proc:

สามารถมองเห็นได้โดยใช้:

CodeTools:-Usage( aC(50) );

0

J, 29 28 ไบต์

1:`(+&$:/@:-$:@-&1 2)@.(2&<)

ใช้นิยามแบบเรียกซ้ำ

การใช้

คำสั่งพิเศษใช้สำหรับการจัดรูปแบบอินพุต / เอาท์พุตหลายรายการ

   f =: 1:`(+&$:/@:-$:@-&1 2)@.(2&<)
   (,:f"0) >: i. 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 1 2 3 3 4 5 5 6  6  6  8  8  8 10  9 10 11 11 12

คำอธิบาย

1:`(+&$:/@:-$:@-&1 2)@.(2&<)  Input: n
                        2&<   If n < 2
1:                              Return 1
                              Else
               -&1 2            Subtract [1, 2] from n to get [n-1, n-2]
            $:@                 Call recursively on n-1 and n-2
           -                    Subtract each of the results from n
        /@:                     Reduce using
      $:                          A recursive call on each
    +&                            Then summation
                                Return that value as the result

0

dc, 62 ไบต์

?si2sa1dd2:a:a[la1+dsadd1-;a-;alad2-;a-;a+r:ali;a0=A]dsAxli;af

วิธีนี้ใช้ประโยชน์จากอาร์เรย์และการเรียกซ้ำ

?si          # Take input from stdin and store it in register `i'
2sa          # Initialise register `a' with 2, since we'll be putting in the first
             #   two values in the sequence
1dd2         # Stack contents, top-down: 2 1 1 1
:a           # Pop index, then pop value: Store 1 in a[2]
:a           # Ditto:                     Store 1 in a[1]
[            # Open macro definition
 la 1+ dsa   # Simple counter mechanism: Increment a and keep a copy on stack

# The STACK-TRACKER(tm): Top of stack will be at top of each column, under the
#   dashed line. Read commands from left to right, wrapping around to next line.
#   This will be iteration number n.
  dd   1-    ;a       -          ;a            la            d          
#-----------------------------------------------------------------------
# n    n-1   a[n-1]   n-a[n-1]   a[n-a[n-1]]   n             n          
# n    n     n        n          n             a[n-a[n-1]]   n          
# n    n     n                                 n             a[n-a[n-1]]
#                                                            n          
#                                                                       

  2-            ;a            -             ;a            +      r    :a
#-----------------------------------------------------------------------
# n-2           a[n-2]        n-a[n-2]      a[n-a[n-2]]   a[n]   n      
# n             n             a[n-a[n-1]]   a[n-a[n-1]]   n      a[n]   
# a[n-a[n-1]]   a[n-a[n-1]]   n             n                           
# n             n                                                       

 li;a        # Load index of target element, and fetch that element's current value
             #    Uninitialised values are zero
 0=A         # If a[i]==0, execute A to compute next term
]dsAx        # Close macro definition, store on `A' and execute
li;a         # When we've got enough terms, load target index and push value
f            # Dump stack (a[i]) to stdout

โดยสรุปหากใครกำลังสร้าง IDE dcให้แจ้งให้เราทราบ!
Joe


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