Определение
Последовательность Фибоначчи F(n)
на натуральных числах определяется так:
1. F(1) = 1
2. F(2) = 1
3. F(n) = F(n-1) + F(n-2), where n is an integer and n > 2
Fibonacci-orial положительного целого числа является продуктом [F(1), F(2), ..., F(n)]
.
задача
Учитывая положительное целое число n
, найдите Фибоначчи-Ориал n
.
Спекуляции
Фибоначчи 100
должно вычисляться менее чем за 5 секунд на приемлемом компьютере.
Testcases
n Fibonacci-orial of n
1 1
2 1
3 2
4 6
5 30
6 240
7 3120
8 65520
9 2227680
10 122522400
11 10904493600
12 1570247078400
13 365867569267200
14 137932073613734400
15 84138564904377984000
16 83044763560621070208000
17 132622487406311849122176000
18 342696507457909818131702784000
19 1432814097681520949608649339904000
20 9692987370815489224102512784450560000
100 3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225261757371666449068625033999573552165524529725467628060170886602001077137613803027158648329335507728698605769992818756765633305318529965186184043999696650407246193257877568825245646129366994079739720698147440310773871269639752334356493678913424390564535389212240038895626811627949132978086070255082668392290037141141291484839596694182152062726390364094447642643912371532491388089634845995941928089653751672688740718152064107169357399466473375804972260594768969952507346694189050233823596316467570584434128052398891223730335019092974935617029638919358286124350711360361279157416837428904150054292406756317837582840596331363581207781793070936765786629772999832857257349696094416616259974304208756997835360702840912518532683324936435856348020736000000000000000000000000
Ответы:
Mathematica, 10 байт
Еще одна встроенная система Mathematica надежно побита языком игры в гольф без встроенной.
источник
Желе , 6 байт
Вход 100 заканчивается через 500 мс локально. Попробуйте онлайн!
Как это работает
источник
+¡1
ли она встроенной в n-й+С1
Фибоначчи и являются ли первые n-числами Фибоначчи?На самом деле , 4 байта
Запускает ввод 100 в течение 0,2 секунды. Код:
Объяснение:
Использует кодировку CP-437 . Попробуйте онлайн! ,
источник
Brainfuck,
11981067817770741657611603Несжатый, с комментариями:
Попробуйте онлайн!
Время выполнения для n = 100 составляет менее 1 секунды с онлайн-переводчиком (около 0,2 с локально, используя мой собственный переводчик). Максимальное входное значение составляет 255, но для поддержки интерпретатора потребуется ~ 54000 ячеек (он-лайн переводчик, похоже, поддерживает 64 КБ).
Журнал изменений
Сохранено около 130 байтов с лучшим извлечением текущей цифры для умножения на, и путем объединения добавить и перенести в один проход. Это также, кажется, немного быстрее.
Сохранено еще 250 байтов. Мне удалось уменьшить блокнот умножения на две ячейки, что позволяет экономить байты практически везде, не прибегая к смещению между цифрами. Я также отбросил перенос после умножения на цифру и вместо этого выполнил полный перенос, добавив к промежуточному итогу.
Разбил еще 50, опять же с лучшим извлечением текущей цифры для умножения на, просто не двигая ее вперед на первой итерации и работая там, где она есть. Дальнейшая микрооптимизация занимает около 10 байт.
Еще 30 ушло. Маркировка цифр, которые уже были приняты с 0, а не 1, облегчает их поиск. Это также делает проверку завершения цикла умножения несколько проще.
Я уменьшил блокнот на другую ячейку, еще на 80 байтов. Я сделал это путем слияния маркера для предыдущего продукта и текущего промежуточного итога, что уменьшает сдвиги между пробелами и немного облегчает бухгалтерию.
Сохраненные еще 50, исключив еще одну ячейку, повторно используя маркер для цифр Фибоначчи, чтобы отметить последнюю взятую цифру. Я также смог объединить цикл, чтобы сдвинуть предыдущие итоги с циклом умножения цифр.
Сохранено 8 байтов при разборе ввода. К сожалению.
источник
Python, 45 байт
Ввод взят из стандартного ввода. Вывод для n = 100 заканчивается слишком быстро, чтобы точно рассчитать время. n = 1000 занимает примерно 1 с.
Образец использования
источник
Haskell
4129 байт1 + 11 байт, сохраненных замечаниями @ Laikoni.
1
,f
И!!
отдельные лексемы. Первые строки определяют последовательность Фибоначчи, вторая - это функция, которая вычисляет последовательность Фибоначчи и возвращает n-й для данного n. Он начинает печатать цифры практически сразу даже при n = 1000.источник
(scanl(*)1f!!)
.f=1:scanl(+)1f
42+
как функцию, которая добавляет 42? Вы не должны, потому что это просто незаконченное выражение. Но в Haskell мы можем добавить круглые скобки и получить раздел(42+)
, способ написать функцию\n->42+n
. Здесь то же самое, только с!!
(двоичный инфиксный оператор для индексации) вместо+
и с более сложным первым операндом.Python 2, 39 байт
Проверьте это на Ideone .
источник
True
в некоторых случаях.True
для ввода 0 , который не является положительным.J,
1716 байт1 байт - это лучшее решение для миль.
Идея та же, что и в оригинале, но вместо того, чтобы формировать матрицу для работы с второстепенными диагоналями, мы формируем диагонали на лету.
оригинал
Чтобы получить первые n фибономов:
Чтение справа налево ...
Создать массив последовательных целых (
i.
) с точностью до указанного, из этого массива создать таблицу (/~
) биномиальных коэффициентов (!
), вычисленных по каждой паре в массиве, эта таблица является вершиной треугольника Паскаля, расположенной в конец первой строки и все элементы под главной диагональю равны 0, к счастью для реализации!
. Если вы суммируете (+/
) все второстепенные диагонали (/.
), вы получите числа Фибоначчи, но вам нужно взять ({.
) столько же первых элементов из полученного массива, сколько length (#
) самой таблицы. Затем произведение (*/
), примененное к последовательным префиксам (\
) массива, приводит к желаемой последовательности фибонориалов.Если вы хотите, вы можете взять только последний, используя еще 2 байта ({:
), но я подумал, что отображать их все - не грех:)
.NB. the previous code block is not a J function
,Для больших чисел в J вы используете
x
в конце:Программа работает на avarage 0.11s .
источник
[:*/+/@(!|.)\@i.
использование 16 байтов. Он формирует те же биномиальные коэффициенты вдоль таблицы, которую вы генерируете,!/~
за исключением того, что он формирует ее, используя префиксыi.
.Pyth, 13 байт
демонстрация
Это использует умный, не типичный трюк. Пять персонажей (
u*G ... Q1
) говорят, что результат является продуктом ввода многих чисел. Остальная часть кода генерирует числа.=[sZhZ)
обновляет переменнуюZ
в списке[s(Z), h(Z)]
. Затемs
суммирует этот список для умножения.Z
изначально равен 0.s
, для целых чисел, это функция тождества.h
, на его, это+ 1
функция. Так что на первой итерацииZ
становится[0, 1]
.s
в списках есть функция суммы, как упомянуто выше.h
это функция головы. Итак, вторая итерация[1, 0]
.Вот список:
Эти суммы умножаются, чтобы дать результат.
источник
Mathematica
2524 байтаС благодарностью Мартину Эндеру.
Время: 63 микросекунды.
источник
1##&@@Fibonacci~Array~#&
Желе, 8 байт
Моя первая подача в желе. Он не такой короткий, как ответ @Dennis , но его длина всего на 2 байта при использовании другого метода.
Локально, это требует около 400 мс по сравнению с 380 мс с версией @Dennis для n = 100.
Попробуйте онлайн!
объяснение
источник
PARI / GP, 29 байт
Или в качестве альтернативы:
источник
R,
9996787666 байтЭтот ответ использует формулу Бине , а также
prod(x)
функцию. Поскольку R не имеет встроенногоPhi
значения, я определил его сам:Это работает менее чем за 5 секунд, но R имеет тенденцию давать
Inf
в качестве ответа для этих больших чисел ...Ungolfed:
-2 байта благодаря @Cyoce!
О, я люблю этот сайт! -10 байт благодаря @ user5957401
источник
sqrt(5)
переменнуюN
один раз, вы можете просто вызвать сканирование внутри1:N
бита. то естьfor(n in 1:scan())
. Вы также можете сохранить несколько символов, просто используя*
вместоprod()
функции в вашем цикле for. Ваш цикл for состоит только из одной строки, поэтому вам также не нужны фигурные скобки.function(n,N=1:n,p=5^.5)prod(((1+p)^N-(1-p)^N)/2^N/p)
R,
82,53, 49 байтов (48 байтов с различным стилем ввода)Если мы можем просто предшествовать коду с введенным номером, мы получим 48 байт
РЕДАКТИРОВАТЬ: новый код. Оригинал ниже:
a(100)
Хотя не верну ничего, кроме Inf . И это не будет работать ни для чего, кроме неотрицательных целых чисел.Ungolfed:
источник
Java, 165 байт
Golfed:
Это еще один случай, когда
BigInteger
требуется из-за большого количества. Однако мне удалось свести текстBigInteger
к минимуму, уменьшив его размер. Я также сравнил со статическим импортом, и это увеличило общую длину.Эта программа работает, отслеживая три числа в массиве. Первые два - два предыдущих числа Фибоначчи. Третье - это накопленная стоимость. Цикл начинается с вычисления следующего значения и сохранения его в чередующихся (0, 1, 0, 1, ...) индексах массива. Это позволяет избежать необходимости сдвигать значения с помощью дорогостоящих (с точки зрения размера источника) операций присваивания. Затем возьмите это новое значение и умножьте его на аккумулятор.
Избегая временных объектов и ограничивая цикл двумя операторами присваивания, я смог выжать довольно много байтов.
Ungolfed:
Выход программы:
источник
Brachylog , 31 байт
Попробуйте онлайн!
источник
Рубин, 39 байт
источник
Javascript (ES6),
5139 байтРекурсивная реализация (39 байт)
Оригинальная реализация (51 байт)
Примечание. Начинается ошибка округления для числа Фибоначчи, равного 16, 100 - это просто бесконечность, запускается, как представляется, <1 секунда.
источник
n=>[...Array(n)].reduce(p=>(c=a,a=b,p*=b+=c),a=1,b=0)
только для того, чтобы узнать, что вы посчитали,f=
что не требуется, сэкономив вам 2 байта.DC (GNU или OpenBSD) , 36 байт
Файл
A003266-v2.dc
:(без завершающей строки)
... теперь результат хранится в стеке вместо использования именованного регистра (
Y
в версии 1). Командаr
не доступна в оригиналеdc
(см. Страницу Dc RosettaCode ).Бег:
Пытаюсь объяснить:
tos
является содержимым вершины стека, не удаляя его.nos
это элемент нижеtos
.DC , 41 байт
... прямо, никаких хитростей
Файл
A003266-v1.dc
:(без завершающей строки)
Бег:
источник
dc
код определенно проще, чем объяснять его ...n
элементы в другой стек сразу. Пока, однако, я все еще не знаю, как скомпилироватьdc
из исходного кода. : /C #
11010910710310194 байтаобъяснение
Итерационный алгоритм Фибоначчи
источник
Мозг-Flak , 54 байта
Попробуйте онлайн!
Умножение в Brain-Flak занимает много времени для больших входов. Просто умножаем F 100 на F 99 с помощью общего алгоритма умножения заняло бы миллиарды лет.
К счастью, есть более быстрый способ. Обобщенная последовательность Фибоначчи, начинающаяся с
(k, 0)
будет генерировать те же члены, что и обычная последовательность, умноженная наk
. Используя это наблюдение, Brain-Flak может умножаться на число Фибоначчи так же легко, как он может генерировать числа Фибоначчи.Если стек состоит из
-n
двух чисел с последующим{({}()<([({})]({}{}))>)}{}{}
вычислениемn
итерации обобщенной последовательности Фибоначчи и отбрасываться все до последнего. Остальная часть программы просто устанавливает начальную 1 и повторяет ее для всех чисел в диапазонеn...1
.Вот тот же алгоритм на других языках, предоставляемых этим интерпретатором:
Brain-Flak Classic, 52 байта
Попробуйте онлайн!
Brain-Flueue, 58 байт
Попробуйте онлайн!
Мини-Флак, 62 байта
Попробуйте онлайн!
источник
Mathematica -
3226 байтов@MartinEnder нарезал 6 байтов!
источник
GAP 28 байт
До сегодняшнего дня не знал, что GAP имеет
Fibonacci
встроенную функцию .источник
Рубин, 85 байт
Получилось хорошо, но, возможно, есть более короткое решение.
Быстрый расчет Фибоначчи взят здесь: ссылка
Проверьте это здесь
источник
Юлия, 36 байт
источник
Брейк-Флак ,
110104100 байтПопробуйте онлайн!
объяснение
Сначала мы запускаем улучшенную версию любезности генератора последовательностей Фибоначчи доктора Грина Эггса и Железного Человека
Тогда, пока в стеке есть более одного элемента
умножить два верхних элемента
и вытолкнуть лишний ноль
источник
Clojure, 70 байт
Clojure не очень хороший язык для игры в гольф. Ну что ж.
Попробуйте это на http://tryclj.com .
источник
Далее 55 байт
Использует итеративный подход, основанный на моем ответе Фибоначчи в Форт. Результаты переполнены арифметически для
n > 10
. Ответ не зависит от регистра.Попробуйте онлайн
источник
Свифт, 68 байт
источник
JavaScript (ES6), 46 байт
Использует рекурсивные и аккумуляторные переменные. Ошибки округления начинаются с
f(16)
.источник