OEIS ma odmianę (A111439) w sekwencji Golomb . Podobnie jak w sekwencji Golomb, A(n)
opisuje, jak często n
pojawia się w sekwencji. Ale dodatkowo żadne dwie kolejne liczby nie mogą być identyczne. Podczas budowania sekwencji A(n)
jest zawsze wybierana jako najmniejsza dodatnia liczba całkowita, która nie narusza tych dwóch właściwości. Z powodu niedozwolonych kolejnych identycznych liczb, seria kołysze się nieznacznie w górę i w dół, gdy rośnie. Oto pierwsze 100 warunków:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
Pełna lista pierwszych 10 000 numerów znajduje się w OEIS .
Wyzwanie polega na napisaniu A(n)
podanego programu lub funkcji n
. n
opiera się na 1
, aby upewnić się, że własność samoopisująca działa.
Zasady
Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .
Przypadki testowe
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
pojawia się po ostatnim wystąpieniu,N-1
które mierzy liczbę wahnięć doN
.)Odpowiedzi:
Haskell , 67 bajtów
Definiuje funkcję
f
. Wypróbuj online! Jest to bardzo wolnyf 15
czas obliczeń w TIO.Wyjaśnienie
Po prostu z definicją: na każdym etapie wybierz minimalną liczbę dodatnią,
n
która spełnia ograniczenia (nie jest równa poprzedniej pozycji i nie wystąpiłaf n
jeszcze razy).źródło
Mathematica,
6968 bajtówDzięki Martinowi Enderowi za znalezienie dla mnie dodatkowego 1 bajtu!
Nienazwana funkcja przyjmująca dodatnią liczbę całkowitą
n
jako dane wejściowe i zwracająca dodatnią liczbę całkowitą. Tworzymy całą listę pierwszychn
elementów tej sekwencji, a następnie pobieramyLast
element. Lista jest konstruowana, zaczynając od pustej listy{}
i operując na niej z funkcjąn
razy z rzędu (viaNest
).Chodzi o tę funkcję
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
, która pobiera częściową listę wartości sekwencji (zasadniczo##&@@#
) i dołącza do niej następną wartość. Następna wartość jest obliczana przez zaczynającx=1
, a następnie wielokrotnie zastępującx
przezx+1
tak długo jak warunekx==Last@#||#~Count~x==#[[x]]
jest spełniony, innymi słowy, czy teżx
jest element poprzedni, albox
jest już na liście prawidłowa ilość razy. Ta funkcja wyrzuca kilka błędów, ponieważ (na przykład) nie powinniśmy wywoływaćx
elementu th z początkowej listy{}
; jednak wszystkie wartości są prawidłowe.źródło
Python 2,
9986 bajtówDzięki @Dennis za kilka ulepszeń o łącznej wartości 13 bajtów!
Program działa dość naiwnie: śledzi listę ustalonych do tej pory wartości i szuka kolejnej wartości.
1
Jeśli to możliwe, próbuje dołączyć a na końcu listy; jeśli nie, to spróbuje2
i tak dalej, aż coś będzie dozwolone.Teraz możemy zacząć od wysiewu wyniki dla
1,2,3
być1,2,3
. Odbywa się to w celu uniknięcia problemów z zbyt krótką listą już obliczonych wartości: przypuszczam, że jeślin
przynajmniej jest,4
toa(n)
jest dokładnie mniejsze niżn
. (W tym programies[n]
jest równya(n)
. Nasza lista jest faktycznie inicjowana,[0,1,2,3]
ponieważ listy są0
w Pythonie indeksowane. Więc na przykłada(1)=s[1]=1
ia(2)=s[2]=2
.)Powiedzmy, że próbujemy ustalić
s[m]
, co oznacza, że nasza lista już zawieras[0], s[1], ..., s[m-1]
. Zaczniemy odt=1
i spróbujemy ustawićs[m]=1
. Kiedy to nie działa, idziemy dot=2
i próbujemy ustawićs[m]=2
. Za każdym razem zwiększamyt
, sprawdzamy, czys.count(t)==s[t]
... ale prawa strona nie spowoduje błędu, o ile nigdy nie będziemy musieli sięgać tak wysokot=m
. Przypuszczenie mówi, że nigdy nie musimy, ponieważ pierwsza wartość, którą obliczamy, jest w rzeczywistościs[4]
.Ta implementacja oblicza 3 kolejne wartości sekwencji, niż jest to konieczne. Na przykład, jeśli
n
tak8
, oblicza,s[11]
zanim zwróci wartośćs[8]
.Byłbym szczęśliwy widząc dowód przypuszczenia. Wierzę, że można to udowodnić za pomocą (silnej?) Indukcji.
Edycja: Oto dowód przypuszczenia . W rzeczywistości okazujemy się nieco mocniejszą formą oświadczenia, ponieważ nie wymaga dodatkowej pracy.
Twierdzenie: dla wszystkich
n
większych lub równych4
termina(n)
jest mniejszy lub równy(n-2)
.Dowód (według silnej indukcji): (Podstawa
n=4
): Od tegon=4
momentu stwierdzenie jest prawdziwea(4) = 2 = 4-2
.Załóżmy teraz,
a(k)
jest mniejszy niż lub równyk-2
dla wszystkichk
od4
poprzezn
włącznie (a zakładamy,n
jest co najmniej4
). W szczególności oznacza to, że wszystkie poprzednie warunki sekwencji były co najwyżej(n-2)
. Musimy pokazać, żea(n+1)
będzie co najwyżej(n-1)
. Teraz, z definicji,a(n)
jest najmniejszą dodatnią liczbą całkowitą, która nie narusza żadnego z warunków, więc musimy tylko pokazać, że wartość(n-1)
nie naruszy żadnego z warunków.Wartość
(n-1)
nie narusza warunku „brak kolejnych powtórzeń”, ponieważ według hipotezy indukcyjnej poprzedni wpis był co najwyżej(n-2)
. I nie narusza warunku „ilea(m)
razy sięm
pojawia”, chyba(n-1)
że zostały już osiągniętea(n-1)
czasy. Ale przy silnym założeniu indukcyjnym,(n-1)
osiągnięto już0
czasy ia(n-1)
nie jest równy,0
ponieważa(m)
jest pozytywny dla wszystkichm
.Dlatego
a(n+1)
jest mniejszy lub równyn-1 = (n+1)-2
, jak pożądane. CO BYŁO DO OKAZANIA.źródło
Galaretka , 17 bajtów
Ostatnie trzy przypadki testowe to za dużo dla TIO. Lokalnie zweryfikowałem 1000 i 1257 .
Wypróbuj online! lub sprawdź pierwsze 100 warunków .
Jak to działa
źródło
Python 2 ,
7774 bajtówTo jest rekurencyjna implementacja algorytmu @ mathmandan .
Implementacja jest O (szalona) : wejście 9 zajmuje lokalnie 2 sekundy, wejście 10 52 sekund i wejście 11 17 minut i 28 sekund. Jeśli jednak zadeklarowano go jako funkcję zwykłą, a nie lambda, do weryfikacji przypadków testowych można użyć memoizacji.
Wypróbuj online!
Należy pamiętać, że nawet w przypadku zapamiętywania TIO nie może obliczyć f (1257) lub f (10000) (oba zweryfikowane lokalnie).
źródło
05AB1E ,
3231 bajtówWypróbuj online!
Wyjaśnienie
Jesteśmy technicznie w pętli
G
, gdy dodamy N do globalnej listy, ale wszystkie pętle 05AB1E używać tej samej zmiennej N jako wskaźnika, więc wewnętrzna pętla[...]
ma nadpisane na N oG
sens możemy dodać ją na zewnątrz pętli.Problemy z zagnieżdżonymi pętlami i warunkami warunkowymi uniemożliwiają nam wykonanie tego w pętli.
źródło
Befunge,
141136 bajtówWypróbuj online!
Ze względu na ograniczenia pamięci Befunge, śledzenie wszystkich poprzednich wpisów w sekwencji nie jest zbyt praktyczne, dlatego w tym rozwiązaniu zastosowano algorytm o mniejszej powierzchni pamięci, który oblicza wartości bardziej bezpośrednio.
To powiedziawszy, wciąż jesteśmy ograniczeni wielkością komórki, która w interpretera referencyjnym Befunge-93 jest 8-bitową wartością ze znakiem, więc najwyższą obsługiwaną liczbą parzystą w sekwencji jest
A(1876) = 126
, a najwyższą obsługiwaną liczbą nieparzystą jestA(1915) = 127
.Jeśli chcesz przetestować większe wartości, musisz użyć interpretera o większym rozmiarze komórki. Powinno to obejmować większość implementacji Befunge-98 ( wypróbuj online! ).
źródło
Python 2, 117 bajtów
Meh Nie tak krótko. Proste iteracyjne rozwiązanie.
Wypróbuj online
Oto naprawdę zła próba rozwiązania rekurencyjnego (129 bajtów):
źródło
-1
zamiastn-1
oszczędzić bajt, chyba nie.