Довжина послідовності Сумака [закрито]


11

Послідовність Сумака починається з двох цілих чисел: t 1 і t 2 .

Наступний доданок, t 3 , = t 1 - t 2

Більш загально, t n = t n-2 - t n-1

Послідовність закінчується, коли t n <0.

Ваше завдання: Напишіть програму або функцію, яка друкує довжину послідовності Сумака, починаючи з t 1 і t 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

Це код-гольф, тому найкоротша відповідь у байтах виграє.


Тісно пов’язаний , якщо не дублікат
Містер Xcoder

2
Це здається гарним викликом, але трохи незрозумілим. Ми повинні брати t1і t2як внесок? А що iв тестових випадках?
caird coinheringaahing

2
Чи гарантовано, що t1 і t2> = 0?
користувач202729

6
@Blacksilver Так? Який саме цей бонус? Bonus , як правило , що не рекомендується в будь-якому випадку
Luis Mendo

6
Чи треба впоратися t_1 = t_2 = 0? Чи означає "бонус вуличний кредит" означає, що нам не доводиться обробляти t_1 < 0чи t_2 < 0?
xnor

Відповіді:


8

Лушпиння , 8 байт

→V<¡oG-↔

Приймає дані як двоелементний список. Спробуйте в Інтернеті!

Пояснення

→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

Хаскелл , 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 Hunter Hunter

@WheatWizard Це, мабуть, тому, що я смоктав пояснення. : P
повністюлюдський

3

Лушпиння , 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

Мозг-Флак , 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


1

Математика, 55 байт

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

Спробуйте в Інтернеті!

і тепер регулярний нудний підхід від @totallyhuman

Математика, 25 байт

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

Спробуйте в Інтернеті!



1
@totallyhuman нудно дійсно ... ви можете зберегти байт #1до#
J42161217




0

JavaScript (ES6), 24 байти

Повертає справжнє замість 1 .

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

Тестові справи


1
@totallyhuman Тоді вам не знадобиться f(b)(a-b)так економити.
Містер Xcoder

Що робити, якщо a<0? (Ще 1)
користувач202729

Оновлення: вам більше не потрібно підтримувати негативний вклад, але це здорово, якщо ви зробите це.
SIGSTACKFAULT


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

постійний струм , 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 Spectrum 48K, написану за допомогою асемблера Sjasmplus, можна завантажити тут . Також доступний складений знімок .


Імовірно, використовується не-бонусна версія Loop: ret c?
Ніл

Так, перевірка бітового знаку Н більше не знадобиться. "біт 7, год" можна видалити, а "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;};

Спробуйте в Інтернеті!

неозорений:

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

1
Я вважаю, що це було б коротше, ніж лямбда.
Картопля44

@ Potato44 справді, але вчора я не встиг це зробити, але я це зробив зараз і врятував 10 байт.
Лука H



0

Perl 6 ,24 19 байт

-5 байт завдяки Бреду Гілберту b2gills.

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

Спробуйте в Інтернеті!

Пояснення : Вся справа в дужках - це саме така послідовність, про яку йдеться ( |@_це перші два терміни (= два параметри), *-*це функція, яка приймає два аргументи і повертає їх різницю, і * <0є умовою зупинки (термін менше 0) . Останній додаток пропускаємо ^після після ...). Потім ми змушуємо числовий контекст +оператором, який отримує довжину послідовності.


{+(|@_,*-*...^0>*)}
Бред Гілберт b2gills

@ BradGilbertb2gills: Дякую У мене була велика перерва з гольфом, тому я трохи іржавий. Однак у мене нічого не виходить, тому ви повинні поставити пробіл у * <0*, but why you don't need it in 0> * `...
Ramillies

Простір потрібен, щоб його не плутати%h<a>
Бред Гілберт b2gills
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.