Độ dài của chuỗi Sumac [đã đóng]


11

Một chuỗi Sumac bắt đầu với hai số nguyên: t 1 và t 2 .

Thuật ngữ tiếp theo, t 3 , = t 1 - t 2

Tổng quát hơn, t n = t n-2 - t n-1

Trình tự kết thúc khi t n <0.

Thử thách của bạn: Viết chương trình hoặc chức năng in độ dài của chuỗi Sumac, bắt đầu bằng t 1 và t 2 .

  • t 1 và t 2 là các số nguyên trong phạm vi ngôn ngữ của bạn.
  • Tiêu chuẩn áp dụng.

Các trường hợp thử nghiệm

t1  t2       sumac_len(t1,t2)

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

Tiền thưởng đường phố tín dụng:

3    -128    1
-314 73      2

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte thắng.


Liên quan chặt chẽ , nếu không phải là một bản sao
Ông Xcoder

2
Đây có vẻ là một thử thách tốt, nhưng có một chút không rõ ràng. Chúng ta có nên lấy t1t2làm đầu vào? Và những gì là itrong các trường hợp thử nghiệm?
caird coinheringaahing

2
Có đảm bảo rằng t1 và t2 là> = 0 không?
dùng202729

6
@Blacksilver Hả? Phần thưởng đó chính xác là gì? Bonus thường được khuyến khích nào
Luis Mendo

6
Chúng ta có phải xử lý t_1 = t_2 = 0không? "Tín dụng đường phố thưởng" có nghĩa là chúng ta không phải xử lý t_1 < 0hay t_2 < 0?
xnor

Câu trả lời:


8

Husk , 8 byte

→V<¡oG-↔

Đưa đầu vào dưới dạng danh sách 2 yếu tố. Hãy thử trực tuyến!

Giải trình

→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 byte

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

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

Tôi thực sự muốn có một cách để khớp mẫu cho một số âm ...

Giải trình

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

Tôi nghĩ rằng lời giải thích ít rõ ràng hơn bản thân mã một lần. : P
Post Rock Garf Hunter

@WheatWizard Điều đó có lẽ là vì tôi không biết giải thích. : P
hoàn toàn là

3

Husk , 12 11 byte

V<0t¡ȯF-↑2↔

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

Mất tín dụng đường phố thưởng cho bất cứ điều gì có giá trị.

Giải trình

    ¡ȯ       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 byte

`yy-y0<~]N2-&

Điều này xử lý đầu vào tiêu cực (hai trường hợp thử nghiệm cuối cùng).

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

`        % 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 byte

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

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

Không ngắn lắm. Đưa đầu vào ngược.

Giải trình

(
 (())   #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 byte

[DŠ-D0‹#]NÌ

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

Giải trình

Đưa đầu vào là 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

J , 22 byte

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

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

                  ^: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)

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




0

JavaScript (ES6), 24 byte

Trả về true thay vì 1 .

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

Các trường hợp thử nghiệm


1
@totallyhuman Sau đó, bạn sẽ không cần f(b)(a-b)tiết kiệm.
Ông Xcoder

Nếu như a<0? (Thêm 1 lần nữa)
dùng202729

Cập nhật: bạn không còn cần phải hỗ trợ đầu vào tiêu cực, nhưng thật tuyệt nếu bạn làm như vậy.
SIGSTACKFAULT


0

APL (Dyalog) , 23 byte

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

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

Làm sao?

2∘ - với tích lũy ban đầu là 2,

-/⍵ - nếu nhiệm kỳ tiếp theo

0> - dưới 0,

- trả lại bộ tích lũy. nếu không thì,

(⍺+1) - tăng tích lũy

- và tái diễn với

-⍨\⌽⍵ - hai mục cuối cùng đảo ngược và khác biệt.

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


0

dc , 24 byte

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

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

Giải trình

?                         # 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

Hội Z80, 10 byte

Phiên bản này cố gắng thực hiện phiên bản "tín dụng đường phố" của nhiệm vụ. Tuy nhiên, đối với trường hợp thử nghiệm được đề xuất trong đó t1 = -314, t2 = 73 chương trình này tạo ra câu trả lời "0", thật lòng mà nói, có ý nghĩa hơn một chút so với "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

Có thể tải xuống chương trình thử nghiệm cho ZX Spectrum 48K bằng trình biên dịch Sjasmplus tại đây . Một ảnh chụp nhanh được biên dịch cũng có sẵn .


Có lẽ phiên bản không thưởng sử dụng Loop: ret cthay thế?
Neil

Có, việc kiểm tra bit dấu của H sẽ không còn cần thiết nữa. "bit 7, h" có thể được loại bỏ và "ret nz" được thay thế bằng "ret c", với "inc a" di chuyển ngay trước nó. 8 byte hoàn toàn.
introspec

Vâng; những 2kết quả thực sự chỉ là một điều với chương trình của tôi.
SIGSTACKFAULT

Bạn có nghĩa đó 0là một câu trả lời chấp nhận được cho trường hợp thử nghiệm đó? Hay bạn có nghĩa là sẽ tốt hơn để sửa đổi chương trình của tôi thành đầu ra 2?
introspec

0

Java (OpenJDK 8) , 85 75 byte

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

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

vô dụng:

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

1
Tôi tin rằng nó sẽ ngắn hơn như một lambda.
Khoai tây44

@ Potato44 thực sự, nhưng tôi không có thời gian ngày hôm qua để làm điều đó, nhưng tôi đã làm nó bây giờ và tiết kiệm 10 byte.
Luca H



0

Perl 6 ,24 19 byte

-5 byte nhờ b2gills Brad Gilbert.

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

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

Giải thích : Toàn bộ nội dung trong ngoặc đơn chính xác là chuỗi trong câu hỏi ( |@_là 2 thuật ngữ đầu tiên (= hai tham số), *-*là một hàm lấy hai đối số và trả về sự khác biệt của chúng và * <0là điều kiện dừng (thuật ngữ nhỏ hơn 0) . Chúng tôi bỏ qua thuật ngữ cuối cùng với ^sau ...). Sau đó, chúng ta buộc bối cảnh số của +toán tử, tạo ra độ dài của chuỗi.


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

@ BradGilbertb2gills: Cảm ơn bạn. Tôi đã có một kỳ nghỉ lớn với việc chơi golf, vì vậy tôi hơi gỉ. Tuy nhiên, điều tôi không nhận được là tại sao bạn phải đặt khoảng trống vào * <0*, but why you don't need it in 0> * `...
Ramillies

Không gian là cần thiết để nó không bị nhầm lẫn với%h<a>
Brad Gilbert b2gills
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.