Długość sekwencji sumaka [zamknięte]

11

Sekwencja sumaka zaczyna się od dwóch liczb całkowitych: t 1 it 2 .

Następny termin, t 3 , = t 1 - t 2

Mówiąc bardziej ogólnie, t n = t n-2 - t n-1

Sekwencja kończy się, gdy t n <0.

Twoje wyzwanie: Napisz program lub funkcję, która wypisze długość sekwencji Sumaka, zaczynając od t 1 it 2 .

  • t 1 it 2 są liczbami całkowitymi z zakresu twojego języka.
  • Obowiązują standardowe luki.

Przypadki testowe

t1  t2       sumac_len(t1,t2)

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

Bonus uliczny kredytowy:

3    -128    1
-314 73      2

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.

SIGSTACKFAULT
źródło
Ściśle spokrewniony , jeśli nie duplikat
Pan Xcoder
2
To wydaje się być dobrym wyzwaniem, ale jest trochę niejasne. Czy powinniśmy brać t1i t2jako wkład? A co jest iw przypadkach testowych?
caird coinheringaahing
2
Czy jest gwarantowane, że t1 it2 są> = 0?
user202729,
6
@Blacksilver Huh? Czym dokładnie jest ten bonus? Bonus na ogół zniechęca anyway
Luis Mendo
6
Czy musimy sobie poradzić t_1 = t_2 = 0? Czy „bonusowa uliczna ulga” oznacza, że ​​nie musimy sobie radzić, t_1 < 0czy t_2 < 0?
xnor

Odpowiedzi:

8

Łuska , 8 bajtów

→V<¡oG-↔

Pobiera dane wejściowe jako listę 2-elementową. Wypróbuj online!

Wyjaśnienie

→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
Zgarb
źródło
8

Haskell , 22 bajty

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

Wypróbuj online!

Naprawdę chciałbym mieć sposób na dopasowanie wzorca dla liczby ujemnej ...

Wyjaśnienie

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
całkowicie ludzki
źródło
Myślę, że chociaż raz wyjaśnienie jest mniej jasne niż sam kod. : P
Ad Hoc Garf Hunter
@WheatWizard To najprawdopodobniej dlatego, że obciągam wyjaśnienia. : P
totalnie ludzki,
3

Łuska , 12 11 bajtów

V<0t¡ȯF-↑2↔

Wypróbuj online!

Bierze bonus uliczny za cokolwiek, co jest warte.

Wyjaśnienie

    ¡ȯ       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.
Martin Ender
źródło
2

Ruby , 29 bajtów

->a,b{(1..a).find{a<b=a-a=b}}

Wypróbuj online!

GB
źródło
a<b=a-a=b... Jak Ruby analizuje to ...?
całkowicieludzki
2

MATL , 13 bajtów

`yy-y0<~]N2-&

Obsługuje negatywne dane wejściowe (dwa ostatnie przypadki testowe).

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

`        % 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
Luis Mendo
źródło
2

Brain-Flak , 142 90 bajtów

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

Wypróbuj online!

Niezbyt krótki. Cofa dane wejściowe do tyłu.

Wyjaśnienie

