Это должно быть простой задачей.
Учитывая число n >= 0
, выведите супер-логарифм (или log *, log-star или повторный логарифм , которые эквивалентны, поскольку n
никогда не отрицательны для этой задачи.) Of n
.
Это одна из двух обратных функций к тетрации . Другой - супер-корень , который находится в связанном вопросе .
Примеры
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
правила
- Вам не нужно поддерживать десятичные дроби, хотя вы можете.
- Вы должны поддержать ввод по крайней мере
3814280 = ceiling(e^e^e)
. - Вы не можете жестко кодировать значения, как
3814280
. (Ваша программа должна теоретически поддерживать более высокие числа.) Я хочу, чтобы алгоритм был реализован. - Самый короткий код выигрывает.
code-golf
math
code-golf
array-manipulation
sorting
code-golf
math
arithmetic
matrix
code-golf
string
kolmogorov-complexity
code-golf
string
code-golf
math
sequence
arithmetic
recursion
code-golf
math
ascii-art
sequence
code-golf
math
array-manipulation
code-golf
code-golf
kolmogorov-complexity
code-golf
string
code-golf
string
decision-problem
code-golf
array-manipulation
tips
javascript
json
code-golf
math
string
number
number-theory
code-golf
math
sequence
fibonacci
number
arithmetic
fastest-code
integer
code-golf
math
sequence
code-golf
string
file-system
tips
golfscript
code-golf
string
code-golf
string
natural-language
code-golf
string
file-system
code-golf
math
array-manipulation
code-challenge
image-processing
compression
code-golf
math
number
sequence
code-golf
math
combinatorics
regular-expression
code-golf
sequence
pi
code-golf
ascii-art
code-golf
string
array-manipulation
sorting
code-golf
string
graph-theory
code-golf
string
code-golf
string
ascii-art
code-challenge
compression
code-golf
code-golf
math
sequence
number-theory
code-golf
maze
graph-theory
code-golf
math
sequence
mbomb007
источник
источник
Ответы:
Желе , 8 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Задний план
Мы начинаем с последовательного получения натуральных логарифмов входных данных и последующих результатов, пока результат не перестанет меняться. Это работает, потому что расширение натурального логарифма на комплексную плоскость имеет фиксированную точку ; если z = e -W (-1) ≈ 0.318 + 1.337i - где W обозначает функцию W Ламберта - мы имеем log (z) = z .
Для ввода n , после вычисления [n, log (n), log (log (n)),…, z] , мы сначала применяем функцию потолка к каждому из результатов. Реализация Jelly (
Ċ
) на самом деле вместо этого вычисляет мнимую часть комплексного числа † , но мы все равно не заинтересованы в этом.Как только k- е приложение log выдаст значение, меньшее или равное 1 ,
Ċ
вернет 1 в первый раз. Основанный на 0 индекс этого первого 1 является желаемым результатом.Простая реализация (вычисление на основе индекса 1, декремент) завершается неудачей из-за граничного случая 0 , который не имеет 1 в своем списке логарифмов. На самом деле, для входа 0 последовательность логарифмов
Это потому, что логарифм Jelly (
Æl
) перегружен; сначала он пытаетсяmath.log
(реальный логарифм), затемcmath.log
(сложный логарифм) и, наконец, «сдается» и возвращаетсяNone
. К счастью,Ċ
аналогичным образом перегружается и просто возвращает аргумент, если не может округлить или принять мнимую часть.Аналогично, ввод 1 возвращает
которые могут создавать проблемы в других подходах, которые включают или не включают
Ċ
.Один из способов решения этой проблемы - применить
Ḋ
(удалить из очереди; удаляет первый элемент) к массиву логарифмов. Это картытак что ни один список не имеет 1 сейчас. Таким образом, поиск индекса первого 1 вернет 0 (не найдено), что является желаемым выходом для входов 0 и 1 .
Как это работает
† Это один из трех атомов в желе, которые перегружены неочевидным образом.
источник
Желе , 9 байт
Попробуйте онлайн!
Тестирование. (Слегка изменено.)
объяснение
источник
C, 38 байт
Довольно понятно.
Попробуйте это на Ideone.
источник
Javascript,
452726 байтВот тестовый набор (3-я версия)
Спасибо @LeakyNun за сохранение 1 байта с условной и последующей конвертацией функции в лямбду, и @Neil за указание на ложь - это нормально, возвращаемое значение для <= 1 (измененный тест на == вместо ===)
источник
false
вместо 0 (так как он автоматически преобразуется в 0 в целочисленном выражении), и в этом случае вы можете удалить|0
.Mathematica, 21 байт
Рекурсивная анонимная функция. Принимает целое число в качестве входных данных и возвращает его супер-логарифм в качестве выходных данных. Просто использует данное определение.
источник
Dyalog APL , 13 байт
Прямой перевод ОП:
Попробуй APL онлайн!
источник
Pyth, 10 байт
Тестирование.
Это определяет функцию.
источник
tl.u?>N1.l
;-)Haskell, 23 байта
Пример использования:
l 3814280
->4
.источник
Python 3, 45 байт
Ибо
x <= 1
, это возвращаетFalse
(который находится== 0
в Python).источник
False
можно использовать для0
.and
а неif else
). Грац.05AB1E,
1613 байтобъяснение
Попробуйте онлайн
источник
MATL ,
1512 байтПопробуйте онлайн! Или проверьте все контрольные примеры (слегка измененная версия для обработки нескольких входов).
Как это работает
Начиная с 0, применять повторное возведение в степень до превышения входного значения. На выходе получается количество итераций минус 1.
источник
J ,
21191816 байтСохранено 2 байта для «Нечистой монахини», 1 байт для Галена Иванова и 2 байта для «FrownyFrog»!
Попробуйте онлайн!
Контрольные примеры
источник
2#@}.^.^:(0<])^:a:
(Я начал совать то, что оказалось дублированием этой проблемы.)2#@}.(0>.^.)^:a:
похоже на работу.Юлия, 17 байт
Попробуйте онлайн!
источник
MATLAB / Octave, 44 байта
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Пытался сделать все это как одну анонимную функцию, но я забыл, что MATLAB / Octave продолжает оценивать выражения, даже если они умножаются на логическое значение false (ноль):
f=@(n)(n>1)*(1+f(log(n)))
источник
R,
3837 байтСпасибо @ user5957401 за дополнительный байт!
Тестовые случаи:
источник
if(x>1)1+f(log(x))else 0
на один байт короче.R , 34 байта
Попробуйте онлайн!
Возможен нерекурсивный подход: 36 байтов и он принимает входные данные от стандартного ввода.
источник
Java 7, 47 байт
Попробуйте онлайн.
Вышеуказанный рекурсивный метод стиля Java 7 на 2 байта короче, чем итеративный лямбда-стиль Java 8:
Попробуйте онлайн.
Объяснение:
источник
Emacs Lisp, 38 байт
Testcases:
источник
Желе , 8 байт
Простая реализация определения. Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Perl 5, 35 байт
Очень просто, требует
-M5.016
(что бесплатно) включить__SUB__
ключевое слово для анонимной рекурсии.Другая альтернатива
который составляет 34 байта и дает одинаковые выходные данные для всех входов> 1, но возвращает специальное ложное значение для входов <= 1. False численно равно нулю, но печатает как «» (пустая строка), поэтому, вероятно, не не имеет права
источник
sub{($_=pop)>1?1+__SUB__->(log):0}
хотяCJam (16 байт)
Онлайн демо
Простой цикл с предварительным условием. (То, что я действительно хочу здесь, это операция развертывания в стиле Golfscript, но у CJam ее нет, а плавающая точка в GolfScript грязная и совсем не похожая на гольф).
источник
PARI / GP , 24 байта
Просто прямая рекурсия.
источник
Ракетка, 61 байт
источник
Клен,
32,3029 байтТестовые случаи:
источник
R, 36 байт
Немного другой подход от Plannapus
Использует правильное назначение для запуска кода - поэтому желаемое число должно предшествовать ему. т.е.
источник
Mathematica, 29 байт
Простой, как весь ад, и работает для комично больших и отрицательных входов:
источник
Рубин, 29 байт
источник
n<=1?a:b
какn>1?b:a
и -1 байт с анонимными лямбда-функциями .Perl 6 , 21 байт
Попробуйте онлайн!
Заключенное в скобки выражение является последовательностью.
$_
, аргумент функции, является первым элементом.*.log
генерирует каждый последующий элемент, беря журнал предыдущего элемента. Последовательность продолжается до тех пор, пока конечное условие не1 >= *
станет истинным: 1 больше или равно текущему элементу. Вычитание 1 из последовательности приводит его к числу: его длина.источник