Alternatif Güç Fibonacci Dizisi


24

Tanım

Alternatif Güç Fibonacci Dizisi aşağıdaki gibi oluşturulur.

  1. Boş dizisi ve dizi ile başlayın , n için 1 .

  2. Hesaplayın f , n , n- inci Negatif olmayan Fibonacci sayı tekrar ile.
    0 , birinci, 1 , ikinci ve üçüncü, 2 , dördüncü. Diğerleri, sıradaki önceki iki sayıyı toplayarak elde edilir, yani 3 = 1 + 2 beşinci, 5 = 2 + 3 altıncı vb.

  3. Eğer n garip, işaretini değiştirmek f n .

  4. Ekleme 2 , n-1 kopyaları f , n sekansına.

  5. N artırın ve 2. adıma geri dönün.

Bunlar APF dizisinin ilk yüz terimleridir.

 0  1  1 -1 -1 -1 -1  2  2  2  2  2  2  2  2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
 5  5  5  5  5  5  5  5  5  5  5  5  5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8

Görev

Tam bir program ya da pozitif bir tamsayı alan bir fonksiyon yazın n giriş ve baskılar veya döner N inci APF dizisinin terimi.

0-tabanlı indekslemeyi tercih ederseniz, alternatif olarak negatif olmayan bir tamsayı n alabilir ve n indeksindeki APF numarasını yazdırabilir veya geri döndürebilirsiniz .

Bu ; bayt cinsinden en kısa kod kazanabilir!

Test vakaları (1 tabanlı)

    1 ->    0
    2 ->    1
    3 ->    1
    4 ->   -1
    7 ->   -1
    8 ->    2
  100 ->   -8
  250 ->   13
  500 ->  -21
 1000 ->   34
11111 ->  233
22222 -> -377
33333 ->  610

Test vakaları (0 tabanlı)

    0 ->    0
    1 ->    1
    2 ->    1
    3 ->   -1
    6 ->   -1
    7 ->    2
   99 ->   -8
  249 ->   13
  499 ->  -21
  999 ->   34
11110 ->  233
22221 -> -377
33332 ->  610

N için herhangi bir kısıtlama var mı?
Okx

2
Algoritmanız keyfi yüksek n değerleri için çalıştığı sürece , bunun veri türünüze uygun olduğunu varsayabilirsiniz.
Dennis

1
Bunun bir OEIS numarası var mı?
Mindwin

@Mindwin Yapmaz.
Dennis,

Yanıtlar:


12

Jöle , 5 bayt

BLCÆḞ

Çevrimiçi deneyin!

Nasıl?

Fibonacci serisini, ilişkinin f(i) = f(i-2) + f(i-1)devam etmesini sağlayacak şekilde negatif dizinlere geri genişletme

  i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ...

i=0Rakamlardan geri dönersek, 2 - 1 kez tekrar etmemiz gerekenler ve Jelly's Fibonacci'nin yerleşikleri ÆḞbunları hesaplar.

İhtiyacımız olan -i(pozitif bir sayı) bit uzunluğunu alarak nve çıkartarak bulabiliriz 1.

İstediğimiz yana i(negatif bir sayı) yerine gerçekleştirebilir 1-bitLengthve jöle için atomuna sahip 1-x, Ctamamlayıcı monadın.

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21

Orada daha kısa bir yol olduğunu ama o kadar tarafından, bu 7 kaldırmak için bir yol bayt olacağını düşündüğünü biliyordum µve
mil

Yinelenen olumsuzlama zekiydi, negatif Fibonacci değerlerini hatırlayıncaya ve bunları Jelly'in monadına takmayı denemeden önce, bir kaç bayt ekleyen eksi güçlerin gücüne bakıyordum.
Jonathan Allan,

4
Dürüst olmak gerekirse,
Jelly’in

22

Python 2,30 bayt

f=lambda n:n<1or f(n/4)-f(n/2)

Çevrimiçi deneyin!

Tek endekslendi.

Dizi bir bulmaca gibi hissettirdi, Dennis'in bunu ifade etmek için kısa bir yoldan ürettiği bir şey. İki gücün tekrarı, bit kaydırmayla yinelemeyi önerir (zemine 2'ye bölünür). f(n)=f(n-2)-f(n-1)Değişken işaretli Fibonacci özyineleme , azaltma yerine bit geçişine uyarlanabilir. Her şey yoluna girdiği için temel dava iyi sonuç veriyor n=0.


6

Mathematica, 43 36 24 bayt

Fibonacci@-Floor@Log2@#&

@GregMartin sayesinde 7 bayt, @JungHwanMin sayesinde 12 bayt daha kaydedildi.


1
Birkaç bayt ile Floor@Log2@#ve yazarak tasarruf edebilirsiniz Fibonacci[t=...](ve son üsdeki boşlukları kaldırarak).
Greg Martin

