Числа Нараяна-Зідек-Капелла


17

Генерування п - я Нараяна-Зідек-Capell числа заданого вхідні п . Виграє небагато байтів.

f (1) = 1, f (n) - сума членів попереднього поверху (n / 2) доданків Нараяна-Зідек-Капелл.

Випробування:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
Ласкаво просимо до головоломки програмування та коду для гольфу! Це хороший перший виклик. Хоча в кінцевому підсумку залежить від вас, як правило, ми радимо почекати хоча б тиждень, щоб прийняти відповідь. Отримавши прийняту відповідь на початку, можна надіслати сигнал іншим користувачам про те, що виклик закінчений більш-менш, що відштовхує їх від участі.
Алекс А.

Відповіді:


6

Желе, 11 10 байт

HĊrµṖ߀Sȯ1

Спробуйте в Інтернеті!

Береться nза аргумент і друкує результат.

Пояснення

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

Ruby, 34 32 байти

Для цього використовується формула зі сторінки OEIS для чисел Нараяна-Зідек-Каппелл .

Редагувати: Позбулися дужок із використанням пріоритету оператора завдяки feersum та Neil.

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

Напевно, вам не потрібні дужки x%2?
feersum

Ну, не, якщо покласти x%2*хоча б.
Ніл

@feersum та Neil Дякую обом
Sherlock9

Попередні редагування питань підказували, що формула x<2?така ... це робить набагато зрозумілішим спасибі!
Ніл

6

Python 2, 48 42 38 36 байт

Алгоритм взято зі сторінки OEIS. n<3може бути змінено на n<4без ефектів. Повертає число nth, де nє натуральним числом.

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

Спробуйте в Інтернеті


5

05AB1E, 16 байт

Ітераційне рішення як 05AB1E не має функцій.

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

Спробуйте в Інтернеті


5

С, 38

Переклад алгоритму OEIS. Тут просто недостатньо коду С!

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

Як n<3?:(...)працює?
LegionMammal978

2
Це розширення GCC (начебто, працює і в кланге), яке оцінює за умовним самим, якщо середній вираз відсутній. Дивіться відповідну сторінку GCC та це запитання щодо більш детальної інформації.
owacoder

4

Python 3, 67 байт

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

Функція, яка приймає введення через аргумент і друкує в STDOUT. Це пряма реалізація визначення.

Як це працює

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



3

Математика, 38 байт

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

Анонімна функція. Приймає 𝑛 як вхід і повертає 𝑓 (𝑛) як вихід. Виходячи з розчину Ruby.


Немає вбудованого?
Insane

@Insane Ні, немає вбудованого.
LegionMammal978

Просто дивовижно!
Insane

2

Хаскелл, 34 байти

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

Приклад використання: f 14->1308 .

Безпосередня реалізація визначення.



1

Ідіть, 63 байти

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

Досить прямий порт з відповіді на С


0

PHP, 81 байт

Це повна програма без рекурсії. Рекурсивну функцію можна визначити в 52 байтах (можливо, це можливо перемогти), але це просто досить нудний порт відповіді sherlock9 (і це помилки, якщо ви запитаєте f (100) або більше), тому я ставлю це довший і цікавіший варіант

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

Викликає багато (O [n]) сповіщень, але це добре.


O(n)помічає? Так?
кіт

сповіщення - це не критичний тип помилки, який не зупиняє виконання і зазвичай замовчується у виробничих середовищах. кожного разу, коли ви намагаєтеся отримати значення незадекларованої змінної або невизначене зміщення в масиві, ви отримуєте повідомлення. Ця програма намагається отримати значення O [n] невизначених зрушень (та ще й кількох недекларованих змінних), тож ви отримуєте O [n] повідомлення.
користувач55641

0

R, 55 байт

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

Зміна 10в forциклі і x[9]отримати якийсь індекс користувач хоче.


Ось рекурсивна версія, довжина якої становить 54 байти: 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)))

На підставі C відповіді.

  • Збережено 2 байти, використовуючи parseIntзамістьMath.floor

0

Клен, 46 44 байти

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

Використання:

> 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 байти

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

a=0додається як за замовчуванням, оскільки це зберігає мені дві фігурні дужки. Функція рекурсивно називає себе за потребою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.