Genişletilmiş Fibonacci Sayıları İndeksleme


21

Muhtemelen Fibonacci numaralarını duymuşsunuzdur. Ya, bu tamsayı dizisi ile başlayan 1, 1ve sonra her yeni sayı son ikisinin toplamı?

1 1 2 3 5 8 13...

Ve bunun gibi. Fibonacci sayılarıyla ilgili zorluklar burada oldukça popülerdir . Ama kim Fibonacci sayıları ile başlamak zorunda olduğunu söylüyor 1, 1? Neden başlayamadılar 0, 1? Pekala, onları 0'dan başlayacak şekilde yeniden tanımlayalım:

0 1 1 2 3 5 8 13...

Ama ... Orada da durmak zorunda değiliz! Sonrakini almak için son iki sayıyı ekleyebilirsek, yeni bir sayı hazırlamak için ilk sayıyı ikinci sayıdan da çıkarabiliriz. Böylece şöyle başlayabilir 1, 0:

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

Negatiflerle bile sonuçlanabiliriz:

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

Ve bu dizi de sonsuza dek sürüyor. Sanırım normal Fibonacci sayılarını yansıtmanın nasıl bir sonuç verdiğini ilginç buluyorum.

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

Bu seriye "Genişletilmiş Fibonacci Numarası" veya EFN diyelim . Şu seriye başlamak için bariz bir negatif sayı gerçekten olmadığı için, bunu söylerim 0 gösterileri kadar 0 , düzenli Fibonacci sayıları pozitif endekslerin giriş uzatmak ve negatif (yarım-negatif?) Fibonacci sayıları uzatmak negatif endekslere, şöyle:

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...

Bu, bugünün zorluğuna yol açar:

Tamsayı N verildiğinde , N'nin EFN serisinde göründüğü her dizini döndürün .

Bu görevle ilgili rastgele bazı gözlemler:

  • 1 daha kez görünen EFN başka sayısından daha: [-1, 1, 2]. 3'ten fazla yerde hiçbir sayı görünmez.

  • Her Fibonacci sayısı> 1, bir kez (3, 8, 21 vb.) Veya iki kez (2, 5, 13, vb.) Görünecektir.

