tło
Rozważ sekwencję zdefiniowaną w następujący sposób:
- Pierwszy element to 0;
- Drugi element to 4;
- Od trzeciego elementu jego wartość można obliczyć poprzez:
- Przyjęcie zestawu liczb całkowitych od 0 do poprzedniego elementu sekwencji (włącznie lub wykluczenia, to nie ma znaczenia);
- Usunięcie ze zbioru wszelkich liczb całkowitych, które pojawiły się wcześniej w sekwencji;
- Dodanie razem pozostałych elementów zestawu; to jest wartość, którą chcesz.
Co ciekawe, ta sekwencja nie wydaje się jeszcze znajdować w OEIS .
Zadanie
Napisać program lub funkcja, która bierze całkowitą N jako dane wejściowe, i wysyła n ty element sekwencji.
Przypadki testowe
Pierwsze kilka elementów sekwencji to:
- 0
- 4
- 6 (1 + 2 + 3)
- 11 (1 + 2 + 3 + 5)
- 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
- 969 (1 + 2 + 3 + 5 + 7… 10 + 12… 44)
- 468930 (1 + 2 + 3 + 5 + 7… 10 + 12… 44 + 46… 968)
Wyjaśnienia
- Twój program powinien teoretycznie być w stanie obsłużyć dowolne n, jeśli działa na wariancie twojego języka, który ma nieskończenie duże liczby całkowite i dostęp do nieograniczonej ilości pamięci. (Języki bez bignum raczej nie będą w stanie wyjść znacznie dalej niż 468930, ale to nie jest usprawiedliwienie dla zakodowania odpowiedzi na sztywno).
- Możesz wybrać indeksowanie w oparciu o 0 lub w oparciu o 1 (np. Od Ciebie zależy, czy n = 1 zwróci pierwszy element, n = 2 drugi element itd. Lub czy n = 0 zwróci pierwszy element , n = 1 drugi element itd.).
- Nie ma wymagań dotyczących używanego algorytmu ani jego wydajności; możesz zaimplementować definicję sekwencji bezpośrednio (nawet jeśli jest ona naprawdę nieefektywna), a także możesz zaimplementować inny algorytm, który prowadzi do takich samych wyników.
Warunek zwycięstwa
To jest golf golfowy , więc wygrywa najkrótszy poprawny program, mierzony w bajtach.
Odpowiedzi:
Galaretka ,
13129 bajtówKorzysta z indeksowania opartego na 0.
Wypróbuj online!
Jak to działa
źródło
Python,
6660 bajtówDzięki @Dennis za zgolenie 6 bajtów!
To nie jest najbardziej golfowy kawałek kodu, ale używa formuły, którą stworzyłem:
Gdzie
x
jestf(n - 1)
iy
jest po prawej stronief(n - 2)
.Wyjaśnienie:
Suma liczb całkowitych ciągłych od
a
dob
(włącznie) można opisać następującym wzorem:Gdzie
amount
(liczba liczb) jest opisana w następujący sposób:I
average
(średnia wszystkich liczb) jest opisana w następujący sposób:Pełna formuła jest teraz:
Sposób, w jaki wdrożyć tę formułę do ostatecznego wzoru ma zastąpić
a
naf(n - 1)
,b
naf(n - 2)
, które zasadniczo oblicza sumę wszystkich nowych kategoriach i dodać kolejnyf(n - 1)
(który jest teraza
) na, która jest sumą wszystkich poprzednich kadencjach.Łącząc to razem, otrzymujemy:
Wymień
a
sięx
ib
zy
, i hej presto, musisz powyższym wzorem.źródło
Python 2 ,
585450 bajtówWypróbuj online!
źródło
Matematyka,
4948 bajtówWykorzystuje kodowanie CP-1252. Definiuje funkcję
PlusMinus (±)
. 1-indeksowany.Wyjaśnienie
źródło
Oaza , 11 bajtów
Kod:
Wyjaśnienie:
Aby zwizualizować relację f n , weźmy przykład f 5 . Aby obliczyć f 5 , spójrzmy na następującą sumę:
1 + 2 + 3 + 5 + 7 + 8 + 9 + 10
Pogrubiona część jest taka sama jak f 4 . Część 7 + 8 + 9 + 10 jest zakresem [f n-2 + 1, f n-1 - 1] . To sprawia, że wzór f n-1 + Σ [f n-2 + 1 ... f n-1 - 1] ( link Wolfram ):
f n = 0,5 × (f n-1 2 - f n-2 2 + f n-1 - f n-2 )
Które można przepisać na:
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 ) + (f n-1 - f n-2 ))
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 + 1))
Jakiej formuły będziemy używać w kodzie:
Wyjaśnienie kodu
640
Część daje nam przypadki Base:Kod, który zostanie wykonany (który definiuje (n) ):
Wypróbuj online!
źródło
Julia,
393332 bajtyW oparciu o 0.
Dzięki @Dennis zaoszczędzono 6 bajtów.
Dzięki @GlenO zapisano bajt.
Wypróbuj online!
Poprzednia odpowiedź 1- w oparciu:
Wypróbuj online!
Poprzednia odpowiedź bez odpowiedzi na podstawie 1:
Wypróbuj online!
źródło
n<3?5n-n^2:
zamiastn<4?2(n>1)n:
- zauważ, że przełącza się on na stosowanie indeksowania opartego na 0.JavaScript (ES6), 47 bajtów
Wykorzystuje relację powtarzalności
f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))
dla n> 2.źródło
PowerShell ,
84898887 bajtówWypróbuj online!
Wyjaśnienie
Indeksowanie na podstawie 0. Działa tylko przez
n = 6
(na moim komputerze z systemem Windows ulega awarii z przepełnieniem stosun = 7
).Przy użyciu tej samej metody, co odpowiedź JungHwan Min (suma zakresu minus suma poprzednich terminów).
Podsumowanie zakresu / tablicy w PowerShell jest długie, więc używam sztuczki, łącząc tablicę z,
+
aby utworzyć długie wyrażenie (jak1+2+3+4...etc
), a następnie wysyłając je przeziex
(Invoke-Expression
).Ponieważ muszę to zrobić dwa razy, zamiast używania
-join
ustawiam specjalną zmienną$OFS
, która oznacza separator pola wyjściowego. Kiedy tworzymy tablicę, jest to znak używany do łączenia elementów; domyślnie jest to spacja. Więc przez ustawienie go+
(raz), mogę wymienić coś podobnego$a-join'+'|iex
z"$a"|iex
.Prosta
for
pętla trwa, dopóki liczba sekwencji nie jest mniejsza lub równa wejściowej liczbie całkowitej, a następnie zwracam$n
element th.źródło
;
potrzebne pofor
pętli. Nigdy wcześniej nie zdawałem sobie z tego sprawy.MATL ,
1716 bajtów1
stosuje się indeksowanie na podstawie. Kod jest bardzo nieefektywny. Ponieważn = 6
już przekracza limit pamięci kompilatora online.Wypróbuj online!
Jak to działa
W przypadku 20 bajtów następująca wersja pozwala uniknąć ograniczenia pamięci. Ale nadal istnieje ograniczenie typu danych (
double
typ może jedynie zagwarantować, że liczby całkowite są dokładnie reprezentowane do2^53
), więc wyniki są ważnen = 8
tylko do .Wypróbuj też online !
źródło
Haskell , 42 bajty
Wypróbuj online!
To bezpośrednio realizuje nawrotom że
n>2
,f(n)
równaf(n-1)
plus suma otwartym przedziale odf(n-2)
celuf(n-1)
, który ponownie jest równa sumie przedziału półotwartej odf(n-2)
dof(n-1)
włącznie.źródło
Haskell, 31 bajtów
Przykład użycia:
((0:4#6)!!) 6
->468930
. Wypróbuj online! .Prosta rekurencja, która śledzi maksymalny do
m
tej pory element i następną wartośćs
.źródło
JavaScript,
123119 bajtówWypróbuj online! Rozwiązanie to jest 1 na bazie
f(1) => 0
.źródło
Perl 6 ,
52 49 4435 bajtówSpróbuj
Spróbuj
Spróbuj
Spróbuj
Rozszerzony:
źródło
PowerShell ,
7773 bajtówWypróbuj online!
Implementuje zdefiniowany algorytm i ma indeks 0. Wejście z
6
jest zbyt duże, aby poradzić sobie z TIO.Ustawia
$a
się na tablicę[0,4]
. Pętle od1
do wejścia$n
. W pętli bierzemy zakres liczb od0
największej, jaką mamy$a[-1]
, i używamyWhere-Object
klauzuli,|?{...}
aby wyciągnąć tylko te liczby, które nie są jeszcze obecne. Ta tablica liczb jest-join
edytowana razem z+
s, a następnie podawana doiex
(skrót odInvoke-Expression
i podobny doeval
). Ta wartość jest następnie konkatenowana z tablicą na końcu$a
. Na koniec wychodzimy z pętli i bierzemy$n
liczbę th z naszej tablicy. Liczba ta pozostanie w potoku, a dane wyjściowe są niejawne.źródło
Python 2 , 85 bajtów
Wypróbuj online!
źródło
Partia, 108 bajtów
Port mojej odpowiedzi JavaScript.
źródło
dc , 47 bajtów
Działa z liczbami całkowitymi tak dużymi, jak chcesz, aż do pojemności pamięci komputera.
Wypróbuj online!
Indeksowanie na podstawie 0, wejście na stdin, wyjście na stdout. (Jest także wyjście na stderr, które należy zignorować.)
Przykładowe przebiegi:
Używa tego samego algorytmu jak poniższe rozwiązanie w bash, które jest (trochę) bardziej czytelne:
Pure Bash, 60 bajtów
Ale program bash działa tylko dla wejść do 7, ponieważ przekracza przepełnienie liczb całkowitych.
źródło
Pyth - 15 bajtów
Pakiet testowy .
źródło
C # - 74 bajty
Nie golfowany:
Prawdopodobnie istnieje sposób, aby przekonwertować to na lambda, aby zaoszczędzić jeszcze więcej, lub coś przy użyciu funkcji .Aggregate. Chociaż obecnie nie mam importu, to może wyrównuje się?
źródło
> <> , 43 + 3 = 46 bajtów
Wykorzystuje wzór przedstawiony w odpowiedziach Adnana i Qwerp-Derpa .
Oczekuje, że dane wejściowe będą obecne na stosie, więc +3 bajty dla
-v
flagi.Wypróbuj online!
źródło