1, 2, 4, 8, 16,… 33?


24

Meydan okuma

İyi bilinen sayı dizisinde nbirinci nöğeyi veya ilk öğeleri çıkaran bir işlev / program yazın :

         1, 2, 4, 8, 16 ...

Oh, bekle ... İlk birkaç rakamı unuttum:

1, 1, 1, 1, 2, 4, 8, 16 ...

Heck, iyi bir ölçü için birkaç tane daha ekleyeceğim:

1, 1, 1, 1, 2, 4, 8, 16, 33, 69, 146, 312, 673, 1463, 3202, 7050, 15605, 34705 ...

Sayılar (sıfır dizinli) formülüyle verilen Genelleştirilmiş Katalanca sayılarıdır:

a(n+1)=a(n)+k=2n1a(k)a(n1k)

nerede

a(0)=a(1)=a(2)=a(3)=1

Bu OEIS A004149 .

Dizinin sıfır mı yoksa bir dizinlenmiş mi olmasını istediğinizi seçebilirsiniz. Dizinin elbette aynı olması gerekir, bu nedenle bir dizine sahipseniz formülü yeniden yazmalısınız.


Yanlış buradayım, ama tek endeksli formülü için modifikasyon değiştirmektir varsa düzeltin a(n-1-k)için a(n-k)doğru?
Sumner18

Yanıtlar:


23

Python , 51 bayt

f=lambda n,k=2:n<3or k<n and f(k)*f(n-k-2)+f(n,k+1)

Çevrimiçi deneyin!

Formülü bir parça basitleştirir:

bir(n)=Σk=2n-1bir(k)bir(n-2-k)

bir(-1)=bir(0)=bir(1)=bir(2)=1


8
100k için tebrikler !!
Stewie Griffin

Bu çözüme bağımsız olarak da ulaştığım için, yolun biraz inişli çıkışlı olduğunu söylemeliyim ...
Ağustos

10

Perl 6 , 44 bayt

{1,1,1,1,{sum @_[2..*]Z*@_[@_-4...0,0]}...*}

Çevrimiçi deneyin!

Sayısız tembel sonsuz değer dizisi döndüren adsız kod bloğu. Bu hemen hemen açıklandığı gibi diziyi uygular, fermuarlı kısayol, ikinci öğeden sonra tüm elemanları, dördüncü öğeden başlayarak 1ve sonunda bir ekstra ekleyerek listenin tersi ile çarpar .

Açıklama:

{                                          }  # Anonymous code block
                                       ...*   # Create an infinite sequence
 1,1,1,1,                                     # Starting with four 1s
         {                            }       # Where each new element is:
          sum                                   # The sum of
              @_[2..*]                          # The second element onwards
                      Z*                        # Zip multiplied with
                        @_[@_-4...0  ]          # The fourth last element backwards
                                   ,0           # And 1

10

05AB1E , 14 13 11 bayt

$ƒˆ¯Âø¨¨¨PO

Çevrimiçi deneyin!

0 indeksli nth elemanını çıkarır.

$                # push 1 and the input
 ƒ               # repeat (input+1) times
  ˆ              #  add the top of the stack (initially 1) to the global array
   ¯             #  push the global array
    Â            #  and a reversed copy of it
     ø           #  zip the two together, giving a list of pairs
      ¨¨¨        #  drop the last 3 pairs
         P       #  take the product of each pair (or 1 if the list is empty)
          O      #  take the sum of those products
                 #  after the last iteration, this is implicitly output;
                 #  otherwise, it's added to the global array by the next iteration


7

Haskell, 49 43 39 bayt

a n=max(sum[a k*a(n-2-k)|k<-[2..n-1]])1              

Çevrimiçi deneyin!

İçin 0, bu yüzden o kadar yükseltir .n<3summax ... 11

Düzenleme: -Jo King sayesinde -6 bayt.



6

05AB1E , 17 13 bayt

4Å1λ£₁λ¨Â¦¦s¦¦*O+

Mevcut 05AB1E cevabından kısa değil , ancak yeni 05AB1E versiyonunun özyinelemeli işlevselliğini kendim için pratik olarak denemek istedim. Belki birkaç byte golf oynayabilir. EDIT: Ve gerçekten de, @ Grimy'nin 05AB1E cevabının özyinelemeli versiyonunu aşağıda görebilirsiniz, ki bu 13 bayttır .

n

n£è
£

Açıklama:


bir(n)=bir(n-1)+Σk=2n-1(bir(k)bir(n-1-k))

bir(0)=bir(1)=bir(2)=bir(3)=1

   λ               # Create a recursive environment,
    £              # to output the first (implicit) input amount of results after we're done
