Знаменитая последовательность Фибоначчи F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)
(для этой задачи мы начинаем с 0).
Ваша задача: Дано п , выход сумма всех й - й чисел Фибоначчи для всех делителей d от п - го числа Фибоначчи. Если вы предпочитаете более формальную запись,
Входные данные : положительное целое число n
Выход : сумма
Например, рассмотрим n=4
.F(4) = 3
Делителями 3 являются 1 и 3, поэтому на выходе должно быть F(1) + F(3) = 1 + 2 = 3
.
Для n=6
, F(6) = 8
и делители 8 равны 1, 2, 4, 8, поэтому на выходе F(1) + F(2) + F(4) + F(8) = 1 + 1 + 3 + 21 = 26
.
Тестовые случаи:
1 => 1
2 => 1
3 => 2
4 => 3
5 => 6
6 => 26
Это код-гольф , самый короткий ответ в байтах выигрывает. Применяются стандартные лазейки .
Желе , 7 байт
Попробуйте онлайн!
Объяснение:
источник
Mathematica, 29 байт
источник
Mathematica упрощенный , 14 байтов
О, хорошо, это оказалось идентичным решению @ MartinEnder ...
источник
N
)Japt , 11 байт
Попробуйте онлайн!
источник
05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
Haskell, 54 байта
Пример использования:
g 6
->26
. Попробуйте онлайн!источник
Алиса ,
3836 байтСпасибо Лео за сохранение 2 байта.
Попробуйте онлайн!
Почти наверняка не оптимально. Поток управления довольно сложный, и хотя я вполне доволен тем, сколько байтов было сохранено по сравнению с предыдущими версиями, у меня есть ощущение, что я слишком усложняю то, что может быть более простое и короткое решение.
объяснение
Во-первых, мне нужно немного разобраться со стеком обратных адресов Алисы (RAS). Как и во многих других фунгеоидах, у Алисы есть команда, позволяющая перемещаться по коду. Тем не менее, он также имеет команды, чтобы вернуться туда, откуда вы пришли, что позволяет довольно удобно реализовывать подпрограммы. Конечно, поскольку это двумерный язык, подпрограммы действительно существуют только по соглашению. Ничто не мешает вам войти в подпрограмму или выйти из нее с помощью других средств, кроме команды возврата (или в любой точке подпрограммы), и в зависимости от того, как вы используете RAS, в любом случае не может быть чистой иерархии перехода / возврата.
Как правило, это реализуется с помощью команды перехода,
j
передающей текущий IP-адрес в RAS перед переходом. Команда returnk
затем выводит адрес RAS и переходит туда. Если RAS пустой,k
ничего не делает вообще.Есть и другие способы манипулирования РАН. Два из них имеют отношение к этой программе:
w
проталкивает текущий IP-адрес в RAS, никуда не переходя. Если вы повторите эту команду, вы можете написать простые циклы довольно удобно, как&w...k
я уже делал в предыдущих ответах.J
похоже,j
но не запоминает текущий IP-адрес на RAS.Также важно отметить, что RAS не хранит информацию о направлении IP. Поэтому возвращение к адресу с
k
всегда сохранит текущее направление IP (и, следовательно, также, находимся ли мы в режиме кардинала или ординала) независимо от того, как мы прошли черезj
илиw
иной адрес IP-адреса.Разобравшись с этим, давайте начнем с рассмотрения подпрограммы в приведенной выше программе:
Эта подпрограмма вытягивает нижний элемент стека n наверх, а затем вычисляет числа Фибоначчи F (n) и F (n + 1) (оставляя их сверху стека). Нам никогда не нужен F (n + 1) , но он будет отброшен вне подпрограммы из-за того, как
&w...k
циклы взаимодействуют с RAS (какой тип требует, чтобы эти циклы были в конце подпрограммы). Причина, по которой мы берем элементы снизу, а не сверху, заключается в том, что это позволяет нам рассматривать стек больше как очередь, что означает, что мы можем вычислить все числа Фибоначчи за один раз, не сохраняя их в другом месте.Вот как работает эта подпрограмма:
Конец цикла немного сложнее. Пока в стеке есть копия адреса 'w', начинается следующая итерация. Как только они исчерпаны, результат зависит от того, как была вызвана подпрограмма. Если подпрограмма была вызвана с помощью 'j', последняя «k» возвращается туда, так что конец цикла удваивается как возврат подпрограммы. Если подпрограмма была вызвана с помощью 'J', и в стеке все еще есть адрес с более раннего адреса, мы переходим туда. Это означает, что если подпрограмма была вызвана в самом внешнем цикле, это «k» возвращает в начало этого внешнего цикла. Если подпрограмма была вызвана с 'J', но RAS сейчас пуст, тогда это 'k' ничего не делает, и IP просто продолжает двигаться после цикла. Мы будем использовать все три этих случая в программе.
Наконец, к самой программе.
Это всего лишь два быстрых перехода в обычный режим для чтения и печати десятичных целых чисел.
После
i
, есть a,w
который запоминает текущую позицию перед переходом в подпрограмму из-за второй/
. Этот первый вызов подпрограммы вычисляетF(n)
иF(n+1)
на входеn
. После этого мы возвращаемся назад, но сейчас движемся на восток, поэтому остальные операторы программы работают в режиме Cardinal. Основная программа выглядит так:Вот
31J
еще один вызов подпрограммы и, следовательно, вычисление числа Фибоначчи.источник
Аксиома, 68 байт
какой-то тест
источник
Пари / ГП , 34 байта
Попробуйте онлайн!
источник
Python 2 ,
8984 байта-5 байт благодаря овсу
Попробуйте онлайн!
источник
R 77 байт
Использует библиотеку 'gmp'. Это имеет встроенную функцию Фибоначчи и предоставляет возможность делать большие числа. Это вызвало несколько проблем с seqs и applys, хотя это все же меньше, чем создание моей собственной функции Фибоначчи.
объяснение
Тестовое задание
Без использования gmp
81 байт , рекурсивная функция, которая безнадежно медленна, когда выбираются большие (9+) чисел
88 байт , формула Бинета, которая будет работать достаточно хорошо с большими числами, но все же достигает целочисленного предела довольно быстро
источник
Perl 6 , 49 байт
источник
CJam , 26 байтов
Попробуйте онлайн!
Я уверен, что это можно сделать лучше. Объяснение:
Идея состоит в том, чтобы иметь массив чисел Фибоначчи и расставить точки с массивом из 1 и 0, если это число является делителем ввода или не является его делителем.
источник
JavaScript (ES6),
7665 байтКонтрольные примеры
Показать фрагмент кода
источник
JavaScript (ES6),
10510410310197 байтПопытайся
источник
(z=g(i)/y)>~~z
на(z=g(i)/y)%1
, если вы просто проверяете, чтоz
это целое число.g(z)
в ,g(z|0)
но возвращает нас к тому же счетчику байтам.Q, 75 байт
источник
C (gcc) ,
939080 байтовПопробуйте онлайн!
источник
Добавить ++ , 89 байт
Попробуйте онлайн!
источник