Sumacシーケンスの長さ[終了]


11

Sumacシーケンスは、t 1およびt 2の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
これは良い挑戦のようですが、少し不明確です。私たちは取ることになっているt1t2、入力として?そしてi、テストケースには何がありますか?
コイナーリンガーをケア

2
t1とt2が> = 0であることが保証されていますか?
user202729

6
@Blacksilverえ?そのボーナスは正確に何ですか?ボーナスはとにかく一般的にはお勧めできませ
ルイスメンドー

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
ポストロックガーフハンター

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

これは負の入力を処理します(最後の2つのテストケース)。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

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





0

JavaScript(ES6)、24バイト

1の代わりにtrueを返します。

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

テストケース


1
@totallyhuman次にf(b)(a-b)、保存する必要はありません。
ミスターXcoder

もしもしa<0?(あと1つ)
-user202729

更新:負の入力をサポートする必要はなくなりましたが、そうするのはクールです。
SIGSTACKFAULT

0

Pyth、11バイト

これは2つの引数を取る再帰関数である、GH。リンクは、指定された入力で実際に関数を呼び出すためにわずかに変更されます。

M|<H0hgH-GH

テストスイート。


0

APL(Dyalog)、23バイト

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

オンラインでお試しください!

どうやって?

2∘ -初期アキュムレーターが2の場合

-/⍵ -次の用語の場合

0> -0未満、

-アキュムレーターを返します。さもないと、

(⍺+1) -アキュムレーターを増やす

-そして再帰

-⍨\⌽⍵ -最後の2つの項目が逆転し、差異が生じました。

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


0

dc、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

Sjasmplusアセンブラーを使用して記述されたZX Spectrum 48Kのテストプログラムは、ここからダウンロードできます。コンパイルされたスナップショットも利用できます


おそらく、非ボーナスバージョンはLoop: ret c代わりに使用しますか?
ニール

はい、Hの符号ビットをチェックする必要はなくなりました。「ビット7、h」を削除し、「ret nz」を「ret c」に置き換えることができます。「inc a」はその直前に移動します。全部で8バイト。
イントロ

うん; 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 624 19バイト

Brad Gilbert b2gillsのおかげで-5バイト。

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

オンラインでお試しください!

説明:括弧内のすべてがまさに問題のシーケンス(|@_最初の2つの用語(= 2つのパラメーター)で*-*あり、2つの引数を取り、それらの差を返す関数で* <0あり、停止条件(0未満の用語)です) 。)の^後の最後の用語は省略し...ます。次に、+演算子によって数値コンテキストを強制し、シーケンスの長さを求めます。


{+(|@_,*-*...^0>*)}
ブラッドギルバートb2gills

@ BradGilbertb2gills:ありがとう。私はゴルフで大きな休憩をとったので、少しさびています。私は何を得ることはありません、あなたがスペースを入れなければならない理由、ですが、* <0*, but why you don't need it in 0> * `...
Ramillies

混乱しないようにスペースが必要です%h<a>
Brad Gilbert b2gills
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.