1
-12 bayt: Fibonacci@-Floor@Log2@#&- Fibonacciolumsuz argümanlar da alabilir (sizin için işarete dikkat eder).
JungHwan Min

5

MATL , 19 17 16 11 bayt

lOiB"yy-]x&

Giriş 1 tabanlıdır.

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

Nasıl çalışır

1-tabanlı giriş için n , izin m, ikili genişleme hane sayısı olarak n . N, çıkış dizisinde inci terimdir m, onun işareti değiştirildi muhtemelen ile Fibonacci sırayla inci terimdir.

Bir fikir , Fibonacci dizisinin terimlerini hesaplamak için m kere tekrarlamak olacaktır . Bu for eachikili basamak dizisini kullanan bir döngü ile kolaydır . Fibonacci dizisi 0 , her zamanki gibi 1 ile başlatıldıysa , m zamanlarının yinelenmesi yığında m + 2 terimleriyle sonuçlanacaktı , böylece ilk iki sayının silinmesi gerekecekti. Bunun yerine, önce 1 , sonra 0 ile başlatıyoruz . Bu şekilde, bir sonraki oluşturulan terimler 1 , 1 , 2 , ... ve yalnızca bir silinmeye ihtiyaç duyulur.

İşareti işareti değiştirmek için başka bir döngü kullanarak mücadele edilebileceğini m sürelerini. Ama bu pahalı. Fibonacci yinelemesine eklemek yerine basitçe çıkarılarak yapılan iki döngüyü birleştirmek daha iyidir .

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack



3

Jöle , 9 bayt

BLµ’ÆḞN⁸¡

Bir tabanlı endeksleme kullanır.

Çevrimiçi deneyin!

açıklama

Bu yöntem, Fibonacci işleviniz yalnızca negatif olmayan değişkenleri destekliyorsa çalışır.

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1)

3

Japt , 6 bayt

Mg1-¢l

Çevrimiçi test edin!

Nasıl çalışır

Diğer yanıtlar de belirtildiği gibi, N inci alternatif işaret Fibonacci serisi terimi aynı -n inci düzenli bir dizi terimin. n , girişin bit uzunluğunu alarak ve birini çıkartarak bulunabilir; Bunu olumsuzlamak 1 eksi bit uzunluğuna neden olur.

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index.

3

05AB1E , 11 10 bayt

1 tabanlı endeksleme kullanır

05AB1E'nin Fibonacci işlevi n'den küçük pozitif fib sayıları döndürür , dizine göre doğru olanı almamız ve ardından işaretini hesaplamamız gerektiği anlamına gelir. Bu nedenle, buna dayalı herhangi bir yöntemin sayıları yinelemeli olarak hesaplamaktan daha kısa olacağından şüpheliyim.

Luis Mendo'nun MATL cevabında açıklandığı gibi 1, 0davayı ele almak için yığını ters başlatabildiğimizin farkına varır .n=1

XÎbgG‚D«`-

Çevrimiçi deneyin!

açıklama

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements

2

Perl 6 , 53 bayt

{flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]}

Dizinin basit bir şekilde uygulanması, tarif edildiği gibi.
Sıfır tabanlı.


2

Julia 0.5 , 19 bayt

!n=n<1||!(n/=4)-!2n

Çevrimiçi deneyin!

Nasıl çalışır

Bu @ xnor'ın Python cevabı ile aynı formülü kullanır . Yineleme ilişkisi
g (n) = g (n-2) + g (n-1) , pozitif terimleri alternatif işaretlerle eşitleyen negatif terimleri oluşturur. Aynı sayının 2 k tekrarı sırasındaki herhangi bir yerden , önceki 2 k-1 sayıları ve 2 k-2 sayısının tekrarı dizinini 2 ve 4'e bölerek seçebiliriz. .

Basit değil

f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes

Bir operatörü amaçlarımız için yeniden tanımlayabiliriz. Ayrıca, f yüzer kadar iyi çalışacaktır, yani

!n=n<1||!(n/4)-!(n/2)   # 21 bytes

Son olarak, eğer n'yi 4'e bölünmüş bir şekilde güncellersek , n / 2'yi 2n olarak yazabilir ve bir çift pareni ihmal edebiliriz ve bu cevapta 19 byte fonksiyon tanımına yol açabiliriz.


1

J , 18 bayt

(%>:-*:)t.@<:@#@#:

Bir tabanlı endeksleme kullanır. N > 0 girdi tamsayısını alır floor(log2(n))ve ikili gösteriminin uzunluğunu bularak hesaplar ve ardından bu değeri bir azaltır. Daha sonra, tespit floor(log2(n))-1inci oluşturma işlevini katsayısı x / (1 + x - x 2 negatif endeksli Fibonacci değerleri için gf olan ) 'nin .

Çevrimiçi deneyin!

açıklama

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value
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.