Sekwencja SUDSI ( su m, d ifference, s wap, i ncrement) to ciekawa sekwencja liczb całkowitych, która wydaje się wykazywać raczej chaotyczne zachowanie. Można go wygenerować w następujący sposób:
Niech S będzie nieskończona lista liczb naturalnych: 1 2 3 4 5 6 ...
. Niech S i oznaczają jeden indeksowane i ty element S . Tak więc początkowo S 1 to 1, S 2 to 2 itd. (Nie ma S 0 ).
Począwszy od S 1 i S 2 ...
- Oblicz ich sumę:
sum = S1 + S2
- Oblicz ich różnicę bezwzględną (większy minus minus mniejszy):
diff = |S1 - S2|
Zamień dwie wartości w S na wskaźniki sumy i różnicy:
swap(Ssum, Sdiff)
Zwiększ wskaźniki S, z którym pracujesz. Więc następnym razem obliczysz sumę i różnicę S 2 i S 3 , a następnym razem będzie S 3 i S 4 itd.
- Powtórz ten proces w nieskończoność.
Oto kilka pierwszych etapów S po zastosowaniu tego procesu. Nawiasy kwadratowe []
otaczają dwie wartości, które mają zostać zsumowane i zróżnicowane.
Oryginalny S :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
Po zamianie S 3 ( 3 = 1 + 2
) i S 1 ( 1 = |1 - 2|
):
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
Po zamianie S 3 i S 1 :
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
Po zamianie S 7 i S 1 :
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
Po zamianie S 9 i S 1 :
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
Po zamianie S 11 i S 1 :
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
Po zamianie S 7 i S 5 :
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
itp.
Sekwencja SUDSI jest zdefiniowana jako sekwencja pierwszych elementów na każdej z tych list. Tak więc kilka pierwszych warunków sekwencji SUDSI to 1 3 1 7 9 11 11
.
Oto pierwsze 200 terminów sekwencji SUDSI (20 na linię):
1 3 1 7 9 11 11 11 15 15 19 19 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 19 57 59 59 59 59 59 59 59 59 59 77 79
81 83 85 87 89 91 91 91 91 91 91 91 91 91 91 91 91 91 115 115
121 123 125 127 127 127 127 127 137 139 141 143 145 147 147 147 147 147 147 147
147 147 147 147 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167
167 167 167 167 209 211 211 211 211 211 221 223 223 223 223 223 223 223 223 223
223 223 243 243 243 243 243 243 257 259 261 263 263 263 263 263 263 263 263 263
263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263
263 263 325 327 329 331 331 331 331 331 331 331 331 331 349 351 351 351 351 351
361 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363
Nie jest (przynajmniej dla mnie) niejasne, jak można przewidzieć przyszłe warunki. Można jedynie bezpiecznie powiedzieć, że warunki są zawsze nieparzyste, nie maleją (po drugim semestrze) i że niektóre liczby są powtarzane wiele razy.
Wyzwanie
Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą n i wypisuje lub zwraca n- ty ciąg sekwencji SUDSI. Na przykład, jeśli n wynosi 1, wynikiem jest 1
, jeśli n wynosi 2, wynikiem jest3
, jeśli n wynosi 200, wynikiem jest 363
.
Weź dane w jakikolwiek zwykły sposób (stdin / linia poleceń / funkcja arg).
Najkrótsza odpowiedź w bajtach wygrywa.
(Ta strona koduje rzeczy w UTF-8, ale możesz użyć dowolnego istniejącego kodowania).
Premia matematyczna: (potencjalnie kwalifikująca się do nagrody)
- Opowiedz mi więcej o sekwencji SUDSI. Jaki jest podstawowy wzór tego, jakie są jego liczby i ile ich jest (i tym podobne)? (Nawiasem mówiąc, nie mogłem znaleźć SUDSI na OEIS .)
źródło
Odpowiedzi:
Pyth,
45414038 bajtówZauważyłem (podobnie jak Martin Büttner), że maksymalna zmieniona liczba kroków permutacji
k
wynosi2k + 1
. Ale ponieważ mamy tylkon - 1
kroki, potrzebujemy tylko listy liczb do2n - 1
.Wypróbuj online: demonstracja
źródło
Mathematica, 88 bajtów
Jest to pełny program, który odczytuje dane wejściowe z monitu. Jest to bardzo bezpośrednia implementacja definicji, w której śledzę bieżącą sekwencję
f
(której wartościf[n]
domyślnie ton
).Oto nieco bardziej czytelna wersja:
Trochę analizy
Nakreśliłem pierwsze 2000 elementów sekwencji (potem tak naprawdę nie robi się to bardziej interesujące):
Zatem sekwencja jest zasadniczo liniowa ze spadkiem 2 i zawsze ma kilka z tych kroków. Wygląda na to, że kroki rosną subliniowo (jeśli nawet nie są ograniczone), ponieważ stają się ledwo zauważalne w miarę zwiększania liczby rysowanych punktów.
Możemy dość łatwo uzasadnić wzrost liniowy (jest to trochę skomplikowane, ale myślę, że wytrzymałoby rygorystyczny dowód przez indukcję): początkowo maksymalna wpływana liczba kroków permutacji
n
wynosin + (n+1) = 2n + 1
. Pamiętaj też, że liczby te będą zawsze przenoszone do1
, ponieważ|n - (n+1)| = 1
. Nic więc dziwnego, że otrzymujemy liczby, które są w przybliżeniu2n
w sekwencji. Możemy jednak również zauważyć, że dla kroków do n , S n + 1 jest zawsze ograniczone przez n + 1 , co oznacza, że żaden krok zamiany nie może zamienić dwóch liczb, które są większe niż jest to również związane z samą sekwencją. n . Dlatego liczby, które nadal wymagają przetworzenia, będą mniejsze lub równe ich wartości początkowej. W związku z tym,2n + 1
Myślę, że znalezienie argumentu za długością kroków będzie trudniejsze.
źródło
CJam,
45 4039 bajtówPo prostu naiwne podejście.
Można dalej grać w golfa.Za bardzo brakuje funkcji zamiany tablic.Jak to działa:
Wypróbuj online tutaj
źródło
Haskell, 95 bajtów
Przykład użycia:
p 70
->139
Nie przechowuję sekwencji na liście ani w tablicy. Wielokrotnie aktualizuję funkcję tożsamości do funkcji z zamienionymi dwoma elementami bieżącego kroku. Po
n
krokach wywołuję wynikową funkcję z parametrem1
.źródło
J, 63 bajty
Zastosowanie i testy:
Wypróbuj online tutaj.
źródło
Pyth
555351Prawdopodobnie może być dalej golfa.
Może być bardzo powolny dla dużych,n
ponieważ byłem leniwy, aby dowiedzieć się, ile długości tablicy potrzebuję i po prostu użyłemn^n
jednego.Dzięki Volatility i Martinowi Büttnerowi za wskazanie, że mogę użyć maksymalnie
3n
.Wyjaśnienie
źródło
2*n
dla dużychn
, a maksymalna3*n
dlan=1
.2n+1
, co, jak mówisz, ma maksimum3
dlan=1
i (w pewnym sensie) zbiega się z2n
. Nie jest to zbyt zaskakujące, ponieważ jest to maksimum dla nieokreślonej sekwencji, a żaden krok w procesie nie może zwiększyć liczby, która wciąż jest przed nami. Mogę dodać to do mojej odpowiedzi..a
rozszerzenie do dobrej pracy! Po drodze jest o wiele więcej gadżetów, ale isaac teraz śpi: github.com/isaacg1/pyth/pull/32doc.txt
GitHub do instrukcji) i zobaczyłem aktualizację. Na szczęście, jak mogłem to pominąć i napisać niestandardową implementację ...Python 2,
117106101Używadict
(mapy) do zapisywania wartości w celu użycia dowolnych indeksów.g(n)
jest funkcją zwracającąn
th pozycję. Następnie tylko iterujeinput-1
czasy i wyświetla pierwszy element.Okazuje się, że jest krótszy przy użyciu metod z mojej odpowiedzi w Pythonie.
Dzięki xnor za oszczędność 5 bajtów.
źródło
b,c=a[i:i+2]
. Jest także nab+c
tyle krótki, że zapisanie go do zmiennejs
traci znaki tylko po dwukrotnym zapisaniu.Idź 150
Bez golfa, nic trudnego, głównie skradziony z @ Pietu1998
http://play.golang.org/p/IWkT0c4Ev5
źródło
Java, 162
Wyjaśnienie
źródło
dc
134132131 bajtówUżyj
echo $n $code | dc
, gdzie$n
jest n i$code
jest ... kodem ( westchnienie ). Cytat do smaku.Edycja: Dopóki nie przeprosisz mnie za wyjaśnienie, nigdy się do tego nie przejdę.
źródło
Perl 5, 131
Naiwne rozwiązanie (tj. Bezpośrednie wdrożenie definicji). Podprogram, przyjmuje dane wejściowe jako listę
1
s żądanej długości.Wizualizuj jego wynik, np
print sub...->(1,1,1,1,1)
.Wyjaśnienie:
map$a[$_]=$_,1..3*@_
buduje tablicę@a
, indeksując każdą liczbę całkowitą od 1 do 3 razy większą niż@_
(wejściowa).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
powtarza wielokrotnie switcheroo (jeden raz mniej niż rozmiar@_
), przełączając za$a[$a[$_-1]+$a[$_]]
pomocą$a[abs($a[$_-1]-$a[$_])]
as$_
wynosi od 2 do rozmiaru@_
.A potem podprogram wraca
$a[1]
.źródło
Perl 5 , 90 + 1 (-p) = 91 bajtów
Wypróbuj online!
źródło