4Å1                # Start this recursive list with [1,1,1,1], thus a(0)=a(1)=a(2)=a(3)=1
                   # Within the recursive environment, do the following:
      λ            #  Push the list of values in the range [a(0),a(n)]
       ¨           #  Remove the last one to make the range [a(0),a(n-1)]
        Â          #  Bifurcate this list (short for Duplicate & Reverse copy)
         ¦¦        #  Remove the first two items of the reversed list,
                   #  so we'll have a list with the values in the range [a(n-3),a(0)]
           s       #  Swap to get the [a(0),a(n-1)] list again
            ¦¦     #  Remove the first two items of this list as well,
                   #  so we'll have a list with the values in the range [a(2),a(n-1)]
              *    #  Multiply the values at the same indices in both lists,
                   #  so we'll have a list with the values [a(n-3)*a(2),...,a(0)*a(n-1)]
               O   #  Take the sum of this list
               +  #  And add it to the a(n-1)'th value
                   # (afterwards the resulting list is output implicitly)

@Grimy'nin 13 bayt sürümü ( eğer henüz yapmadıysanız cevabını yükseltmediğinizden emin olun !):

1λ£λ1šÂ¨¨¨øPO

n

Yine 0 temelli indeksleme veya bunun yerine sonsuz bir listeyle değiştirilebilir:
- (0 temelli) indeksleme 1λèλ1šÂ¨¨¨øPO:
λλ1šÂ¨¨¨øPObir(0)=1

Açıklama:


bir(n)=Σk=2n-1(bir(k)bir(n-2-k))

bir(-1)=bir(0)=bir(1)=bir(2)=1

 λ             # Create a recursive environment,
  £            # to output the first (implicit) input amount of results after we're done
1              # Start this recursive list with 1, thus a(0)=1
               # Within the recursive environment, do the following:
   λ           #  Push the list of values in the range [a(0),a(n)]
    1š         #  Prepend 1 in front of this list
      Â        #  Bifurcate the list (short for Duplicate & Reverse copy)
       ¨¨¨     #  Remove (up to) the last three value in this reversed list
          ø    #  Create pairs with the list we bifurcated earlier
               #  (which will automatically remove any trailing items of the longer list)
           P   #  Get the product of each pair (which will result in 1 for an empty list)
            O  #  And sum the entire list
               # (afterwards the resulting list is output implicitly)

1
Bunun tio'da 40 saniyede bir (1200) çözmesi ilginçken, diğer özyinelemeli yaklaşımlar 100'den fazla sayılara zaman aşımına
uğradı

1
Ayrıca özyinelemeli bir versiyonunu yaptım (ancak yayınlamadım). Bu var ilk n terimleri için 13 bayt veya sonsuz liste 11 bayt . Özel muhafaza a (n-1) çok fazla bayta mal olur ve gerekli değildir (örneğin xnor'ın formülüne bakın ).
Grimmy

@Grimy Özyinelemeli çözümlerimi cevabıma eklersem sorun olur mu (elbette sizi kredilendirir)? Orijinal cevabımı da bırakacağım. Fakat orjinal formül ve xnor'ın bayt tasarruflu formülü arasındaki farkları görmek güzel. :)
Kevin Cruijssen

1
Tabii, sorun değil!
Grimmy

@StewieGriffin Evet, bu özyinelemeli sonsuz fonksiyonların hızından da etkilendim. Belki Elixir'in güçlü yanlarından biri ve kesinlikle yerleşik tembel yükleme yüzünden. 0,65 saniyede hesaplarn=100 , ancak tembel yüklemeyi devre dışı bıraktığımda, bunun yerine 60 saniye sonra zaman aşımına uğrarn=25 .
Kevin Cruijssen





2

Japt , 19 17 16 bayt

n1 indeksli , th terimini çıkarır.

@Zí*Zz2)Ťx}g4Æ1

Dene

@Zí*Zz2)Ťx}g4Æ1     :Implicit input of integer U
@                    :Function taking an array as an argument via parameter Z
 Zí                  :  Interleave Z with
    Zz2              :  Z rotated clockwise by 180 degrees (simply reversing would be a bye shorter but would modify the original array)
   *                 :  Reduce each pair by multiplcation
       )             :  End interleave
        Å            :  Slice off the first element
         ¤           :  Slice off the first 2 elements
          x          :  Reduce by addition
           }         :End function
            g        :Pass the following as Z, push the result back to it and repeat until it has length U
             4Æ1     :Map the range [0,4) to 1s
                     :Implicit output of the last element

1

Haskell , 65 bayt

f a|a<4=1|z<-g[2..a]=sum$zipWith(*)z$reverse(1:g[0..a-4])
g=map f

Çevrimiçi deneyin!

