拡張フィボナッチ数のインデックス付け


21

あなたはおそらくフィボナッチ数を聞いたことがあるでしょう。や、知っている、その整数シーケンスはで始まり1, 1、新しい番号はそれぞれ最後の2つの合計ですか?

1 1 2 3 5 8 13...

等々。フィボナッチ数に関する課題は、ここでかなり人気があります。しかし、誰がフィボナッチ数列を始めなければならないと言うの1, 1でしょうか?なぜ始められなかったの0, 1ですか?それでは、0から開始するように再定義しましょう。

0 1 1 2 3 5 8 13...

しかし...私たちもそこでやめる必要はありません!最後の2つの数値を追加して次の数値を取得できる場合、2番目の数値から最初の数値を減算して新しい数値を追加することもできます。したがって、次のように開始でき1, 0ます。

1 0 1 1 2 3 5 8 13...

ネガティブになることさえあります:

-1 1 0 1 1 2 3 5 8 13...

そして、このシリーズも永遠に続きます。他のすべての数字が負になっているだけで、通常のフィボナッチ数列をミラーリングするのは面白いと思います:

13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...

このシリーズを「拡張フィボナッチ数」またはEFNと呼びましょう。明白な負の番号は上のこのシリーズを開始するために実際に存在しないので、我々はと言うでしょう0ショーアップで0、通常のフィボナッチ数は、正の指数にに延びており、負(ハーフネガティブ?)フィボナッチ数を伸ばします次のように、負のインデックスに:

Indices: ...-7  -6 -5  -4 -3  -2 -1  0  1  2  3  4  5  6  7 ...
Values:  ...13  -8  5  -3  2  -1  1  0  1  1  2  3  5  8  13...

これは今日の課題につながります。

整数Nを指定すると、EFNシリーズでNが現れるすべてのインデックスを返します。

このタスクに関するランダムな観察:

  • EFNには、他の数字よりも1回多く表示されます:[-1, 1, 2]。3か所以上に数字は表示されません。

  • 1より大きいすべてのフィボナッチ数は、1回(3、8、21など)または2回(2、5、13など)表示されます。

ルールの明確化:

  • abs(N)がフィボナッチ数でない場合、EFNシリーズには表示されないため、可能な場合は何も/空のコレクションを出力する必要があります。または、言語でそれが不可能な場合は、一定の非数値を出力できます。
  • NEFNの複数の場所に表示される場合、出力をソートする必要はありません。ただし、各インデックスは1回だけ表示する必要があります。
  • ほとんどのチャレンジでは、1ベースのインデックス付けを使用するか、0ベースのインデックス付けを使用するかを選択できますが、このチャレンジで、説明したインデックス付けを使用する必要があります(0は0で表示されます)。
  • 任意の標準形式でI / Oを実行できます。

テストケース

-13: []
-12: []
-11: []
-10: []
-9: []
-8: [-6]
-7: []
-6: []
-5: []
-4: []
-3: [-4]
-2: []
-1: [-2]
0: 0
1: [-1, 1, 2]
2: [-3, 3]
3: [4]
4: []
5: [-5, 5]
6: []
7: []
8: [6]
9: []
10: []
11: []
12: []
13: [-7, 7]

そして、いくつかのより大きなテストケース:

89: [-11, 11]
1836311903: [46]
10000: []
-39088169: [-38]

いつものように、バイト単位の最短回答が勝ちです!


ネガティブまたは非フィボナッチ数を処理する必要がないため、関連ではありますが、重複ではありません。
DJMcMayhem

12
ちなみに、正のフィボナッチ数のみを使用する場合でも、$ F_0 = 0 $になるようにフィボナッチ数に常にインデックスを付ける必要があるもう1つの理由があります。これが、この美しいプロパティを可能にするインデックスです。$ k $が$ n $を分割する場合、$ F_k $は$ F_n $を分割します。
グレッグマーティン

回答:


9

Haskell、78バイト

nimiのおかげで4バイト節約

