Напишите кратчайший код, который будет принимать любое действительное число больше 1 и будет выводить положительный обратный факториал. Другими словами, он отвечает на вопрос «какое число факториал равно этому числу?». Используйте функцию Gamma, чтобы расширить определение факториала до любого действительного числа, как описано здесь. .
Например:
input=6 output=3
input=10 output=3.390077654
потому что 3! = 6
и3.390077654! = 10
правила
- Запрещается использовать встроенные факторные функции или гамма-функции или функции, которые зависят от этих функций.
- Программа должна иметь возможность вычислять ее до 5 десятичных цифр, с теоретической способностью вычислять ее с любой точностью (она должна содержать число, которое можно сделать произвольно большим или маленьким, чтобы получить произвольную точность)
- Разрешен любой язык, выигрывает самый короткий код в символах.
Я сделал рабочий пример здесь . Взглянуть.
Ответы:
Javascript (116)
Черная магия здесь! Дает результат за несколько миллисекунд .
Только элементарные математические функции используются:
ln
,pow
,exponential
Жаль, что LaTeX не поддерживается на Codegolf, но в основном я написал кодировщик ньютона для
f(y)=gamma(y)-n=0
иx=y-1
(потому чтоx!
этоgamma(x+1)
) и аппроксимации для функций гаммы и дигаммы.Гамма-аппроксимация - приближение Стирлинга
Дигамма-аппроксимация с использованием формулы Эйлера Маклаурина
дигамма- функция - это производная гамма-функции, деленная на гамма-функцию:
f'(y)=gamma(y)*digamma(y)
Ungolfed:
Тестовые случаи:
источник
n=prompt(M=Math)
Mathematica -
745449Правильный путь будет
Если мы просто отбросим тест,
?NumberQ
он все равно сработает, но выдаст несколько неприятных предупреждений, которые исчезнут, если мы перейдем к символьной интеграцииIntegrate
, но это будет недопустимо (я полагаю), потому что функция будет автоматически преобразована вGamma
функцию. Также мы можем избавиться от внешней функции таким образом.Так или иначе
Черт с правильным вводом, просто определение функции (не может позволить MatLab победить)
Если бы встроенные факториалы были разрешены
Выше не дает целого числа (которое является аргументом для истинной факториальной функции). Следующее делает:
источник
NumberQ
Требуется ли проверка шаблона? Или ПаренсE^(-t)
? Является ли это обман , чтобы обратитьсяNIntegrate
кIntegrate
? Вероятно ... :)ароматизированные:
7246 персонажейЭто почти идеально подходит ... есть "язык", который, кажется, предназначен именно для математического гольфа: ised . Его запутанный синтаксис обеспечивает очень короткий код (без именованных переменных, только целочисленные слоты памяти и множество универсальных операторов с одним символом). Определив гамма-функцию с помощью интеграла, я получил до 80, казалось бы, случайных символов
Здесь слот памяти $ 4 - это факториальная функция, ожидается, что функция деления на слоты памяти $ 6 и слот памяти $ 2 будут установлены на вход (заданный перед поиском этого кода). Слоты $ 0 и $ 1 являются границами пополам. Пример вызова (при условии, что приведенный выше код находится в файле
inversefactorial.ised
)Конечно, вы можете использовать встроенный! оператор, в этом случае вы получите до 45 символов
Осторожность, предпочтение оператора иногда странно.
Редактировать: запомнил встроенные функции вместо их сохранения. Удар Mathematica с 72 персонажами!
И используя! Встроенный вы получаете 41.
Годовое обновление:
Я только что понял, что это было крайне неэффективно. Гольф до 60 символов:
Если используется utf-8 (Mathematica делает это тоже), мы получаем 57:
Немного другая перезапись может сократить его до 46 (или 27 при использовании встроенного!):
Последние два символа можно удалить, если вы согласны с тем, что ответ будет напечатан дважды.
источник
MATLAB
5447Если я выберу правильные задачи, MATLAB действительно хорош для игры в гольф :). В моем коде я нахожу решение уравнения (ux!) = 0, в котором u - пользовательский ввод, а x - переменная для решения. Это означает, что u = 6 приведет к x = 3 и т. Д.
Точность может быть изменена путем изменения верхнего предела интеграла, который установлен на 99. Снижение этого изменит точность вывода следующим образом. Например, для ввода 10:
и т.п.
источник
Питон - 199 символов
Итак, вам понадобится много места в стеке и много времени, но, эй, оно будет!
Вот еще один подход с еще большей рекурсией.
Оба из них могут быть проверены при
>>>f(10,1)
условии, что вы установите предельное значение рекурсии около 10000. Более одного десятичного знака точности, вероятно, не будет дополнено каким-либо реалистичным предельным значением рекурсии.Включая комментарии и несколько модификаций, до 199 символов.
источник
code-golf
вопрос, поэтому вам нужно дать кратчайший ответ, указав длину вашего решения.Python 2,7 -
215189 символовИспользование:
Чтобы изменить точность: измените
1e-5
на меньшее число для большей точности, большее число для худшей точности. Для большей точности вы, вероятно, хотите дать лучшее значение дляe
.Это просто реализует функцию факториала как
f
, а затем выполняет двоичный поиск, чтобы отточить наиболее точное значение инверсии входных данных. Предполагается, что ответ меньше или равен 99 (наверняка он не сработает для ответа 365, я получаю математическую ошибку переполнения). Очень разумное использование пространства и времени, всегда заканчивается.С другой стороны , заменить
if abs(n-f(x))<=10**-5: print x;break
сprint x
сбрить 50 символов . Это будет цикл навсегда, давая вам более точную оценку. Не уверен, что это будет соответствовать правилам, хотя.источник
cat file | wc -c
.dg -
131133 байтаТак как dg создает байт-код CPython, это должно учитываться и для Python, но ... Вот несколько примеров:
РЕДАКТИРОВАТЬ: Добавил два байта, потому что я не помню, чтобы он также принимал float!
источник
42.8006566063
, поэтому они соответствуют в 5 цифр точности!1e100
он дает:,69.95780520000001
для1e150
него выводит96.10586423000002
, а для1e200
него взрывается. Но на самом деле я не знаю, достоверны ли эти результаты ...R , 92 байта
Функция,
g
которая принимает на входz
и выводит обратный факториал этого числаПочти наверняка есть еще что-то, что можно сыграть в гольф, поэтому, если вы видите что-то, что я могу улучшить, пожалуйста, дайте мне знать.
Попробуйте онлайн!
Ungolfed и комментируется
Попробуйте онлайн!
источник
Javascript (без использования циклов!)
Чтобы сделать это, я использовал известную числовую аппроксимацию обратного приближения факторинга Стирлинга (и также получил вдохновение от этого ... кашля ... кашля ... кода кого-то еще ...)
источник