fBir dizinin tek bir elemanını elde etmek için ya da bir listenin gtüm indekslerini almak ve değerlerin bir listesini iletmek için kullanabilirsiniz.


1

İleri (gforth) , 99 81 bayt

: f recursive dup 4 > if 0 over 3 do over 1- i - f i f * + loop else 1 then nip ;

Çevrimiçi deneyin!

Çıkış: n. Terim ve giriş 1 indeksli

Düzenleme: Xnor'ın formülüne geçerek 17 bayt kaydedildi. 1 indekslenmiş kullanarak 1 bayt daha kaydedildi

Kod Açıklaması

: f                     \ start a new word definition
  recursive             \ mark that this word will be recursive
  dup 4 >               \ duplicate the input and check if it is greater than 4
  if                    \ if it is:
    0 over              \ create an accumulator and copy n to top of stack
    3 do                \ start counted loop from 3 to n-1
      over 1- i - f     \ recursively calculate f(n-1-i)
      i f               \ recursively calculate f(i)
      * +               \ multiply results and add to accumulator
    loop                \ end the counted loop        
  else                  \ otherwise, if n < 5
    1                   \ put 1 on the stack
  then                  \ end the if block
  nip                   \ drop n from the stack
;                       \ end the word definition

1

Kömür , 26 bayt

F⁵⊞υ¹FN⊞υΣ✂E⮌υ×κ§υλ³→I§υ±⁴

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Dahili olarak 1 indekslemeyi hesaplamasına rağmen, 0 indeksli nth numarasını yazdırır. Açıklama:

F⁵⊞υ¹

İle başla a[0] = a[1] = a[2] = a[3] = a[4] = 1. Evet, bu 1 indeksli, ancak daha sonra ekstra bir sıfır değeri var. Bu senin için golf kodu.

FN

Ek nterimler hesaplayın . Bu overkill, ancak ne zaman istenen terimi bulma kolaylaştırır n<5.

⊞υΣ✂E⮌υ×κ§υλ³

Her bir terim için, bir sonraki terimi üç terim hariç, şu ana kadar terimlerin, şimdiye kadar terimlerin tersiyle çarpımıyla çarpımı olarak hesaplayın.

Bu, Charcoal'ı 2 argüman biçimini ayrıştırmak için kandırmak için kullanılan bir ameliyat değil Slice, aksi takdirde üç terimden kurtulmak için daha az golflü bir yol kullanmak zorunda kalacağım.

I§υ±⁴

4. terimin çıktısını alın.


1

Pyth , 30 bayt

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<J

Çevrimiçi deneyin!

n

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<JQ # Full program, last Q = input (implicitly added)
J*4]1                  # J = 4 * [1] (=[1,1,1,1])
VQ                     # for N in range(Q):
  =+J                  #  J +=
     +eJ               #   J[-1] + 
        s              #    sum(                           )
           *M          #     map(__operator_mul,          )
             .t      0 #      transpose(          , pad=0)
               ,       #       [       ,         ]
                PJ     #         J[:-1] 
                  _PJ  #                 J[1::-1]
<JQ                    # J[::Q]

<@n



1

Octave , 73 bayt

g=(1:4).^0;for(i=3:(n=input('')))g(i+2)=g(4:i+1)*g(i-(2:i-1))';end;g(end)

Çevrimiçi deneyin!

Stewie Griffin sayesinde -2 bayt. Bir kez daha, zorunlu yaklaşım işlevsel özyinelemeli yaklaşımı kazanır. Bu aşağıda gösterilmiştir.

Oktav , 75 bayt

f(f=@(a)@(n){@()sum(arrayfun(@(k)a(a)(k)*a(a)(n-2-k),2:n-1)),1}{2-(n>3)}())

Çevrimiçi deneyin!

Captcha bunu gönderirken bir insan olduğumu doğrulamak istedi. Dürüst olmak gerekirse, pek emin değilim .


Döngü yaklaşımını kısaltmak için açık bir yol göremiyorum ... Oldukça iyi golf oynuyor! Ayrıca, sık sık Octave'de sıfır tabanlı indekslemeyi görmüyorum :)
Stewie Griffin

@StewieGriffin Özyineleme bazı ofsetlere sahip olduğundan, sıfır veya bir indeksleme seçmeniz gerçekten farketmez. Sanırım 2 indeksleme yapsaydım, bazı baytları tıraş edebilirim, ama hile gibi görünüyordu. Her neyse, senin sezgin haklıydı - her nasılsa, bu gerçekten isimsiz bir özyinelemeyle kısaydı. Bence asıl avantajı, dört başlangıç ​​değerini çok iyi oluşturmasıdır çünkü 1 için döner n<4.
Sanchises

1
@StewieGriffin Elbette, iyi eski matris çarpımı. Aferin!
49'da Sanchises


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.