ความยาวของลำดับ Sumac [ปิด]


11

ลำดับ Sumac เริ่มต้นด้วยจำนวนเต็มสองจำนวน: T 1และเสื้อ2

เทอมถัดไป, t 3 , = t 1 - t 2

โดยทั่วไปแล้ว t n = t n-2 - t n-1

ลำดับจะสิ้นสุดลงเมื่อ t n <0

ความท้าทายของคุณ: เขียนโปรแกรมหรือฟังก์ชั่นที่พิมพ์ความยาวของลำดับ Sumac ที่เริ่มต้นด้วย T 1และเสื้อ2

  • t 1และ t 2เป็นจำนวนเต็มภายในช่วงภาษาของคุณ
  • ช่องโหว่มาตรฐานใช้

กรณีทดสอบ

t1  t2       sumac_len(t1,t2)

120  71      5
101  42      3
500  499     4
387  1       3

โบนัสเครดิตถนน:

3    -128    1
-314 73      2

นี่คือ code-golf ดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ



2
สิ่งนี้ดูเหมือนจะเป็นความท้าทายที่ดี แต่ก็ไม่มีความชัดเจน เราควรที่จะใช้t1และt2เป็นอินพุท? และiในกรณีทดสอบคืออะไร?
caird coinheringaahing

2
มันรับประกันได้หรือไม่ว่า t1 และ t2 คือ> = 0?
user202729

6
@ แบล็คซิลเวอร์หือ? โบนัสนั่นคืออะไรกันแน่? โบนัสโดยทั่วไปจะท้อแท้อยู่ดี
หลุยส์ Mendo

6
เราต้องจัดการt_1 = t_2 = 0หรือไม่ "โบนัสถนนเครดิต" หมายความว่าเราไม่ต้องจัดการt_1 < 0หรือt_2 < 0?
xnor

คำตอบ:


8

Husk , 8 ไบต์

→V<¡oG-↔

รับอินพุตเป็นรายการ 2 องค์ประกอบ ลองออนไลน์!

คำอธิบาย

→V<¡oG-↔  Implicit input, say p=[101,42]
   ¡      Iterate on p:
       ↔    Reverse: [42,101]
    oG-     Cumulative reduce by subtraction: [42,59]
          Result is infinite list [[101,42],[42,59],[59,-17],[-17,76],[76,-93]...
 V<       Find the first index where adjacent pairs are lexicographically increasing.
          In our example [42,59] < [59,-17], so this gives 2.
→         Increment: 3

8

Haskell , 22 ไบต์

a#b|b<0=1|c<-a-b=1+b#c

ลองออนไลน์!

ฉันหวังว่าจะมีวิธีการจับคู่รูปแบบสำหรับจำนวนลบ ...

คำอธิบาย

a#b|b<0=1|c<-a-b=1+b#c

a#b                     -- define a function (#) that takes two arguments a and b
   |b<0                 -- if b is negative...
       =1               -- return 1
         |              -- otherwise...
          c<-a-b        -- assign a-b to c...
                =  b#c  -- and return the result of (#) applied to b and c...
                 1+     -- incremented by 1

ฉันคิดว่าคำอธิบายนั้นชัดเจนน้อยกว่าโค้ดในครั้งเดียว : P
Ad Hoc Garf Hunter

@WeatWizard นั่นอาจเป็นเพราะฉันดูดคำอธิบาย : P
สิ้นเชิงมนุษย์

3

Husk , 12 11 ไบต์

V<0t¡ȯF-↑2↔

ลองออนไลน์!

ใช้เครดิตโบนัสสำหรับสิ่งที่คุ้มค่า

คำอธิบาย

    ¡ȯ       Repeatedly apply the function to the right to the list of all
             previous values and collect the results in an infinite list.
          ↔  Reverse the list of previous results.
        ↑2   Take the first two values (last two results).
      F-     Compute their difference (using a fold).
   t         Discard the first element.
V<0          Find the first index of a negative value.


2

MATL , 13 ไบต์

`yy-y0<~]N2-&

สิ่งนี้จะจัดการอินพุตที่เป็นลบ (สองกรณีทดสอบล่าสุด)

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

คำอธิบาย

`        % Do...while
  yy     %   Duplicate top two elements. Implicit inputs first time
  -      %   Subtract
  y      %   Duplicate from below: push previous term
  0<~    %   Is it 0 or greater? This is the loop condition
]        % End. Proceed with next iteration if top of the stack is true
N        % Push number of elements in stack
2-       % Subtract 2
&        % Specify that the next function, namely implicit display, should
         % only display the top of the stack

2

