Twoje zadanie jest dość proste, oblicz n-ty element A190810 .
Elementy A190810 są obliczane zgodnie z następującymi zasadami:
- Pierwszym elementem jest 1
- Sekwencja rośnie
- Jeśli
x
występuje w sekwencji, to2x+1
i3x-1
również
Możesz użyć indeksowania 1 lub 0, ale jeśli używasz indeksowania 0, powiedz to w odpowiedzi.
Przypadki testowe
a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255
Ponieważ jest to kod-golf, wygrywa najkrótsza odpowiedź w bajtach!
x ϵ A → (2*x) + 1 ϵ A
ix ϵ A → (3*x)-1 ϵ A
gdzieϵ
oznacza „jest członkiem” i→
może być rozumiane jako „implikuje”.Odpowiedzi:
Galaretka , 16 bajtów
Bardzo nieefektywne. Wypróbuj online!
Jak to działa
źródło
Python 2,
888372 bajtyMożesz przeczytać programy w tej odpowiedzi w odwrotnej kolejności ...
Wolniej i krócej dzięki Dennisowi:
Wypróbuj online
To nie działa tak szybko, ale jest krótsze ( 83 bajty ). Sortując i usuwając duplikaty każdej iteracji, a także usuwając pierwszy element, usuwam potrzebę indeksowania na liście. Wynik jest po prostu pierwszym elementem po
n
iteracjach.Mogłem wygrać z Dennisiem. :RE
Wypróbuj online
Ta wersja poniżej ( 88 bajtów ) działa naprawdę szybko, znajdując 500 000-ty element w około dwie sekundy.
To całkiem proste. Oblicz elementy listy, aż będzie ich trzy razy więcej niż
n
, ponieważ każdy dodany element może dodać maksymalnie 2 więcej unikalnych elementów. Następnie usuń duplikaty, posortuj i wydrukujn
element th (indeksowany od zera).Wypróbuj online
źródło
Python 2, 59 bajtów
Na podstawie odpowiedzi Python @ mbomb007 . Przetestuj na Ideone .
źródło
min
jest O (n), podczas gdy indeksowanie list to O (1) , więc to rozwiązanie to przynajmniej O (n²) ...Haskell,
767369 bajtówKorzysta z indeksu 0. Przykład użycia:
(filter t[1..]!!) 54
->255
.Zamiast budować listę poprzez wielokrotne wstawianie
2x+1
i3x-1
jak widać w większości innych odpowiedzi, przeglądam wszystkie liczby całkowite i sprawdzam, czy można je zredukować1
poprzez wielokrotne stosowanie(x-1) / 2
lub(x+1) / 3
czy można je podzielić.źródło
f=filter t[1..]!!
), ponieważ nie sądzę, aby to było poprawne.Haskell,
7774 bajtyZapewnia to funkcję
a
dla n-tego wpisu. Jest indeksowany na zero. Alternatywniea=nub$f[1]
utworzy całą listę (leniwie).Jest to wariant listy
Set
kodu Reinharda Zumkellera .źródło
y
zamiastxs
zapisać dwa bajty? Wierzę też, że możesz być w stanie skrócić ostatnią linię do czegoś w stylu(!!)$nub.f[1]
(x:xs)
, całkowicie zapomniałem, dzięki.Python 2,
8884 bajtówPrzetestuj na Ideone .
źródło
Pyth,
2019 bajtówWypróbuj online. Zestaw testowy.
Używa indeksowania zerowego.
źródło
1
i to oczywiście nie działało.Brachylog , 45 bajtów
Oblicza
N = 1000
za około 6 sekund na moim komputerze.Jest to indeks 1, np
Wyjaśnienie
Główny predykat:
Predykat 1:
Możesz zauważyć, że nie przekazujemy żadnych danych wejściowych do predykatu 1, kiedy dzwonimy
y - Yield
. Z powodu propagacji ograniczeń znajdzie właściwe wejście po dotarciu do1.
klauzuli, która będzie propagować prawidłowe wartości wejściowe.źródło
MATL,
19, 1817 bajtówJest to niezwykle nieefektywny algorytm. W tłumaczu internetowym zabrakło pamięci dla danych wejściowych większych niż 13.
Jeden bajt zapisany, dzięki Luisowi Mendo!
Wypróbuj online!
Ta wersja jest dłuższa, ale bardziej wydajna (21 bajtów)
Wypróbuj online
Wyjaśnienie:
Logicznym sposobem na to jest dodawanie elementów do tablicy, dopóki nie będzie wystarczająco długa, aby chwycić ity element. Tak działa ten wydajny. Golfy (i nieefektywne) sposób to zrobić, to po prostu zwiększyć rozmiar tablicy : i razy.
Więc po pierwsze, możemy zdefiniować tablicę startowy:
1
. Następnie zamieniamy dwa górne elementy, aby dane wejściowe były na górze.w
. Teraz zapętlamy wejście za pomocą:"
. Więc I czasy:Teraz mamy gigantyczny zestaw sekwencji. (O wiele więcej niż potrzeba do obliczenia) Więc przestajemy
]
zapętlać i pobieramy i-tą liczbę z tej tablicy za pomocąG)
(1-indeksowane)źródło
1`tEQy3*qvuStnG<]G)
. Warunkiem pętli jesttnG<
(wyjście, gdy tablica ma już wymagany rozmiar)for
wersji -opętlnej możesz wziąć wkład jako jednorzędowy i usunąć:
JavaScript (ES6), 63 bajty
Prawdopodobnie szybko się poddaje z powodu rekurencji.
źródło
Retina, 57
Wypróbuj online!
0-indeksowane. Postępuje zgodnie z często stosowanym algorytmem: usuń minimalną wartość z bieżącego zestawu, wywołaj ją
x
i dodaj2x+1
i3x-1
do zestawu liczbę razy równą wejściowej, to wynikiem będzie liczba wiodąca. „Zestaw” w Retinie jest tylko listą, która jest wielokrotnie sortowana i zawiera tylko unikalne elementy. Do algorytmu golfa dodano kilka podstępnych elementów, które wyjaśnię, gdy będę miał więcej czasu.Ogromne podziękowania dla Martina za grę w golfa około 20 bajtów!
źródło
Clojure,
114108 bajtówNie zdziwiłbym się, gdyby można było to znacznie pograć w golfa / zmniejszyć, ale
set
nie wspieranie nth naprawdę zraniło mój tok myślenia.Wypróbuj online
Wersja ze spacjami:
źródło
05AB1E,
1817 bajtówWykorzystuje kodowanie CP-1252 .
Wyjaśnienie
Wypróbuj online dla małych liczb
Bardzo wolno.
Wykorzystuje indeksowanie 0.
źródło
C ++, 102 bajty
Ta funkcja lambda wymaga
#include <map>
iusing std::map
.map
Tutaj jest po prostu zbiorem kluczy; ich wartości są ignorowane. Używammap
, aby skorzystać z krótkiego kodu do wstawienia:Dzięki posortowanej kolejności
map
najmniejszy element jest wydobywany przezk.begin()->first
.źródło
set
i inicjator list:[](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};
.Właściwie 27 bajtów
Wypróbuj online!
Ten program używa indeksowania opartego na 0. Podejście to jest bardzo brutalne, więc nie oczekuj, że zadziała w tłumaczu online przy większych nakładach.
Wyjaśnienie:
źródło
CJam (25 bajtów)
Demo online . Zauważ, że używa to indeksowania zerowego.
To stosuje podobne podejście do większości: zastosuj
n
czasy przekształceń, a następnie posortuj i wyodrębnij tenn
element. Jako ukłon w stronę wydajności deduplikacja jest stosowana wewnątrz pętli, a sortowanie odbywa się na zewnątrz pętli.źródło
1ari{(_2*)\3*(@||$}*0=
(Również o wiele bardziej wydajny.)Siatkówka , 48 bajtów
Wypróbuj online!
Zainspirowany odpowiedzią nich pomyślałem, że spróbuję zastosować inne podejście do Retiny, korzystając z cofania się silnika regex, aby dowiedzieć się, czy którykolwiek (jednoznaczny) numer jest w sekwencji, czy nie. Okazuje się, że można to ustalić za pomocą wyrażenia regularnego o wielkości 27 bajtów, ale korzystanie z niego kosztuje kilka więcej, ale nadal jest krótsze niż podejście generatywne.
Oto alternatywne 48-bajtowe rozwiązanie:
I przy użyciu jednoargumentowego We / Wy możemy zrobić 42 bajty, ale staram się tego uniknąć, a druga odpowiedź Retina również używa dziesiętnych:
źródło
Rubinowy, 70 bajtów
Wyjaśnienie
źródło
*1
sztuczka jestJ, 31 bajtów
Używa indeksowania zerowego. Bardzo nieefektywna pamięć.
Wyjaśnienie
źródło
Oktawa, 68 bajtów
źródło
;end
Perl,
173132 bajtów +1 dla -n = 133Nie golfowany:
Prawdopodobnie poradziłbym sobie lepiej, gdybym się nad tym zastanowił, ale to właśnie wymyśliłem po kilku minutach. Mój pierwszy raz grałem w golfa, więc było całkiem fajnie!
Dzięki @Dada i @ TùxCräftîñg (i kilku drobnych optymalizacji bajtów) dla -40 bajtów
źródło
my
s,return
iprint
(Nie mogę przetestować, nie mam perla)return
.print
Można zastąpić przezsay
. Większośćmy
nie są potrzebne (trzeba tylko jeden przed$a
w funkcji myślę. Nie initialize nie deklarowała@b
. Prawdopodobnie można upuścić inicjalizacji$i
, jeśli nie$i++
na początku, gdy zamiast na końcu.pop
Jest krótszy niżshift
Pamiętaj, niż tam jest dużo więcej niż tylko perl golfa usuwając spacje i znaki nowej linii ....JavaScript (ES6), 58
Mniej golfa
Test
O czasie i pamięci: element 500000 w ~ 20 sekund i 300 MB używane przez mój FireFox 64-bitowy alfa
źródło