ÆlÐĿĊḊi1
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
[0, None]
Jest tak, ponieważ logarytm Jelly ( Æl
) jest przeciążony; najpierw próbuje math.log
(logarytm rzeczywisty), potem cmath.log
(logarytm złożony), a na koniec „poddaje się” i wraca None
. 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
[1, 0, None]
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 mapy
0ÆlÐĿ -> [0, None] -> [None]
1ÆlÐĿ -> [1, 0, None] -> [0, None]
wię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
ÆlÐĿĊḊi1 Main link. Argument: n (non-negative integer)
ÐĿ Apply the following link until the results are no longer unique.
Æl Natural logarithm.
Return the array of all unique results.
Ċ Round all resulting real numbers up to the nearest integer. This takes
the imaginary part of complex numbers and does nothing for non-numbers.
Ḋ Dequeue; remove the first item (n) of the array of results.
i1 Find the first index of 1 (0 if not found).
† Jest to jeden z niewielu atomów galaretki, które są przeciążone w nieoczywisty sposób.