Inspirowany poprzednim pytaniem .
Samoopisująca się sekwencja g (n) Golomb jest sekwencją, w której dowolna liczba naturalna n
jest powtarzana w ciągu g (n) razy.
Pierwsze kilka liczb w sekwencji to:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
g(n) 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8
Widać, że g (4) = 3 i że „4” powtarza się 3 razy w sekwencji.
Biorąc pod uwagę wejście n
, wyjście g(n)
.
Ograniczenia: n <100000.
Najmniejszy kod wygrywa.
n
raczej niż2 - n % 1
. Czy masz powód, aby oczekiwać, że odpowiedzi będą się znacznie różnić?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Odpowiedzi:
GolfScript (31 znaków)
Próbny
źródło
Galaretka , niekonkurująca
10 bajtów Ta odpowiedź nie konkuruje, ponieważ wyzwanie poprzedza powstanie galaretki.
Wykorzystuje to wzór rekurencyjny a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) ze strony OEIS.
Wypróbuj online!
Jak to działa
źródło
PHP - 63 znaki
Szybko i krótko.Wydaje mi się, że miałem na myśli niewłaściwą sekwencję. Derp.
To jest PRAWIDŁOWE, szybkie i krótkie.
Dokładność może przekroczyć wymagany 100 000 znaków, ale w rzeczywistości osiągnąłem ten znak.
źródło
PHP
Ta wersja rekurencyjna jest krótsza (60), ale nieefektywna obliczeniowo:
Jest to znacznie szybsze, ale dłuższe (78):
Znacznie szybciej, ale przy 89 znakach byłoby:
Który jest O (n)
źródło
Haskell,
3027 znakówźródło
Oaza , 7 bajtów (niekonkurująca)
Kod:
Wypróbuj online!
Oasis to język zaprojektowany przez Adnana, który specjalizuje się w sekwencjach.
Obecnie ten język może wykonywać rekurencję i formę zamkniętą.
Na
T
końcu jest skrót10
, co oznacza, żea(0) = 0
ia(1) = 1
. Aby dodać więcej przypadków testowych, po prostu dodaj do listy na końcu.Teraz w zasadzie obliczyliśmy
a(n-a(a(n-1))+1
.źródło
Perl, 48 znaków
Wejście na standardowe wejście, wyjście na standardowe wyjście. Potrzebuje Perla 5.10+ i
-M5.010
aby włączyć tęsay
funkcję. Zajmuje około O ( n 2 ) czasu z powodu nieefektywnej manipulacji tablicą, ale wciąż jest wystarczająco szybki, aby łatwo obliczyć do 100 000. kadencji.źródło
Julia - 28
Przez rekurencyjnego sposób:
Wynik:
źródło
Python - 64 znaki
źródło
[i]*g[i-1]
by to zrobiło , więc pochyliłem się, żeby zrobić to w inny sposób; Pomyślałem, że z jakiegoś powodu będzie to bardziej przypominało pomnożenie macierzy przez skalar ...JavaScript, 93 znaki
źródło
J, 43 znaki
Definiuje funkcję za pomocą asymptotycznego wyrażenia podanego na stronie wikipedia.
Irytujące jest 9 znaków zaokrąglających do najbliższej liczby całkowitej.
źródło
Preludium ,
695554 bajtówJeśli używany jest standardowy zgodny interpreter, przyjmuje on dane wejściowe i wyjściowe jako wartości bajtów . Aby właściwie używać liczb dziesiętnych na STDIN / STDOUT, że trzeba interpreter Pythona z
NUMERIC_OUTPUT = True
oraz dodatkową opcjęNUMERIC_INPUT = True
.Wyjaśnienie
Szkielet programu to
Czytamy dane wejściowe
N
na pierwszym głosie i zmniejszamy je, aby uzyskaćN-1
. Inicjujemy również drugi głos na1
. Następnie zapętlamyN-1
jeden raz, z których każda iteracja otrzymuje następną wartość sekwencji na drugim stosie. Na koniec wypisujemyN
numer th.Ideą programu jest umieszczenie każdego elementu sekwencji w kolejce na trzecim głosie i zmniejszenie nagłówka tej kolejki w każdej iteracji. Kiedy głowa osiągnie
0
, zwiększamy wartość sekwencji i ją usuwamy0
.Problem polega na tym, że Prelude używa stosów, a nie kolejek. Musimy więc trochę przesunąć ten stos, aby użyć go jak kolejki.
Spowoduje to skopiowanie bieżącej wartości sekwencji do pierwszego głosu (jako kopia tymczasowa), wypycha a
0
na drugi głos (aby zaznaczyć koniec kolejki). Następnie wykonuje pętlę, aby przesunąć (a tym samym odwrócić) trzeci stos na drugi. Po pętli umieszczamy kopię bieżącej wartości sekwencji na drugim stosie (który jest ogonem naszej kolejki).To wygląda trochę brzydko, ale w zasadzie jest to pętla, która przesuwa stos z powrotem na trzeci głos. Ponieważ
)
jest w tej samej kolumnie, co instrukcje dotyczące przesunięcia, wcześniej0
wstawiony drugi głos również skończy na trzecim, więc musimy go usunąć innym#
. Następnie zmniejsz górną część trzeciego głosu, tj. Głowę kolejki.Teraz robi się to trochę denerwujące - chcemy uruchomić kod, gdy ta wartość jest
0
, ale jedyna struktura kontrolna Preludium (pętla) reaguje tylko na wartości niezerowe.Zauważ, że góra drugiego głosu jest prawdziwa (ponieważ sekwencja Golomb nie zawiera żadnych
0
s). Obciążenie idzie więc w ten głos (druga para nawiasów). Musimy tylko temu zapobiec , jeśli szef kolejki0
jeszcze nie jest . Najpierw mamy „pętlę” na trzecim głosie, która przesuwa a0
na drugi głos, jeśli głowa kolejki jest wciąż niezerowa. Dajemy także0
trzeci głos, aby natychmiast opuścić pętlę.#
Na trzecim głosem, który następnie albo usuwa0
lub usuwa głowę kolejce jeśli to już było zera. Teraz ta druga pętla jest wprowadzana tylko wtedy, gdy na początku kolejki było zero (i0
na drugi głos nigdy nie został popchnięty). W takim przypadku zwiększamy bieżącą wartość sekwencji i wciskamy a,0
aby wyjść z pętli. Na koniec zawsze będzie0
stos na szczycie stosu, który musimy odrzucić.Mówiłem, że logiczna negacja jest denerwująca w Preludium ...
źródło
Mathematica, 27 bajtów
Kolejne rozwiązanie rekurencyjne.
źródło
CJam, 14 bajtów
CJam jest znacznie młodszy od tego wyzwania, więc ta odpowiedź nie kwalifikuje się do zielonego znacznika wyboru. Jednak dość rzadko można
j
to dobrze wykorzystać , więc i tak chciałem to opublikować.Sprawdź to tutaj.
Wyjaśnienie
j
jest w zasadzie „zapamiętanym operatorem rekurencyjnym”. Wymaga liczby całkowitejN
, tablicy i blokuF
. Tablica służy do inicjalizacji zapamiętywania: element o indeksiei
zostanie zwróconyF(i)
.j
następnie obliczaF(N)
, sprawdzając go lub uruchamiając blok (zn
na stosie), jeśli wartość nie została jeszcze zapamiętana. Naprawdę sprytną cechą jest to, że w blokuj
przyjmuje tylko liczbę całkowitąi
i wywołujeF(i)
rekurencyjnie. Oto kod:źródło
J, 16 bajtów
To rozwiązanie jest w dużej mierze oparte na rozwiązaniu algorytmicznym podobnego problemu. Znajdziesz tam wyjaśnienie tej metody.
J, 33 bajty
W tym podejściu tworzę sekwencję
h(k)
z wartościami pierwszych indeksów, wi
którychg(i)=k
takh = 1 2 4 6 9 12 16...
. Możemy uzyskaćh(k)
dość prostoh(1..k-1)
z wyrażeniem, w({:+1+[:+/#<:])
którym znajduje się dane wejścioweh(1..k-1)
.Obliczenie wyniku z
h
jest proste.h ([:+/]>:[) input
źródło
Brachylog , 13 bajtów (niekonkurencyjny)
Wypróbuj online!
Wyjaśnienie
źródło
Python - 76 znaków
źródło
None
s. Wydaje się, że jest to „poprawna” ilośćNone
:)None
typ. Właśnie użyłem opisów zagnieżdżonej listy, aby uzyskać zagnieżdżoną pętlę. Jedynym celem przedstawionych tutaj list jest spowodowanie, aby kodJavaScript - 48 znaków
Tworzy 1-indeksową tablicę
g
zawierającą wartości sekwencji.Edycja - JavaScript - 46 znaków
Tworzy 1-indeksową tablicę
v
zawierającą wartości sekwencji.Edycja 2 - ECMAScript 6 - 27 znaków
Pierwsze dwa są dość szybkie - trzecie jest bardzo wolne
źródło
Haskell, 63 bajty
Jest to naiwne podejście, nie byłem świadomy bardzo krótkiego ponownego wystąpienia, kiedy to napisałem, ale pomyślałem, że mimo to opublikuję, nawet jeśli jest on dłuższy niż wszystkie inne implementacje Haskell, jak np.
Oblicz n-ty termin samoopisującej sekwencji Golomba
i
https://codegolf.stackexchange.com/a/23979/24877
źródło