Narayana-Zidek-Capell numaraları


17

Oluşturmak n inci Narayana-Zídek-Capell bir giriş belirli sayıda n . En az bayt kazanır.

f (1) = 1, f (n), önceki kat (n / 2) Narayana-Zidek-Capell terimlerinin toplamıdır.

Test Durumları:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Bu güzel bir ilk zorluk. Sonuçta size kalmış olsa da, genellikle bir cevabı kabul etmek için en az bir hafta beklemenizi öneririz. Kabul edilen bir cevaba erken sahip olmak, diğer kullanıcılara zorluğun az çok bittiğine dair bir sinyal gönderebilir ve bu da onların katılmalarını engeller.
Alex

Yanıtlar:


6

Jöle, 11 10 bayt

HĊrµṖ߀Sȯ1

Çevrimiçi deneyin!

Alır n argüman olarak ve sonucu yazdırır.

açıklama

H              divide input by 2
 Ċ             round up to get first n to recurse
  r            inclusive range from that to n
   µ           (chain separator)
    Ṗ          remove n itself from the range
     ߀        call self recursively on each value in the range
       S       sum results
        ȯ1     if sum was zero, return one

7

Yakut, 34 32 bayt

Bu, OEIS sayfasındaki bir formül Narayana-Zidek-Cappell sayıları için OEIS .

Düzenleme: Feersum ve Neil sayesinde operatör önceliğini kullanarak parantezlerden kurtuldum.

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}

Elbette parantezlere ihtiyacınız yok x%2mu?
feersum

x%2*En azından koyarsan olmaz .
Neil

@feersum ve Neil İkinize de teşekkür ederiz
Sherlock9

Önceki soru düzenlemeleri, formülün x<2?... bu çok daha net olmasını sağladı!
Neil

6

Python 2, 48 42 38 36 bayt

OEIS sayfasından alınan algoritma. etkisiz n<3olarak değiştirilebilir n<4. Pozitif bir tam sayı olan nth sayısını döndürür n.

a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)

Çevrimiçi deneyin


5

05AB1E, 16 bayt

05AB1E olarak yinelemeli bir çözümün işlevleri yoktur.

X¸sGDN>;ï£Os‚˜}¬

X¸               # initialize a list with 1
  sG          }  # input-1 number of times do
    D            # duplicate current list
     N>;ï£       # take n/2 elements from the list
          O      # sum those elements
           s‚˜   # add at the start of the list
               ¬ # get the first element and implicitly print

Çevrimiçi deneyin


5

C, 38

OEIS algoritmasının çevirisi. Buralarda yeterli C kodu yok!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}

Nasıl n<3?:(...)çalışır?
LegionMammal978

2
Orta ifade eksikse koşullu olarak değerlendirilen bir GCC uzantısıdır (clang'da da işe yarıyor gibi görünüyor). Daha fazla ayrıntı için ilgili GCC sayfasına ve bu SO sorusuna bakın.
owacoder

4

Python 3, 67 bayt

def f(n):
 x=1,
 for i in range(n):x+=sum(x[-i//2:]),
 print(x[-1])

Bağımsız değişken üzerinden girdi alan ve STDOUT'a yazdırılan bir işlev. Bu, tanımın doğrudan bir uygulamasıdır.

Nasıl çalışır

def f(n):               Function with input target term index n
 x=1,                   Initialise term list x as tuple (1)
 for i in range(n):...  For all term indices in [0,n-1]...
 x[-i//2:]              ..yield the previous floor(i/2) terms...
 x+=sum(...)            ...and append their sum to x
 print(x[-1])           Print the last term in x, which is the nth term

Ideone üzerinde deneyin



3

Mathematica, 38 bayt

If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&

Anonim işlev. 𝑛 değerini girdi olarak alır ve 𝑓 (𝑛) değerini çıktı olarak döndürür. Ruby çözümüne dayanmaktadır.


Yerleşik yok mu?
Deli

@Insane Hayır, yerleşik yok.
LegionMammal978

Tek kelimeyle muhteşem!
Deli

2

Haskell, 34 bayt

f 1=1
f n=sum$f<$>[n-div n 2..n-1]

Kullanım örneği: f 14-> 1308.

Tanımın doğrudan uygulanması.


2

Java, 63 Bayt

int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}

1

Git, 63 bayt

func f(i int) int{if(i<4){return 1};return 2*f(i-1)-i%2*f(i/2)}

C cevabından hemen hemen doğrudan bir liman


0

PHP, 81 bayt

Bu özyineleme olmadan tam bir programdır. Özyinelemeli bir işlev 52 bayt olarak tanımlanabilir (bunu yenmek mümkün olabilir) ama bu sadece sherlock9'un cevabının oldukça sıkıcı bir limanıdır (ve f (100) veya daha fazlasını isterseniz hata yapar), bu yüzden bunu koyuyorum daha uzun ve daha ilginç versiyon

<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;

Birçok (O [n]) bildirime neden olur, ancak bu iyi.


O(n)bildirimler? Ha?
kedi

bildirimler, yürütmeyi durdurmayan ve genellikle üretim ortamlarında susturulan kritik olmayan bir hata türüdür. bir dizide bildirilmemiş bir değişkenin veya tanımsız bir ofsetin değerini almaya çalıştığınızda bir bildirim alırsınız. Bu program O [n] tanımlanmamış ofsetleri (ve birkaç da bildirilmemiş değişkenleri) değerini almaya çalışır, böylece O [n] bildirimleri alırsınız.
user55641

0

R, 55 bayt

x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]

Değişim 10içinde fordöngü ve x[9]kullanıcı istediği hangisi endeksi alır.


İşte 54 bayt uzunluğunda özyinelemeli bir sürüm: f=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
DSkoog

0

JavaScript, 54 52

f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))

Dayanarak C cevap.

  • Kullanılarak 2 bayt Kaydedilen parseIntyerineMath.floor

0

Akçaağaç, 46 44 bayt

`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)))

Kullanımı:

> f:=n->`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)));
> seq( f(i), i = 1..10 );
  1, 1, 1, 2, 3, 6, 11, 22, 42, 84

0

R, 63 bayt

f=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}

a=0varsayılan olarak eklenir, çünkü bana iki kıvırcık parantez kaydeder. İşlev, kendisini gerektiği gibi yinelemeli olarak çağırır.

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.