(
 (())   #Push 1
 {      #Until 0
  {}    #Pop (+1 to counter)
  <(({}({}))[({}[{}])({})])  #tn = tn-1 - tn-2
  ([(({})<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}>  #Greater than 0?
 }      #End loop
 <>     #Get rid of everything
)       #Push result
Ad Hoc Garf Hunter
źródło
2

05AB1E , 11 bajtów

[DŠ-D0‹#]NÌ

Wypróbuj online!

Wyjaśnienie

Pobiera dane wejściowe jako 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
Emigna
źródło
1

Mathematica, 55 bajtów

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

Wypróbuj online!

a teraz regularne nudne podejście @totallyhuman

Mathematica, 25 bajtów

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

Wypróbuj online!

J42161217
źródło
Do Twojej wiadomości, zwykłe nudne podejście jest krótsze o ponad połowę .
całkowicie ludzki,
1
@ totalnie ludzki nudny rzeczywiście ... można zapisać bajt #1do#
J42161217
1

J , 22 bajty

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

Jak to dział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)

Wypróbuj online!

Galen Iwanow
źródło
1

C (gcc) , 32 27 26 bajtów

-5 bajtów dzięki nadużywaniu gcc przez całkowicie ludzkie (wydaje się, że działa również na tcc)
-1 bajtów dzięki PrincePolka

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

Wypróbuj online!

szkocki
źródło
26 bajtów, ponieważ b <0 oznacza 1, zmień? 1: 1 na?: 1
PrincePolka
0

JavaScript (ES6), 24 bajty

Zwraca true zamiast 1 .

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

Przypadki testowe

Arnauld
źródło
1
@totallyhuman W takim razie nie potrzebujesz f(b)(a-b)oszczędzania.
Pan Xcoder,
Co jeśli a<0? (
Pozostało
Aktualizacja: nie musisz już obsługiwać negatywnych danych wejściowych, ale jeśli tak, to fajnie.
SIGSTACKFAULT
0

Pyth , 11 bajtów

Jest to funkcja rekurencyjna, która przyjmuje dwa argumenty Gi H. Link jest nieco zmodyfikowany, aby faktycznie wywołać funkcję na danym wejściu.

M|<H0hgH-GH

Zestaw testowy.

Pan Xcoder
źródło
0

APL (Dyalog) , 23 bajty

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

Wypróbuj online!

W jaki sposób?

2∘ - z początkowym akumulatorem 2,

-/⍵ - jeśli następny semestr

0> - jest poniżej 0,

- zwróć akumulator. Inaczej,

(⍺+1) - zwiększyć akumulator

- i powróć do

-⍨\⌽⍵ - ostatnie dwa elementy zostały odwrócone i zróżnicowane.

      {⍵} 8 2
8 2
      {⌽⍵} 8 2
2 8
      {-⍨\⌽⍵} 8 2
2 6
Uriel
źródło
0

dc , 24 bajty

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

Wypróbuj online!

Wyjaśnienie

?                         # 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
ბიმო
źródło
0

Zespół Z80, 10 bajtów

Ta wersja próbuje wykonać zadanie typu „street cred”. Jednak w sugerowanym przypadku testowym, w którym t1 = -314, t2 = 73, program ten generuje odpowiedź „0”, co, szczerze mówiąc, ma nieco więcej sensu niż „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

Program testowy dla ZX Spectrum 48K napisany przy użyciu asemblera Sjasmplus można pobrać tutaj . Dostępna jest również skompilowana migawka .

introspec
źródło
Prawdopodobnie Loop: ret czamiast tego korzysta wersja bez premii ?
Neil,
Tak, sprawdzanie bitu znaku H nie byłoby już potrzebne. „bit 7, h” można usunąć, a „ret nz” zastąpić „ret c”, przy czym „inc a” przesuwa się tuż przed nim. Łącznie 8 bajtów.
introspec
Tak; 2wynik jest tak naprawdę rzeczą z mojego programu.
SIGSTACKFAULT
Czy masz na myśli, że 0jest to akceptowalna odpowiedź dla tego przypadku testowego? Czy masz na myśli, że lepiej byłoby zmodyfikować mój program tak, aby wyświetlał dane wyjściowe 2?
introspec
0

Java (OpenJDK 8) , 85 75 bajtów

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

Wypróbuj online!

bez golfa:

(b,c)->{
    int d,k=1;
    for(;;){
        if(c<0)
            break;
        else{
            d=c;
            c=b-c;
            b=d;
            k++;
        }
    }
    return k;
};
Luca H.
źródło
1
Wierzę, że byłby krótszy jak lambda.
Potato44,
@ Potato44 rzeczywiście, ale nie miałem wczoraj czasu, aby to zrobić, ale zrobiłem to teraz i zaoszczędziłem 10 bajtów.
Luca H,
59 bajtów
ceilingcat
0

Perl 6 ,24 19 bajtów

-5 bajtów dzięki Brad Gilbert b2gills.

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

Wypróbuj online!

Objaśnienie : Całą rzeczą w nawiasach jest dokładnie ta sekwencja ( |@_są to pierwsze 2 warunki (= dwa parametry), *-*jest funkcją, która pobiera dwa argumenty i zwraca ich różnicę, i * <0jest warunkiem zatrzymania (termin mniejszy niż 0) Pomijamy ostatni termin ^po ...). Następnie wymuszamy kontekst liczbowy przez +operatora, co daje długość sekwencji.

Ramillies
źródło
{+(|@_,*-*...^0>*)}
Brad Gilbert b2gills
@ BradGilbertb2gills: Dziękuję. Miałem dużą przerwę w grze w golfa, więc jestem trochę zardzewiały. Nie rozumiem jednak, dlaczego musisz umieścić to miejsce w * <0*, but why you don't need it in 0> * `...
Ramillies
Miejsce jest potrzebne, żeby się nie pomylić%h<a>
Brad Gilbert b2gills,