Учитывая положительное целое число п и число А , тем п -й тетрация из определяется как ^ ( ^ ( ^ (... ^ ))), где ^ означает возведение в степень (или мощность) и выражение содержит число ровно п раз.
Другими словами, тетрация - это право-ассоциативное повторное возведение в степень. Для n = 4 и a = 1.6 тетракция равна 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
Обратная функция тетрации по n является супер-логарифмом . В предыдущем примере 4 является супер-логарифмом 3,5743 с «супер-базой» 1,6.
Соревнование
По положительному целому числу n найдите x такой, что n является супер-логарифмом самого себя в супербазе x . То есть найдите x такой, что x ^ ( x ^ ( x ^ (... ^ x ))) (где x появляется n раз) равно n .
правила
Программа или функция разрешены.
Форматы ввода и вывода, как обычно, гибкие.
Алгоритм теоретически должен работать для всех натуральных чисел. На практике ввод может быть ограничен максимальным значением из-за ограничений памяти, времени или типа данных. Тем не менее, код должен работать для входов 100
не менее чем за минуту.
Алгоритм теоретически должен давать результат с 0.001
точностью. На практике точность вывода может быть хуже из-за накопленных ошибок в численных расчетах. Однако выходные данные должны быть точными до 0.001
указанных тестовых случаев.
Самый короткий код выигрывает.
Контрольные примеры
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Ссылочная реализация
Вот эталонная реализация в Matlab / Octave (попробуйте в Ideone ).
N = 10; % input
t = .0001:.0001:2; % range of possible values: [.0001 .0002 ... 2]
r = t;
for k = 2:N
r = t.^r; % repeated exponentiation, element-wise
end
[~, ind] = min(abs(r-N)); % index of entry of r that is closest to N
result = t(ind);
disp(result)
За N = 10
это дает result = 1.5085
.
Следующий код проверяет точность вывода, используя арифметику переменной точности:
N = 10;
x = 1.5085; % result to be tested for that N. Add or subtract 1e-3 to see that
% the obtained y is farther from N
s = num2str(x); % string representation
se = s;
for n = 2:N;
se = [s '^(' se ')']; % build string that evaluates to iterated exponentiation
end
y = vpa(se, 1000) % evaluate with variable-precision arithmetic
Это дает:
- Для
x = 1.5085
:y = 10.00173...
- Для
x = 1.5085 + .001
:y = 10.9075
- Ибо
x = 1.5085 - .001
это даетy = 9.23248
.
так 1.5085
что это правильное решение с .001
точностью.
x
Сходится лиn
приближается к бесконечности?Ответы:
Дьялог АПЛ ,
3325 байтТребуется
⎕IO←0
по умолчанию во многих системах.Теоретически рассчитывает для всех целых чисел, но практически ограничивается только очень маленьким.
Попробуй APL онлайн!
источник
Haskell,
555452 байтаИспользование:
Спасибо @nimi за 1 байт!
Спасибо @xnor за 2!
источник
[ ]!!0
вместо того, чтобыhead[ ]
сохранить байтs n=[x|x<-[2,1.9999..],n>iterate(x**)1!!n]!!0
было бы короче, если бы вы могли заставить Haskell принимать его типы.Javascript, ES6: 77 байт / ES7:
57,53 байтаES6
ES7
Использование
**
в соответствии с предложением DanTheMan:пример
источник
**
вместоMath.pow
.Mathematica,
4033 байтаБлагодаря Murphy для почти 20% экономии!
Nest[x^#&,1,n]
производит n-й тетрации х. Таким образом,Nest[x^#&,1,#]<#
проверяется, является ли (входная) -ая тетрация х меньше, чем (входная). Мы просто начинаем с x = 1 и добавляем 0,001 несколько раз, пока тетракция не станет слишком большой, а затем выводим последнее значение x (так что ответ гарантированно будет больше, чем точное значение, но в пределах 0,001).Как я медленно учусь:
//.x_:>y/;z
или//.x_/;z:>y
означает «искать все, что соответствует шаблону x, но только те вещи, для которых тест z возвращает true; а затем оперируем x по правилу y; несколько раз, пока ничего не изменится». Здесь шаблонx_
просто «любое число, которое я вижу», хотя в других контекстах оно может быть дополнительно ограничено.Когда входное значение составляет по меньшей мере 45, тетрация увеличивается так быстро, что этот последний шаг вызывает ошибку переполнения; но значение x все еще обновляется и выводится правильно. Уменьшение размера шага с 0,001 до 0,0001 устраняет эту проблему для входов до 112 и дает более точный ответ на загрузку (и все еще выполняется быстро, примерно за четверть секунды). Но это еще один байт, так что забудьте об этом!
Оригинальная версия:
источник
1//.x_:>x+.001/;Nest[x^#&,1,#]<#&
//.
без посторонней помощи :)J,
393128 байтНа основании эталонной реализации. Это только с точностью до трех знаков после запятой.
Сохраненные 8 байт , используя метод из @ Адамов решения .
использование
Дополнительные команды, используемые для форматирования нескольких входов / выходов.
объяснение
источник
Python, 184 байта
Тестовый вывод (пропуская фактические операторы печати):
источник
s(1000000)
довольно быстроРакетка 187 байт
Тестирование:
Выход:
Подробная версия:
источник
Perl 6 , 42 байта
(Перевод примера кода Matlab)
Тестовое задание:
источник
PHP, 103 байта
источник
Аксиома 587 байт
меньше гольфа + номера
источник
Common Lisp, 207 байт
Использование
reduce
with:from-end t
избавляет от необходимости выполнять промежуточную лямбду с "реверсированием степени" (в основном(lambda (x y) (expt y x))
, экономя 14 байтов (12, если вы удалите съемные пробелы).Нам по-прежнему нужно обрабатывать переполнение с плавающей точкой, но
ignore-errors
форма возвращается,nil
если произошла ошибка, поэтому мы можем использовать ееor
для предоставления значения по умолчанию.источник