Kural Açıklamaları:

  • Eğer abs(N)bir Fibonacci sayı değil, görünmesini asla EFN çıkış şey / boş bir koleksiyon mümkünse gerekir böylece, serinin veya o sizin dilinizde mümkün değilse, çıktısını alabilirsiniz bazı sabit olmayan sayısal değer.
  • Eğer N birden fazla yerde görünür EFN , çıktı sıralanabilir gerekmez. Her indeks tam olarak bir kez görünmek zorunda olsa da.
  • En rağmen zorlukları size kullanmak isteyip istemediğinizi seçmek için izin 1 tabanlı veya indeksleme 0 tabanlı, bu meydan okuma gerekir indeksleme kullanmak açıklanan (burada 0'dan 0 görünür).
  • Herhangi bir standart formatta G / Ç alabilirsiniz.

Test Kılıfları

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

Ve bazı daha büyük test durumları:

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

Her zamanki gibi, bayt cinsinden en kısa cevap kazanır!


İlgili , yinelenen olmasa da, negatifleri veya Fibonacci olmayan sayıları işlemeyi gerektirmediğinden.
DJMcMayhem

12
Bu arada, Fibonacci sayıları her zaman endekslenmelidir, böylece sadece Fibonacci sayıları kullanılsa bile $ F_0 = 0 $ olur. Bu güzel özelliğe izin veren dizin budur: $ k $ $ n $ 'ı bölerse, $ F_k $ $ F_n $' ı böler.
Greg Martin

Yanıtlar:


9

Haskell , 78 bayt

Nimi sayesinde 4 bayt kaydedildi

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

Çevrimiçi deneyin!

Önce kurmak (#), (#)iki parametre alır, ave b, ve ile başlayan bir liste döndürür ave bunu takiben b#(a-b). Bu sonsuz bir liste oluşturur, ancak Haskell tembel olduğu için sonsuza dek sürmesi için endişelenmemize gerek yoktur. Bu aslında Fibonacci dizisini belirli bir çift önce oluştururken geriye doğru çalışır. Örneğin (0#1), negatif endeksi olan tüm Fibonacci sayılarının listesi olacaktır.

Buradan başlıyoruz f. dizide bulmaya çalıştığımız sayı olan ftartışmayı alır a. Burada dobir liste anlama için gösterimi kullanıyoruz . a*a+1Listenin ilk elemanlarını 0#11 alarak başlıyoruz . İşlev a*a+1Fibonacci dizisinin tersinden daha hızlı büyüdüğünden, bu sınırın içini kontrol edersek tüm sonuçları bulacağımızdan emin olabiliriz. Bu, sonsuz bir liste aramamızı önler. Sonra her değer için xve endeks i, eğer x==abulduğumuz abiz dönmek böylece dizinin negatif yarısında -ive eğer abs x==abiz dönmek ide orada buldum bu yüzden olumsuz yarısının mutlak değeri pozitif yarısıdır çünkü.

Bu listeyi yapar beri [0,0]için 0biz bu biri için doğru çıktı hardcode.

1: Bu numara'urous 'Clean cevabından alınmıştır . Aynı hızlanma burada olduğu gibi gerçekleşir , zamandan tasarruf etmek için a*a+1ile değiştirin abs a+1.


Artı uile değiştirmek bir bayttan tasarruf sağlar: Çevrimiçi deneyin! a#b=a:b#(a-b)0#1
nimi

@nimi Aslında 4 byte kazandırır, tio bağlantınızın 3 fazladan boşluğu vardır.
Buğday Sihirbazı

5

Temiz , 132 120 109 bayt

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]

Çevrimiçi deneyin!

g :: Int -> IntFibonacci işlevi.
? :: Int -> [Int]içinde EFN unsurları içine sadece indeksleri k^2+1arasında 0.

O zaman aklı başında kestirmeniz içinde çalışır, değişim sürümü için k*k+1için abs k+1.


1
Bu liste anlama hilesi oldukça temiz! Cevabımdaki 14 baytı kaydeder.
Buğday Sihirbazı


2

JavaScript (ES6),  94  93 bayt

n=>(g=a=>a*a<n*n?g(b,b+=a,i++):a%n)(i=0,b=1)?[]:i&1?n<0?~n?[]:-2:i-1?[-i,i]:[-i,i,2]:n<0?-i:i

Çevrimiçi deneyin!

-0n=0



1

Retina 0.8.2 , 104 102 bayt

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

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

Çevrimiçi deneyin! Açıklama:

[1-9].*
$*

Girdi sıfır değilse, birliğe dönüştürün.

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

Mutlak değerin Fibonacci endeksini hesaplayın, ancak sayı bir Fibonacci numarası değilse, sıfır olmadıkça silin. Bu @ MartinEnder'in Fibonacci-test regex'ini kullanıyor.

-1(11)+$

Mutlak değerleri tek Fibonacci sayıları olan negatif sayıları silin.

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

Tek pozitif Fibonacci sayıları için negatif endeksleri ekleyin.

1+
$.&

Ondalık dönüştür.

^2$
-1,1,2

İçin fazladan endeks ekleyin 1.


1

Aslında , 34 bayt

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

Kaba kuvvet günü kurtarıyor

Açıklama:

;╗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)

Çevrimiçi deneyin!




0

05AB1E , 36 bayt

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

Daha iyi bir yaklaşım olmalı ..>.> 0Bu zorluk için altı (veya eklersek yedi ) farklı senaryolar var ve bu beni öldürüyor ..

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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)

Bazı adım adım örnekler:

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]


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.