To powinno być proste wyzwanie.
Biorąc pod uwagę liczbę n >= 0
, Wyjście super logarytm (lub dziennik *, log-gwiazda, albo powtórzyć logarytm , które są równoważne, ponieważ n
nigdy nie jest negatywna na to wyzwanie.) Z n
.
Jest to jedna z dwóch odwrotnych funkcji do tetracji . Drugim jest super-root , który jest w pokrewnym pytaniu .
Przykłady
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
Zasady
- Chociaż nie musisz obsługiwać miejsc po przecinku.
- Musisz wesprzeć wejście co najmniej
3814280 = ceiling(e^e^e)
. - Nie możesz na stałe zakodować takich wartości jak
3814280
. (Twój program musi teoretycznie obsługiwać wyższe liczby.) Chcę, aby algorytm został wdrożony. - Najkrótszy kod wygrywa.
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
źródło
źródło
Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Zaczynamy od sukcesywnego przyjmowania naturalnych logarytmów danych wejściowych i kolejnych wyników, aż wynik się nie zmieni. Działa to, ponieważ rozszerzenie logarytmu naturalnego na płaszczyznę złożoną ma punkt stały ; jeśli z = e -W (-1) ≈ 0,318 + 1,337i - gdzie W oznacza funkcję L Lbert - mamy log (z) = z .
Dla danych wejściowych n , po obliczeniu [n, log (n), log (log (n)),…, z] najpierw stosujemy funkcję pułapu do każdego z wyników. Implementacja Jelly (
Ċ
) faktycznie oblicza urojoną część liczby zespolonej zamiast † , ale i tak nas to nie interesuje.Gdy k- ta aplikacja dziennika da wartość mniejszą lub równą 1 ,
Ċ
zwróci 1 po raz pierwszy. Liczony od 0 indeks pierwszego 1 jest pożądanym wynikiem.Prosta implementacja (obliczanie indeksu 1, dekrementacja) kończy się niepowodzeniem z powodu przypadku krawędzi 0 , który nie ma wartości 1 na liście logarytmów. W rzeczywistości dla wejścia 0 sekwencja logarytmów wynosi
Jest tak, ponieważ logarytm Jelly (
Æl
) jest przeciążony; najpierw próbujemath.log
(logarytm rzeczywisty), potemcmath.log
(logarytm złożony), a na koniec „poddaje się” i wracaNone
. Na szczęścieĊ
jest podobnie przeciążony i po prostu zwraca argument, jeśli nie może zaokrąglić w górę lub wyimaginować.Podobnie, wejście 1 zwraca
co może stwarzać problemy w innych podejściach, które obejmują lub nie obejmują
Ċ
.Jednym ze sposobów rozwiązania tego problemu jest zastosowanie
Ḋ
(usuń kolejkę; usuwa pierwszy element) z tablicy logarytmów. To mapywięc żadna lista nie ma teraz 1 . W ten sposób znalezienie indeksu pierwszego 1 zwróci 0 (nie znaleziono), co jest pożądanym wyjściem dla wejść 0 i 1 .
Jak to działa
† Jest to jeden z niewielu atomów galaretki, które są przeciążone w nieoczywisty sposób.
źródło
Galaretka , 9 bajtów
Wypróbuj online!
Zestaw testowy. (Lekko zmieniony.)
Wyjaśnienie
źródło
C, 38 bajtów
Dość oczywiste.
Wypróbuj na ideone.
źródło
JavaScript,
452726 bajtówOto pakiet testowy (3. wersja)
Dzięki @LeakyNun za zapisanie 1 bajtu z funkcją warunkową, a następnie konwersję funkcji na lambda, a @Neil za wskazanie fałszu jest w porządku zwracana wartość dla <= 1 (zmieniono test na == zamiast ===)
źródło
false
zamiast 0 (ponieważ automatycznie konwertuje na 0 w wyrażeniu całkowitym), w którym to przypadku możesz upuścić|0
.Mathematica, 21 bajtów
Rekurencyjna anonimowa funkcja. Pobiera na wejściu liczbę całkowitą i zwraca swój logarytm jako wynik. Po prostu używa podanej definicji.
źródło
Dyalog APL , 13 bajtów
Bezpośrednie tłumaczenie OP:
Wypróbuj APL online!
źródło
Pyth, 10 bajtów
Zestaw testowy.
To definiuje funkcję.
źródło
tl.u?>N1.l
;-)Haskell, 23 bajty
Przykład użycia:
l 3814280
->4
.źródło
Python 3, 45 bajtów
Na
x <= 1
to zwracaFalse
(co jest== 0
w Pythonie).źródło
False
można użyć do0
.and
raczej niżif else
). Grats05AB1E,
1613 bajtówWyjaśnienie
Wypróbuj online
źródło
MATL ,
1512 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe (nieco zmodyfikowana wersja do obsługi kilku danych wejściowych).
Jak to działa
Począwszy od 0, stosuj iterowane potęgowanie aż do przekroczenia wartości wejściowej. Dane wyjściowe to liczba iteracji minus 1.
źródło
J ,
21191816 bajtówZapisano 2 bajty na Dziurawą Zakonnicę, 1 bajt na Galena Iwanowa i 2 bajty na FrownyFrog!
Wypróbuj online!
Przypadki testowe
źródło
2#@}.^.^:(0<])^:a:
(Zacząłem przeszukiwać to, co okazało się duplikatem tego problemu).2#@}.(0>.^.)^:a:
wydaje się działać.Julia, 17 bajtów
Wypróbuj online!
źródło
MATLAB / Octave, 44 bajty
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Próbowałem zrobić to wszystko jako jedna anonimowa funkcja, ale zapomniałem, że MATLAB / Octave kontynuuje ocenę wyrażeń, nawet jeśli są one pomnożone przez wartość logiczną false (zero):
f=@(n)(n>1)*(1+f(log(n)))
źródło
R,
3837 bajtówDzięki @ user5957401 za dodatkowy bajt!
Przypadki testowe:
źródło
if(x>1)1+f(log(x))else 0
jest o jeden bajt krótszy.R , 34 bajty
Wypróbuj online!
Możliwe jest podejście nierekurencyjne: 36 bajtów i pobiera dane wejściowe ze standardowego wejścia.
źródło
Java 7, 47 bajtów
Wypróbuj online.
Powyższa metoda rekurencyjna w stylu Java 7 jest o 2 bajty krótsza niż iteracyjna lambda w stylu Java 8:
Wypróbuj online.
Wyjaśnienie:
źródło
Emacs Lisp, 38 bajtów
Przypadki testowe:
źródło
Galaretka , 8 bajtów
Prosta implementacja definicji. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Perl 5, 35 bajtów
Bardzo prosty, wymaga
-M5.016
(który jest bezpłatny) włączenia__SUB__
słowa kluczowego w celu anonimowej rekurencji.Inną alternatywą jest
który ma 34 bajty i daje takie same dane wyjściowe dla wszystkich danych wejściowych> 1, ale zwraca specjalną wartość false dla danych wejściowych <= 1. Fałsz jest liczbowo równy zero, ale jest drukowany jako „” (pusty ciąg znaków), więc prawdopodobnie nie robi „ zakwalifikować się.
źródło
sub{($_=pop)>1?1+__SUB__->(log):0}
jednakCJam (16 bajtów)
Demo online
Prosta pętla while z warunkiem wstępnym. (To, czego naprawdę chcę tutaj, to operacja rozwijania w stylu Golfscript, ale CJam nie ma takiej operacji, a zmienna zmienna w GolfScript jest bałaganiarska i wcale nie jest golfowa).
źródło
PARI / GP , 24 bajty
Prosta rekurencja.
źródło
Rakieta, 61 bajtów
źródło
Klon,
32,3029 bajtówPrzypadki testowe:
źródło
R, 36 bajtów
Nieco inne podejście niż Plannapus
Używa odpowiedniego przypisania do uruchomienia kodu - więc żądany numer musi go poprzedzić. to znaczy
źródło
Mathematica, 29 bajtów
Prosty jak diabli i działa zarówno na komicznie duże, jak i negatywne dane wejściowe:
źródło
Rubinowy, 29 bajtów
źródło
n<=1?a:b
jakon>1?b:a
i -1 dodatkowy bajt z anonimowymi funkcjami lambda .Perl 6 , 21 bajtów
Wypróbuj online!
Wyrażenie w nawiasie to sekwencja.
$_
, argument funkcji, jest pierwszym elementem.*.log
generuje każdy kolejny element, biorąc dziennik poprzedniego elementu. Sekwencja jest kontynuowana, dopóki warunek końcowy nie1 >= *
jest prawdziwy: 1 jest większy lub równy bieżącemu elementowi. Odejmowanie 1 od sekwencji wymusza jej liczbę: długość.źródło