Brain-Flak , 142 90 ไบต์

((()){{}<(({}({}))[({}[{}])({})])([(({})<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}>}<>)

ลองออนไลน์!

ไม่สั้นมาก ใช้อินพุตย้อนกลับ

คำอธิบาย

(
 (())   #Push 1
 {      #Until 0
  {}    #Pop (+1 to counter)
  <(({}({}))[({}[{}])({})])  #tn = tn-1 - tn-2
  ([(({})<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}>  #Greater than 0?
 }      #End loop
 <>     #Get rid of everything
)       #Push result

2

05AB1E , 11 ไบต์

[DŠ-D0‹#]NÌ

ลองออนไลน์!

คำอธิบาย

ใช้อินพุตเป็น t2, t1

[             # start a loop
 DŠ           # duplicate top of stack and move it down 2 positions
   -          # subtract the top 2 values
    D0‹#      # if a copy of the top value is negative, break loop
        ]     # end loop
         NÌ   # push iteration index+2

1

Mathematica ขนาด 55 ไบต์

(t=1;While[Last@LinearRecurrence[{-1,1},#,t++]>0];t-2)&

ลองออนไลน์!

และตอนนี้วิธีการที่น่าเบื่อโดย @totallyhuman

Mathematica ขนาด 25 ไบต์

If[#2<0,1,1+#0[#2,#-#2]]&

ลองออนไลน์!


FYI, วิธีการที่น่าเบื่อปกติคือน้อยกว่าครึ่งหนึ่งเป็นเวลานาน
สิ้นเชิง

1
@tallyallyhuman น่าเบื่อแน่นอน ... คุณสามารถบันทึก byte #1ไปยัง#
J42161217

1

J , 22 ไบต์

[:#({:,-/)^:(0<{:)^:a:

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

                  ^:a: - Repeat until the result stops changing, store the results in a list
          ^:(0<{:)     - repeat if the second term is positive
   ({:,-/)             - makes a tuple (second, first minus second)
[:#                    - number of elements in the list ([: caps the fork)

ลองออนไลน์!


1

C (gcc) , 32 27 26 ไบต์

-5 ไบต์ขอบคุณการใช้ gcc อย่างไม่เหมาะสมของมนุษย์ (ดูเหมือนว่าจะใช้กับ Tcc ด้วย)
-1 ไบต์ขอบคุณ PrincePolka

f(a,b){a=b<0?:1+f(b,a-b);}

ลองออนไลน์!


26 ไบต์ตั้งแต่ b <0 หาค่าเป็น 1 เปลี่ยน? 1: 1 ถึง?: 1
PrincePolka


0

JavaScript (ES6), 24 ไบต์

ผลตอบแทนที่แท้จริงแทน 1

f=(a,b)=>b<0||1+f(b,a-b)

กรณีทดสอบ


1
@tallyallyhuman แล้วคุณจะไม่ต้องf(b)(a-b)ประหยัด
Mr. Xcoder

เกิดอะไรขึ้นถ้าa<0? (อีก 1 ไป)
user202729

อัปเดต: คุณไม่จำเป็นต้องสนับสนุนการป้อนข้อมูลเชิงลบอีกต่อไป แต่มันก็เจ๋งถ้าคุณ
SIGSTACKFAULT

0

Pyth , 11 ไบต์

นี่คือฟังก์ชันเวียนว่าจะใช้เวลาสองขัดแย้งและG Hลิงก์ถูกแก้ไขเล็กน้อยเพื่อให้สามารถเรียกใช้ฟังก์ชันบนอินพุตที่กำหนดได้

M|<H0hgH-GH

ชุดทดสอบ


0

APL (Dyalog) 23 ไบต์

2∘{0>-/⍵:⍺⋄(⍺+1)∇-⍨\⌽⍵}

ลองออนไลน์!

อย่างไร?

2∘ - ด้วยการสะสมเริ่มต้น 2

-/⍵ - ถ้าภาคต่อไป

0> - ต่ำกว่า 0

- คืนตัวสะสม มิฉะนั้น,

(⍺+1) - เพิ่มการสะสม

- และรับเงินคืนด้วย

-⍨\⌽⍵ - รายการสองรายการสุดท้ายกลับรายการและแตกต่าง

      {⍵} 8 2
8 2
      {⌽⍵} 8 2
2 8
      {-⍨\⌽⍵} 8 2
2 6


0

dc , 24 ไบต์

?[dsb-1rlbrd0<a]dsaxz1-p

ลองออนไลน์!

คำอธิบาย

?                         # read input                | 71 120
 [dsb-1rlbrd0<a]          # push string               | [string] 71 120
                dsa       # copy top to register a    | [string] 71 120
                   x      # execute the string        | -5 27 1 1 1 1
                    z     # push length of stack      | 6 -5 27 1 1 1 1
                     1-   # decrement top by 1        | 5 -5 27 1 1 1 1
                       p  # print top

 # string in register a:

  dsb                     # copy top to register b    | 71 120
     -                    # subtract                  | 49
      1                   # push 1                    | 1 49
       r                  # swap top two elements     | 49 1
        lb                # load register b           | 71 49 1
          r               # swap top two elements     | 49 71 1
           d0<a           # if top < 0 execute register a

0

ชุดประกอบ Z80 ขนาด 10 ไบต์

รุ่นนี้พยายามที่จะทำงานรุ่น "เครดิตถนน" อย่างไรก็ตามสำหรับกรณีทดสอบที่แนะนำโดยที่ t1 = -314, t2 = 73 โปรแกรมนี้ให้คำตอบ "0" ซึ่งตรงไปตรงมาให้ความรู้สึกมากกว่า "2" เล็กน้อย

SumacLen:
        xor a           ; HL = t[1], DE = t[2], A is the counter
Loop:   bit 7,h
        ret nz          ; stop if HL is negative
        inc a
        sbc hl,de       ; HL = t[3], DE = t[2]
        ex de,hl        ; HL = t[2], DE = t[3]
        jr Loop

ทดสอบโปรแกรมสำหรับ ZX สเปกตรัม 48K เขียนโดยใช้ประกอบ Sjasmplus สามารถดาวน์โหลดได้ที่นี่ ภาพรวมรวบรวมนอกจากนี้ยังมี


น่าจะเป็นรุ่นที่ไม่ใช่โบนัสใช้Loop: ret cแทน?
Neil

ใช่การตรวจสอบบิตสัญญาณของ H จะไม่จำเป็นอีกต่อไป "บิต 7, h" สามารถลบได้และ "ret nz" แทนที่ด้วย "ret c" โดยที่ "inc a" เคลื่อนที่ไปข้างหน้า 8 ไบต์พร้อมกัน
introspec

ใช่; 2ผลเป็นจริงเพียงสิ่งที่มีโปรแกรมของฉัน
SIGSTACKFAULT

คุณหมายถึงว่า 0เป็นคำตอบที่ยอมรับได้สำหรับกรณีทดสอบหรือไม่? หรือคุณหมายถึงว่ามันจะเป็นการดีกว่าที่จะปรับเปลี่ยนโปรแกรมของฉันเพื่อส่งออก2?
introspec

0

Java (OpenJDK 8) , 85 75 ไบต์

(b,c)->{int d,k=1;for(;;){if(c<0)break;else{d=c;c=b-c;b=d;k++;}}return k;};

ลองออนไลน์!

ungolfed:

(b,c)->{
    int d,k=1;
    for(;;){
        if(c<0)
            break;
        else{
            d=c;
            c=b-c;
            b=d;
            k++;
        }
    }
    return k;
};

1
ฉันเชื่อว่าสิ่งนี้จะสั้นกว่าแลมบ์ดา
Potato44

@ Potato44 แต่ฉันไม่ได้มีเวลาเมื่อวาน แต่ฉันทำตอนนี้และบันทึก 10 ไบต์
Luca H



0

เพิร์ล 6 ,24 19 ไบต์

-5 ไบต์ขอบคุณ Brad Gilbert b2gills

{+(|@_,*-*...^0>*)}

ลองออนไลน์!

คำอธิบาย : สิ่งทั้งหมดในวงเล็บคือลำดับที่เป็นปัญหา ( |@_เป็นคำ 2 คำแรก (= พารามิเตอร์ทั้งสอง)) *-*เป็นฟังก์ชันที่รับสองอาร์กิวเมนต์และส่งคืนความแตกต่างและ* <0เป็นเงื่อนไขการหยุด (คำที่น้อยกว่า 0) เราไม่ใช้คำสุดท้ายที่มี^หลังจาก...) จากนั้นเราจะบังคับบริบทตัวเลขโดยตัว+ดำเนินการซึ่งให้ความยาวของลำดับ



@ BradGilbertb2gills: ขอบคุณ ฉันมีช่วงเวลาพักใหญ่ด้วยการเล่นกอล์ฟดังนั้นฉันจึงค่อนข้างเป็นสนิม แม้ว่าสิ่งที่ฉันไม่ได้รับคือทำไมคุณต้องใส่ช่องว่างใน* <0*, but why you don't need it in 0> * `...
Ramillies

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