a#b=a:b#(a-b)
f 0=[0]
f a=do{(i,x)<-zip[0..a*a+1]$0#1;[-i|x==a]++[i|abs x==a]}

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

まず、私たちが設定し(#)(#)2つのパラメータを取り、aそしてb、そして始まるリストを返すaと続きますb#(a-b)。これは無限のリストを作成しますが、Haskellは遅延しているため、永久にループすることを心配する必要はありません。これは本質的に逆方向に機能し、特定のペアの前にフィボナッチ数列を作成します。たとえば(0#1)、負のインデックスを持つすべてのフィボナッチ数のリストになります。

ここから作りfます。 シーケンス内で検索しようとしている数でfある引数aを取ります。ここでは、do表記法を使用してリストを理解します。a*a+1リスト0#11の最初の要素を取得することから始めます。関数a*a+1はフィボナッチ数列の逆数よりも速く成長するため、この範囲内でチェックすると、すべての結果が見つかることを確認できます。これにより、無限リストを検索できなくなります。そして、それぞれの値に対してx、インデックスi、あればx==a我々が見つけa、我々は返すように、シーケンスの負の半分に-iし、場合abs x==a我々は返すi負の半分の絶対値が正の半分であるためだけでなく、我々はそこにそれを見つけたので。

これは、リストを作るので、[0,0]ために0私たちは、その1の正しい出力をハードコーディング。

1:このトリックは、Οurous 'Clean answerから取られています。などがあり、ここで同じスピードアップaplies、交換するa*a+1abs a+1多くの時間を節約します。


plusに置き換えるuとバイトが節約されます:オンラインで試してみてください!a#b=a:b#(a-b)0#1
ニミ

@nimi実際に4バイトを節約します。tioリンクには3つの余分なスペースがあります。
ウィートウィザード

5

クリーン132の 120 109バイト

import StdEnv
g n|n<2=n=g(n-1)+g(n-2)
?k=[e\\p<-[0..k*k+1],e<-if(isOdd p)([~p,p]%(0,k))[p*sign k]|g p==abs k]

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

g :: Int -> Intフィボナッチ関数です。
? :: Int -> [Int]k^2+1のEFNの要素にインデックスを付けるだけです0

一定の時間内に実行されるバージョンの場合は、に変更k*k+1abs k+1ます。


1
そのリストの理解のトリックはかなりきれいです!回答に14バイトを保存します。
ウィートウィザード




1

網膜0.8.2104の 102バイト

[1-9].*
$*
(-)?(\b1|(?>\3?)(\2))*(1)$|(0)?.*
$5$1$4$4$#2$*
-1(11)+$

^1(11)+$
-$&,$&
1+
$.&
^2$
-1,1,2

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

[1-9].*
$*

入力がゼロでない限り、単項に変換します。

(-)?(\b1|(?>\3?)(\2))*(1)$|(0)?.*
$5$1$4$4$#2$*

絶対値のフィボナッチインデックスを計算しますが、数値がフィボナッチ数でない場合は、ゼロでない限り削除します。これは、@ MartinEnderのフィボナッチテスト正規表現を使用します。

-1(11)+$

絶対値が奇数のフィボナッチ数である負の数を削除します。

^1(11)+$
-$&,$&

奇数の正のフィボナッチ数に負のインデックスを追加します。

1+
$.&

10進数に変換します。

^2$
-1,1,2

の追加のインデックスを追加します1


1

実際には、34バイト

;╗3*;±kSix⌠;;AF@;1&@0>*YτD(s**╜=⌡░

ブルートフォースが日を救う

説明:

;╗3*;±kSix⌠;;AF@;1&@0>*YτD(s**╜=⌡░
;╗                                  save a copy of the input (let's call it N) to register 0 (the main way to get additional values into functions)
  3*;±                              -3*N, 3*N
      kSi                           push to list, sort, flatten (sort the two values on the stack so that they are in the right order for x)
         x                          range(min(-3*N, 3*N), max(-3*N, 3*N))
          ⌠;;AF@;1&@0>*YτD(s**╜=⌡░  filter (remove values where function leaves a non-truthy value on top of the stack):
           ;;                         make two copies of parameter (let's call it n)
             AF                       absolute value, Fib(|n|)
               @;                     bring a copy of n to the top of the stack and make another copy
                 1&                   0 if n is divisible by 2 else 1
                   @0>                1 if n is negative else 0 (using another copy of n)
                      *               multiply those two values (acts as logical AND: is n negative and not divisible by 2)
                       YτD            logical negate, double, decrement (maps [0, 1] to [1, -1])
                          (s          sign of n (using the last copy)
                            **        multiply Fib(|n|), sign of n, and result of complicated logic (deciding whether or not to flip the sign of the value for the extended sequence)
                              ╜=      push value from register 0, equality comparison (1 if value equals N else 0)

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




0

05AB1E、36 バイト

x*ÝʒÅfIÄQ}Ii®šë1KIdiÐ`ÉiD(ì}ëD`Èi(ë¯

より良いアプローチが必要です。>。> 0このチャレンジには6つのシナリオ(含める場合は7つ)の異なるシナリオがあり、私を殺しています。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

x            # Create a list in the range [0, (implicit) input * input * 2]
   ʒ     }     # Filter this list by:
    Åf         #  Where the Fibonacci value at that index
      IÄQ      #  Is equal to the absolute value of the input
Ii             # If the input is exactly 1:
  ®š           #  Prepend -1 to the list
ë              # Else:
 1K            #  Remove all 1s (only applies to input -1)
 Idi           #  If the input is non-negative:
    Ð`Éi   }   #   If the found index in the list is odd:
        D    #    Prepend its negative index to the list
   ë           #  Else (the input is negative):
    Di       #   If the found index in the list is even:
        (      #    Negate the found index
       ë       #   Else (found index is odd):
        ¯      #    Push an empty array
               # (Output the top of the stack implicitly as result)

いくつかの段階的な例:

Input:  Filtered indices:  Path it follows (with actions) and result:

-8      [6]                NOT 1 → neg → even index → negate index: [-6]
-5      [5]                NOT 1 → neg → odd index → push empty array: []
-1      [1,2]              NOT 1 → (remove 1) neg → even remaining index: negate index: [-2]
0       [0]                NOT 1 → even index → negate index: [0]    
1       [1,2]              1 → prepend -1: [-1,1,2]
5       [5]                NOT 1 → non-neg → odd index → Prepend neg index: [-5,5]
8       [6]                NOT 1 → non-neg → even index → (nothing): [6]


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.