Sumak dizisinin uzunluğu [kapalı]


11

T: Bir sumak dizisi iki tamsayı ile başlar 1 ve t 2 .

Bir sonraki terim, t 3 , = t 1 - t 2

Daha genel olarak, t n = t n-2 - t n-1

Dizi t n <0 olduğunda sona erer .

Zorluğunuz: t 1 ve t 2 ile başlayarak Sumak dizisinin uzunluğunu yazdıran bir program veya işlev yazın .

  • t 1 ve t 2 , dilinizin aralığı içindeki tamsayılardır.
  • Standart boşluklar geçerlidir.

Test senaryoları

t1  t2       sumac_len(t1,t2)

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

Bonus sokak kredisi:

3    -128    1
-314 73      2

Bu kod golf, bayt en kısa cevap kazanır.


Yinelenen olmasa da yakından ilgili
Bay Xcoder

2
Bu iyi bir meydan okuma gibi görünüyor, ama biraz belirsiz. Biz yerlimi olacak t1ve t2girdi olarak? Ve itest vakalarında neler var ?
17:32 de caird coinheringaahing

2
T1 ve t2'nin> = 0 olduğu garanti ediliyor mu?
user202729

6
@Blacksilver Huh? Bu bonus tam olarak nedir? Bonus genellikle yine de önerilmez
Luis Mendo

6
Başa çıkmak zorunda mıyız t_1 = t_2 = 0? "CRED Bonus sokak" Biz işlemek gerekmiyor demek t_1 < 0ya t_2 < 0?
xnor

Yanıtlar:


8

Kabuk , 8 bayt

→V<¡oG-↔

Girişi 2 elemanlı bir liste olarak alır. Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin!

Gerçekten negatif bir sayı için maç desen bir yolu olsaydı ...

açıklama

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

Ben açıklama bir kez kod kendisini daha az açık olduğunu düşünüyorum. : P
Ad Hoc Garf Hunter

@WheatWizard Muhtemelen açıklamaları berbat ettiğim için. : P
totallyhuman

3

Kabuk , 12 11 bayt

V<0t¡ȯF-↑2↔

Çevrimiçi deneyin!

Ne olursa olsun bonus sokak kredisi alır.

açıklama

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

`yy-y0<~]N2-&

Bu negatif girdileri (son iki test durumu) ele alır.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

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

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

Çevrimiçi deneyin!

Çok kısa değil. Girişi geri alır.

açıklama

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

[DŠ-D0‹#]NÌ

Çevrimiçi deneyin!

açıklama

Girdiyi şu şekilde alır 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 bayt

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

Nasıl çalışır:

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

Çevrimiçi deneyin!


1

C (gcc) , 32 27 26 bayt

Totallyhuman'ın gcc kötüye kullanımı sayesinde -5 bayt (tcc üzerinde de çalışıyor gibi görünüyor)
- PrincePolka sayesinde -1 bayt

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

Çevrimiçi deneyin!


26 bayt beri, b <0 1 olarak değerlendirilir
,?


0

JavaScript (ES6), 24 bayt

1 yerine true değerini döndürür .

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

Test senaryoları


1
@totallyhuman Öyleyse f(b)(a-b)tasarruf etmeye ihtiyacınız olmaz.
Bay Xcoder

Ya eğer a<0? (1 gitmek için daha fazla)
user202729

Güncelleme: artık negatif girişi desteklemeniz gerekmiyor, ancak bunu yapıyorsanız harika.
SIGSTACKFAULT

0

Pyth , 11 bayt

Bu iki argüman alan özyinelemeli bir işlevdir Gve H. Verilen girişteki işlevi çağırmak için bağlantı biraz değiştirilir.

M|<H0hgH-GH

Test odası.


0

APL (Dyalog) , 23 bayt

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

Çevrimiçi deneyin!

Nasıl?

2∘ - 2'lik ilk akümülatörle,

-/⍵ - eğer gelecek dönem

0> - 0'ın altında,

- akümülatörü iade edin. aksi takdirde,

(⍺+1) - akümülatörü arttırın

- ve

-⍨\⌽⍵ - son iki madde tersine döndü ve farklılaştı.

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


0

dc , 24 bayt

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

Çevrimiçi deneyin!

açıklama

?                         # 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 Meclisi, 10 bayt

Bu sürüm görevin "sokak kredisi" sürümünü yapmaya çalışır. Ancak, t1 = -314, t2 = 73 olduğu önerilen test örneği için bu program, "0" cevabını üretir ve bu da açıkça "2" den biraz daha mantıklıdır.

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

Sjasmplus birleştirici kullanılarak yazılan ZX Spectrum 48K test programı buradan indirilebilir . Derlenmiş bir anlık görüntü de mevcuttur .


Muhtemelen bonus olmayan sürüm kullanıyor Loop: ret c?
Neil

Evet, H işaret bitinin kontrol edilmesi gerekmeyecek. "bit 7, h" kaldırılabilir ve "ret nz" yerine "ret c" kullanılabilir, "inc a" hemen önünde hareket eder. Toplam 8 byte.
introspec

Evet; 2Sonuç benim programla gerçekten sadece bir şeydir.
SIGSTACKFAULT

0Bu test senaryosu için kabul edilebilir bir cevap mı demek istiyorsun ? Yoksa programımı çıktı olarak değiştirmek daha iyi olur mu demek istediniz 2?
introspec

0

Java (OpenJDK 8) , 85 75 bayt

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

Çevrimiçi deneyin!

ungolfed:

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

1
Bunun lambda kadar kısa olacağına inanıyorum.
Potato44

@ Potato44 gerçekten, ama dün bunu yapacak zamanım yoktu, ama şimdi yaptım ve 10 bayt kazandım.
Luca H



0

Perl 6 ,24 19 bayt

Brad Gilbert b2gills sayesinde -5 bayt.

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

Çevrimiçi deneyin!

Açıklama : Parantez içindeki her şey tam olarak söz konusu dizidir ( |@_ilk 2 terimdir (= iki parametre), *-*iki argüman alan ve farklarını döndüren bir işlevdir * <0ve durdurma koşulu (terim 0'dan az) . Biz geçen dönem ihmal ^sonra ...). Daha sonra +sekansın uzunluğunu veren operatör tarafından sayısal bağlamı zorlarız.


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

@ BradGilbertb2gills: Teşekkür ederim. Golf ile büyük bir mola verdim, bu yüzden biraz paslıyım. Ama elde edemediğim, alanı neden * <0*, but why you don't need it in 0> * `` içine koymanız gerektiğidir .
Ramillies

Alan gereklidir, bu yüzden karıştırılmaz%h<a>
Brad Gilbert b2gills
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.