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


17

Сгенерируйте n- е число Нараяны-Зидека-Капелла с учетом ввода n . Побеждают несколько байтов.

f (1) = 1, f (n) - сумма предыдущих (n / 2) слагаемых Нараяны-Зидека-Капелла.

Тестовые случаи:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
Добро пожаловать в Программирование Пазлов и Code Golf! Это хороший первый вызов. Хотя в конечном итоге это зависит от вас, обычно мы рекомендуем подождать хотя бы неделю, чтобы принять ответ. Принятие принятого ответа на раннем этапе может послать другим пользователям сигнал о том, что задача более или менее решена, что препятствует их участию.
Алекс А.

Ответы:


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

Рубин, 34 32 байта

При этом используется формула со страницы OEIS для чисел Нараяны-Зидека-Каппелла .

Редактировать: Избавился от скобок, используя приоритет оператора благодаря feersum и Нейлу.

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

Конечно, вам не нужны скобки для x%2?
feersum

Ну, если не ставить x%2*хотя бы.
Нил

@feersum и Нил Спасибо вам обоим
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. Здесь просто не хватает кода C!

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

Как n<3?:(...)работает?
LegionMammal978

2
Это расширение GCC (похоже, работает и в clang), которое оценивает само условие, если отсутствует среднее выражение. См. Соответствующую страницу GCC и этот вопрос SO для более подробной информации.
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

Mathematica, 38 байт

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

Анонимная функция. Принимает 𝑛 как ввод и возвращает 𝑓 (𝑛) как вывод. Основано на решении Ruby.


Там нет встроенного?
Безумный

@ Insane Нет, встроенного нет.
LegionMammal978

Просто удивительно!
Безумный

2

Haskell, 34 байта

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

Пример использования: f 14-> 1308.

Прямая реализация определения.



1

Go, 63 байта

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

Почти прямой порт от ответа C


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] уведомления.
user55641

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.