Definicja
a(0) = 0
a(n) = n-a(a(a(n-1)))
dla liczby całkowitejn > 0
Zadanie
Biorąc pod uwagę nieujemną liczbę całkowitą n
, wyjście a(n)
.
Przypadki testowe
n a(n)
0 0
1 1
2 1
3 2
4 3
5 4
6 4
7 5
8 5
9 6
10 7
11 7
12 8
13 9
14 10
15 10
16 11
17 12
18 13
19 13
20 14
10000 6823
Bibliografia
code-golf
sequence
number-theory
recursion
Leaky Nun
źródło
źródło
Odpowiedzi:
Haskell,
2322 bajtówPo prostu używa definicji sekwencji.
f(f$f$n-1)
jest równoważne zf (f (f (n-1)))
.Test:
Dzięki Andersowi Kaseorgowi za bajt!
źródło
(f$f$f$n-1)
=f(f$f$n-1)
zapisuje bajt.Galaretka , 8 bajtów
Wypróbuj online! lub zweryfikuj mniejsze przypadki testowe .
Jak to działa
źródło
Mathematica, 20 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1 (lub zgodne) i
$CharacterEncoding
ustawia pasującą wartość, na przykład wartość domyślną systemu WindowsWindowsANSI
.To definiuje jednoargumentowy operator
±
.źródło
PlusMinus
. Zobacz ten post, aby uzyskać szczegółowe informacje.@
lub[ ]
.JOT,
1412 bajtówZaoszczędzono 2 bajty dzięki @ Leaky Nun .
Oblicza wynik, wywołując się rekurencyjnie, gdy n > 0 trzy razy na n -1 i odejmując wynik od n . Inna sytuacja występuje w przypadku podstawowym, gdy n = 0. Tam oblicza n - n, co jest równe 0.
Wypróbuj tutaj.
Wyjaśnienie
źródło
Julia, 16 bajtów
Wypróbuj online!
Jak to działa
Przedefiniowujemy jednoargumentowego operatora
!
do naszych celów.Jeśli n = 0 , porównanie
n>0
zwraca false i tak też jest!
.W przeciwnym razie kod po
&&
zostanie wykonany.~-n
jest równoważne(n-1)
uzupełnieniu do dwóch,!!!
rekurencyjnie wywołuje!
trzykrotnie n - 1 , a wynikową wartość odejmuje się od n .źródło
-!!~-
.!
jest po prostu nazwą funkcji.Python, 31 bajtów
Limit rekurencji i ograniczenia czasowe sprawiają, że powyższa funkcja jest niepraktyczna, ale teoretycznie powinna działać (i działa na małe n).
źródło
JavaScript (ES6), 52 bajty
Mogłem się nudzić i napisać wersję rekurencyjną, ale ta wersja jest znacznie szybsza (łatwo radzi sobie z ostatnim testem) i również używa,
reduce
więc to plus!źródło
Siatkówka ,
4943 bajtówWypróbuj online!
źródło
CJam,
1312 bajtówDzięki Dennisowi za zaoszczędzenie 1 bajtu.
Sprawdź to tutaj.
źródło
a
.R
4241 bajtówStosowanie:
To podejście rekurencyjne nie daje się dobrze skalować w przypadku większych wartości
n
.źródło
n<1
. Jako sekwencja jest tak naprawdę zdefiniowana tylko dla liczb całkowitych nieujemnych.a=function(n)"if"(n,n-a(a(a(n-1))),0)
będzie działać przez kilka bajtów off.Oaza , 6 bajtów
Kod:
Wersja rozszerzona:
Kod:
Wypróbuj online!
źródło
Sesos ,
5855 bajtówObsługuje dane wejściowe do 400Dobrze radzi , ale po tym czasie czas działania znacznie wzrasta.
Wypróbuj online! Sprawdź debugowanie opcję aby zobaczyć wygenerowany kod SBIN.
Montaż Sesos
Powyższy plik binarny został wygenerowany przez skompletowanie następującego kodu SASM.
źródło
LISP, 61 bajtów
Prawdopodobnie nie jest to optymalne rozwiązanie, ale działa.
źródło
Java 7, 42 bajty
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wynik:
źródło
Rubinowy, 27 bajtów
Oczywista implementacja.
Jest to dłuższa, szybsza odpowiedź, która buforuje poprzednie wpisy w sekwencji. Obie odpowiedzi działają tylko w wersjach po wersji 1.9, ponieważ wtedy
->
Ruby wprowadziła mocną lambdę.źródło
C #, 35 bajtów
źródło
Golfscript,
2625 bajtówWypróbuj online!
Lokalnie
10000
zajmuje mniej niż pół sekundy.źródło
DO,
3532 bajtyZaoszczędź 3 bajty dzięki @PeterTaylor!
Wypróbuj na Ideone!
źródło
a(n){return n?n-a(a(a(n-1))):0;}
:
Twój kod również zawiera błąd. Powinieneś wyjąć następnego?
.JavaScript ES6, 22 bajty
Będę się nudzić i wykonam wersję rekurencyjną: P
źródło
VBA, 69 bajtów
Działa w mgnieniu oka na zestawie testowym, zwalnia nieco powyżej n = 1000000, wpada w ścianę pamięci nieco powyżej n = 25 milionów.
źródło
Pyth, 10 bajtów
Definiuje funkcję
y
. Wypróbuj online: demonstracjaUżywa to względnie nowej funkcji Pytha. Możesz zastosować funkcję wiele razy, używając składni. W rzeczywistości nie oszczędza żadnych bajtów, użyłem go tylko do celów demonstracyjnych.
Wyjaśnienie:
źródło
Klon,
2826 bajtówStosowanie:
źródło
dc, 34 bajty
Dane wejściowe są pobierane z góry stosu. To musi być jedyny element na stosie, ponieważ głębokość stosu jest używana jako licznik. Przykład użycia:
Jest to dość prosta implementacja definicji sekwencji:
W każdym razie zaczęło się to od razu ... potem grało się w golfa.
źródło
Common Lisp , 44 bajty
Wypróbuj online!
źródło
C ++ (głównie MSVC)
Wersja normalna: 40 bajtów
Wersja meta programowania szablonu: 130 bajtów
Stosowanie :
Wersja szablonu jest najszybszym kodem, ponieważ nie ma nic szybszego niż przeniesienie wartości do rejestru => z optymalizacją,
H<20>::a()
kompiluj jako:W przypadku wersji 10000 wersja rekurencyjna ulega awarii z powodu błędu przepełnienia stosu, a wersja szablonu ulega awarii podczas kompilacji z powodu głębokości tworzenia szablonów. GCC idzie do 900 (614)
źródło
C
i{
w szablonowej wersji meta programowaniaD , 36 bajtów
Wypróbuj online!
źródło
APL (Dyalog Unicode) ,
1817 bajtówWypróbuj online!
O dziwo, nie ma odpowiedzi APL na to wyzwanie. Jest to dosłowna implementacja funkcji w PO.
Upłynął limit czasu TIOn > 90 .
Zapisano bajt dzięki @ Zacharý.
źródło
{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}
Python 3, 72 bajty
Ideone to!
źródło
PowerShell v2 +, 56 bajtów
Ekwiwalent PowerShell dla lambda w celu utworzenia definicji rekurencyjnej. Wykonaj go za pośrednictwem
&
operatora połączenia, np&$a(5)
. Trwa długo czasu - nawet50
na moim komputerze (najnowszy i5 z 8 GB pamięci RAM) zajmuje około 90 sekund.Szybsze rozwiązanie iteracyjne, 59 bajtów
Dłuższy tylko dlatego, że musimy uwzględnić dane wejściowe
0
(to*!!$n
koniec). W przeciwnym razie po prostu iteracyjnie konstruujemy tablicę$n
, dodając za każdym razem nowy element, i wypisujemy ostatni na końcu$o[-1]
. Superszybki - obliczenia10000
na moim komputerze trwają około 5 sekund.źródło
> <> , 55 + 2 = 57 bajtów
Dane wejściowe powinny być obecne na stosie przy starcie programu, więc +2 bajty dla
-v
flagi. Wypróbuj online!Jest to hecka wolna, ponieważ wykorzystuje rekurencję do obliczenia wyniku. Korzystanie z TIO
h(50)
zajmuje ponad minutę. Zwraca prawidłowe wyniki <= 30, więc jestem pewien, że to zadziałah(10000)
, po prostu nie uruchomiłem go, aby się dowiedzieć!źródło