(Wyzwanie wzięte z gry wieloosobowej (zderzenie kodu) na codingame.com )
Wyzwanie
Znajdź n- ty termin z następującej sekwencji: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4...
lub, aby było to bardziej oczywiste,{1}, {1,2}, {1,2,3}, {1,2,3,4}...
Sekwencja składa się z połączonych zakresów od 1 do x , zaczynając od 1, aż do nieskończoności.
Zasady / IO
Dane wejściowe i wyjściowe mogą być w dowolnym formacie, o ile jest to możliwe do odróżnienia. Dane wejściowe można pobrać z dowolnego odpowiedniego źródła: STDIN, plik itp.
Dane wejściowe mogą być indeksowane 0 lub 1, a wybrane indeksowanie musi być wymienione w poście.
Będziesz musiał obsłużyć co najmniej do wyniku 255 włącznie (co oznacza, że maksymalne wejście indeksowane 0 to 32640). Wszystko, co musi zostać rozwiązane, jeśli Twój język to obsługuje.
To jest code-golf
tak, że wygrywa najkrótsza liczba bajtów!
Przypadki testowe (indeksowanie 0)
0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12
59
,100
itp)Odpowiedzi:
05AB1E , 5 bajtów
Program jest indeksowany 0, kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
GNG¹¾¼QiN
to podejście iteracyjne, ale było mądrzejsze.Haskell ,
2726 bajtówWypróbuj online!
Dzięki @DanD. dla -1 bajtów!
Jest to anonimowa funkcja, tworząc nieskończoną sekwencję tylko zwrócenie
n
ich -tego elementu:[[1..k]| k<-[1..]]
produkuje nieskończoną listę listy:[[1],[1,2],[1,2,3],[1,2,3,4],...]
. Aby je połączyć, możemy napisać,[z|k<-[1..],z<-[1..k]]
które wynikają[1,1,2,1,2,3,1,2,3,4,...]
i ostatecznie(...!!)
akceptują dane wejściowen
(notacja bezcelowa) i zwracająn
-ty termin (na podstawie 0).źródło
concat
z większym zrozumieniem zapisuje tylko 1 bajt:([z|k<-[1..],z<-[1..k]]!!)
.JavaScript,
2928 bajtów-1 bajt dzięki Arnauld!
Wykorzystuje rekurencyjną formułę 0 indeksowaną znalezioną w OEIS.
Gdy zostanie wywołany z 1 argumentem zgodnie z oczekiwaniami, domyślną wartością drugiego
m
, będzieundefined
. Jednakże-~undefined
, zwraca 1, co pozwala nam uzyskać rekursji toczenia bez wyraźnegom = 1
w liście argumentów (dzięki @Arnauld!)Fragment testowy:
Alternatywnie, dla tej samej liczby bajtów, możemy mieć funkcję curry taką jak:
Możesz to wywołać za pomocą
f(5)()
- zwraca funkcję, która po wywołaniu zwraca wynik, jak opisano w tym meta-postie .źródło
Galaretka , 5 bajtów, indeksowana 1
Wypróbuj online!
Wyjaśnienie:
źródło
Oktawa, 39 bajtów
Indeks 1-
Wyjaśnienie:
Rozważ tę sekwencję:
jeśli policzymy liczbę elementów podsekwencji mamy
więc za pomocą wzoru Gaussa na liczbę trójkątną możemy utworzyć wzór na z:
jest to równanie kwadratowe, jeśli rozwiążemy je dla n mamy
Wypróbuj online!
źródło
Haskell,
2524 bajtówPrzykład użycia:
((!!)$[1..]>>= \x->[1..x]) 10
->1
. Wypróbuj online! .Mapuje anonimową funkcję make-a-list-from-1-to-x
\x->[1..x]
(wbudowanyenumFromTo 1
jest o jeden bajt dłużej) na nieskończoną listę[1..]
i łączy wynikowe listy w jedną listę.!!
wybiera n-ty element.Dzięki @flawr za jeden bajt.
źródło
(!!)$[1..]>>= \x->[1..x]
. Czasami naprawdę żałuję, że nie było krótszego bezsensownego sposobu pisania\x->[1..x]
:)<$>
co nie jest objęte zakresem. Czy znasz jakiś internetowy kompilator / tłumacz Haskell, który korzysta z najnowszej wersji? haskell.org dopuszcza tylko wyrażenia i nie możesz tworzyć linków do wprowadzonego kodu.Oktawa , 39 bajtów
Wypróbuj online!
To wykorzystuje alternatywne podejście.
Na przykład
n=1
taA=triu(v'+0*v)
tworzy macierzPo usunięciu wszystkich elementów zerowych i dołączeniu kolumn
A(A>0)
otrzymujemy sekwencję:Zatem jest to tylko kwestia odciągnięcia
n
-tego terminu tej sekwencji.źródło
Python ,
3936 bajtów-3 bajty dzięki Dennisowi!
Rekurencyjna lambda, która wykorzystuje indeksowanie 1.
Wypróbuj online!
Śledzimy aktualny rozmiar „wzrostu” za pomocą
m
. Jeślin
jest mniejszy lub równym
, mieści się w bieżącym „wzroście”, więc zwracamy go. Jeśli jednak jest większy niżm
,m
odejmujemy go, niż dodajemy 1 dom
i wywołujemy funkcję rekurencyjnie (przechodząc do następnego wzrostu).źródło
R, 25 bajtów
Indeks jest oparty na 1.
źródło
sequence
odpowiedź i cieszę się, że to widzę.Pyth ,
65 bajtów1 bajt zapisany dzięki @TheBikingviking!
Korzysta z indeksowania opartego na 0.
Wypróbuj online!
Wyjaśnienie
źródło
.n
zs
.Mathematica,
2724 bajtówDzięki @MartinEnder za 3 bajty!
1-indeksowany. To powoduje błędy, które można bezpiecznie zignorować.
Wyjaśnienie
źródło
Join@@
jest zdecydowanie za droga;)((r=Range)@r@#<>1)[[#]]&
StringJoin
nie jest to oceniane ... Podoba mi siębrainf * ck, 78 bajtów
Pobiera dane wejściowe (oparte na 0) i dane wyjściowe jako wartości bajtów.
Możesz to przetestować tutaj.
Wprowadzanie wymaga
\
liczb przed dziesiętnych (np.\10
Dla 10). Jeśli wynik jest drukowalnym znakiem ASCII, powinieneś go zobaczyć. W przeciwnym razie wciśnij pamięć widoku -> ostatni zrzut. Wydrukowana wartość znajduje się w trzeciej komórce (komórka nr 2).Wyjaśnienie:
Komórka 0 (WEJŚCIE): jest wejściem i jest zmniejszana za każdym razem przez moją pętlę.
Komórka 1 (RESET): zwiększa się o 1 za każdym razem, gdy jest równa TERM. Aby to zrobić, za każdym razem przez pętlę dodajemy 1, a jeśli nie są równe, odejmujemy 1.
Komórka 2 (TERM): zwiększa się o 1 w każdej pętli i jest ustawiona na 0, jeśli pasuje do RESET. Aby to zrobić, kopiuję wartość z HOLD tylko wtedy, gdy komórka nie jest równa RESET.
Komórka 3 (RÓWNA): służy do sprawdzenia, czy RESET i TERM są równe.
Komórka 4 (HOLD): służy do kopiowania wartości RESET i TERM z powrotem po sprawdzeniu równości.
źródło
Pyke, 6 bajtów
Wypróbuj tutaj!
0-indeksowane.
źródło
R,
4341 bajtówEdycja: Znaleziono krótsze podejście rekurencyjne za pomocą A002262 + 1 (zindeksowane 0):
Stara wersja:
1-indeksowana formuła OEIS.
źródło
Perl 6 , 21 bajtów
0-indeksowane. Wypróbuj online!
Jak to działa:
Perl 6 , 21 bajtów
0-indeksowane. Wypróbuj online!
Jak to działa:
źródło
Żadne z tych rozwiązań nie jest tak krótkie jak JungHawn Min , ale są to alternatywne podejścia, co wydaje mi się. Obie są nienazwanymi funkcjami przyjmującymi dodatnią liczbę całkowitą (indeksowaną 1) i zwracającą liczbę całkowitą dodatnią.
Mathematica, 30 bajtów
Rzeczywisty wzór matematyczny dla tej funkcji! Bardziej czytelne (częściowo tłumacząc znaki 3-bajtowych
⌈
,√
i⌉
):Ceiling[Sqrt[2 * #] - 1/2]
mówi nam, do której podlisty odnosi się dane wejściowe, od której odejmujemy jedną, aby powiedzieć nam, która podlista kończy się, zanim dojdziemy do danych wejściowych; następnie((#^2 + #) / 2 &)
oblicza, ile elementów występuje na wszystkich podlistach przed tym, na którym nam zależy, które odejmujemy od danych wejściowych,#
aby uzyskać odpowiedź. (Niektórzy zauważą znaną formułę(#^2 + #) / 2
dla#
trzeciej liczby trójkątnej;Ceiling[Sqrt[2 * #] - 1/2]
jest to w zasadzie funkcja odwrotna).Mathematica, 32 bajty
Rozwiązanie rekurencyjne, w zasadzie takie samo jak w odpowiedzi Billywoba i innych.
źródło
Brain-Flak , 46 bajtów
Zero indeksowane
Wypróbuj online!
Stack Clean, 48 bajtów
Wypróbuj online!
Wyjaśnienie
To jest zmodyfikowana wersja funkcji modulo . Zamiast używać stałej liczby jako dzielnika, zwiększa on dzielnik za każdym razem, gdy dzielnik jest odejmowany (raz na iterację w pętli zewnętrznej).
Kod z adnotacjami
źródło
Java 8,
857355 bajtówPodejście rekurencyjne z indeksowaniem 0 i wzorem podanym w OEIS :
Wypróbuj tutaj.
Stara odpowiedź (
8556 bajtów):Zastosowano inną formułę 0 indeksowaną podaną w OEIS :
Wypróbuj tutaj.
źródło
Perl , 30 bajtów
29 bajtów kodu +
-p
flaga.Wypróbuj online!
źródło
MATL, 8 bajtów
To rozwiązanie wykorzystuje indeksowanie 1
Wypróbuj w MATL Online
Wyjaśnienie
źródło
v
po nim]
QBIC , 21 bajtów, 1-indeksowany
Wyjaśnienie:
Nieco bardziej interesujące podejście, ale o 10 bajtów dłuższe:
Ten program stale oblicza całkowitą liczbę liczb w tym przedziale i we wszystkich poprzednich (
1 at loop 1, 3 at loop 2, 6 at loop 3 ...
). Gdy licznik przekroczy poszukiwany indeks N, zwróć X z bieżącego przedziału, gdzie X to N minus poprzednia wartość licznika.źródło
Rubinowy, 30 bajtów
Indeksowanie 1
źródło
R, 37 bajtów
Pobiera dane wejściowe z
n
i tworzy sekwencję dla pierwszychn
sekwencji. To sprawia, że jest nieco nieefektywne przy wyższych wejściach, ale powinno być w porządku. Następnie zwracan
-ty wpis, 1-indeksowany.Używa małej sztuczki, rozpoczynając sekwencję od
T
, która jestTRUE
lub1
domyślnie.źródło
C11, 48 bajtów
Wypróbuj online!
Działa również w C ++ i Javie.
Alternatywa dla tej samej liczby bajtów:
źródło
pieprzenie mózgu, 141 bajtów
Wiem, że spóźniłem się na nagrodę, ale chciałem tylko zobaczyć, ile bajtów algorytm, o którym myślałem, ostatecznie się skończy.
Ten program jest indeksowany na zero.
Wypróbuj online
255
, zmień Rozmiar komórki (Bity) na 16 lub 32 .\5
na wejściu5
.\999
Wyjaśnienie:
To pokazuje program podzielony na etapy, pokazujący, co dzieje się na wejściu
5
.#
są umieszczane w idealnych lokalizacjach zrzutu pamięci dla tłumacza.Prawdopodobnie będziesz chciał użyć pola wyboru Dump Memory at char:
#
jeśli uruchamiasz tę wersję. Spowoduje to zrzucenie pamięci po uderzeniu#
, co pozwoli zobaczyć wartość na taśmie w przypadku, gdy jest to znak, którego nie można wydrukować, lub zobaczyć, co stanie się na dowolnym etapie. Komórka, na której znajduje się wskaźnik, będzie pogrubiona.Wypróbuj online
#
Uwagi:
>
na początku. Wymagana liczba może się różnić w zależności od wartości wejściowej, ale wynosi O (1).źródło
tinylisp (repl), 90 bajtów (indeksowane 0)
Lub niekonkurencyjny (przy użyciu funkcji, która została zatwierdzona po opublikowaniu tego wyzwania), 80 bajtów :
Pierwsza linia definiuje funkcję pomocniczą
r
, a druga linia jest nienazwaną funkcją, która przyjmujen
i zwraca n-ty termin sekwencji. Podałem to jako przesłanie repliki, ponieważ repl automatycznie uzupełnia nawiasy na końcu każdego wiersza, a nie tylko na końcu programu. Z tymi zastrzeżeniami, oto wersja zmodyfikowana do pracy w Try it online , a tutaj wersja bez golfa działa na wejściach od 0 do 54.Wyjaśnienie
Użyję tutaj niekonkurencyjnej wersji. Jedyną różnicą jest to, że oficjalna wersja musi implementować dodawanie jako dwa odejmowania.
źródło
C, 54 bajty
Nie jest to najkrótsze rozwiązanie C, ale ma tę zaletę, że działa w stałym czasie (bez pętli, tylko matematyka). Używa indeksowania zerowego:
Nie golfowany:
Testuj z:
źródło
C, 103 bajty
Myślę, że dla początkującego jest w porządku :).
lub sformatowany sposób
źródło
n,c,i,j
jako globals, to jest gwarantowane, że są one inicjowane na 0, co nie jest prawdą w przypadku miejscowych.n
jest wejściem lub n-tą liczbą w sekwencji,c
jest licznikiemi
ij
jest elementami pętli;j
będzie wynosić 1, następnie 2, a następnie 3, podczas gdyi
będzie wynosić 1, a następnie 1,2, a następnie 1,2,3 itd. @ Qwerp-Derpdc , 21 bajtów, indeksowanie 0
Wypróbuj program DC online!
Wyjaśnienie:
Na górze stosu znajduje się teraz indeks k największej liczby trójkątnej, która wynosi <= n.
Ten program DC można przekonwertować na konkurencyjny skrypt bash:
Narzędzia Bash + Unix, 28 bajtów, indeksowanie 0
Wypróbuj program bash online!
źródło
C,
8144 bajtówprosta metoda iteracyjna, zindeksowana 0 i z delikatnym masowaniem;
Wypróbuj online!
źródło