Длина последовательности сумаха [закрыто]


11

Последовательность Sumac начинается с двух целых чисел: t 1 и t 2 .

Следующий член, t 3 , = t 1 - t 2

В более общем смысле, t n = t n-2 - t n-1

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

Ваша задача: написать программу или функцию, которая печатает длину последовательности Sumac, начиная с 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 Coneheringaahing

2
Гарантируется ли, что t1 и t2> = 0?
user202729

6
@ Blacksilver А? Что это за бонус? Bonus , как правило , не рекомендуется в любом случае
Luis Mendo

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

Ответы:


8

Шелуха , 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

@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

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]]&

Попробуйте онлайн!


К вашему сведению, обычный скучный подход менее чем в два раза дольше .
полностью человек

1
@totallyhuman скучны действительно ... вы можете сохранить байты #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)

Попробуйте онлайн!




0

JavaScript (ES6), 24 байта

Возвращает истину вместо 1 .

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

Контрольные примеры


1
@totallyhuman Тогда вам не нужно f(b)(a-b)экономить.
г-н Xcoder

Что если a<0? (
Осталось

Обновление: вам больше не нужно поддерживать отрицательный ввод, но это здорово, если вы это сделаете.
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

постоянный ток , 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вместо этого используется не бонусная версия ?
Нил

Да, проверка знака знака H больше не понадобится. «Бит 7, h» может быть удален, а «ret nz» заменен на «ret c», а «inc a» перемещается прямо перед ним. Всего 8 байтов.
интроспект

Да уж; 2результат действительно просто вещь с моей программой.
SIGSTACKFAULT

Вы имеете в виду, что 0это приемлемый ответ для этого теста? Или вы имеете в виду, что было бы лучше изменить мою программу для вывода 2?
интроспект

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 байтов.
Лука Х



0

Perl 6 ,24 19 байт

-5 байт благодаря Брэду Гилберту b2gills.

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

Попробуйте онлайн!

Объяснение : Все, что в скобках - это именно та последовательность, о которой идет речь ( |@_это первые 2 слагаемых (= два параметра), *-*это функция, которая принимает два аргумента и возвращает их разность, и * <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.