Dzisiaj przyjrzymy się sekwencji a związanej z funkcją Collatz f :
Nazywamy sekwencję formie oo, F (z), F (F (z)) ... w sekwencji Collatz .
Pierwsza liczba w naszej sekwencji, a (1) , to 0 . Przy wielokrotnym stosowaniu f wpada w cykl 0 → 0 →…
Najmniejsza liczba, której jeszcze nie widzieliśmy, to 1, co daje (2) = 1 . Przy wielokrotnym stosowaniu f , przechodzi on w cykl 1 → 4 → 2 → 1 →…
Teraz widzieliśmy liczbę 2 w powyższym cyklu, więc następną najmniejszą liczbą jest a (3) = 3 , mieszcząca się w cyklu 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…
We wszystkich powyższych cyklach widzieliśmy już 4 i 5 , więc następna liczba to (4) = 6 .
Do tej pory powinieneś mieć pomysł. a (n) jest najmniejszą liczbą, która nie była częścią żadnej sekwencji Collatz dla wszystkich a (1),…, a (n - 1) .
Napisz program lub funkcję, która przy dodatniej liczbie całkowitej n zwraca a (n) . Najkrótszy kod w bajtach wygrywa.
Przypadki testowe:
1 -> 0
2 -> 1
3 -> 3
4 -> 6
5 -> 7
6 -> 9
7 -> 12
8 -> 15
9 -> 18
10 -> 19
50 -> 114
(Jest to sekwencja OEIS A061641 .)
źródło
n
być oparte na 0?a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
a
nie jest oparty na 0, nie rozumiem, dlaczego wydaje się, że „rozmawiasz na podstawie 0” tutaj:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
Odpowiedzi:
Galaretka ,
2019 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
Po n iteracjach wartość a (n + 1) będzie na początku tablicy. Ponieważ łączymy nową tablicę z odwróconą kopią starej, oznacza to, że na końcu znajdzie się (n) .
źródło
Haskell,
9392 bajtyPrzykład użycia:
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10
->19
.c x
to cykl Collatzx
z odrobiną oszukiwaniax == 1
. Główne funkcje pętli przez wszystkie liczby całkowite i utrzymuje te, które nie sąc x
dlax
w[0..y-1]
. Niemal bezpośrednie wdrożenie definicji. Ponieważ operator indeksu Haskell!!
jest oparty na 0, zaczynam-1
od dodania (w przeciwnym razie bezużytecznego) numeru, aby naprawić indeks.źródło
MATL ,
4640 bajtówWypróbuj online!
Wyjaśnienie
Kod ma zewnętrzną
for
pętlę, która generujen
sekwencje Collatz, po jednej w każdej iteracji. Każda sekwencja jest generowana przez wewnętrznądo...while
pętlę, która oblicza nowe wartości i przechowuje je w wektorze sekwencji, aż do uzyskania a1
lub0
. Po zakończeniu sekwencji wektor jest odwracany i łączony z wektorem globalnym, który zawiera wartości ze wszystkich poprzednich sekwencji. Ten wektor może zawierać powtarzające się wartości. Odwrócenie wektora sekwencji zapewnia, że na końcu zewnętrznej pętli pożądany wynik (wartość początkowa ostatniej sekwencji) będzie na końcu wektora globalnego.Pseudokod :
Skomentowany kod :
źródło
Brachylog ,
7067656362 bajtówWypróbuj online!
źródło
Python 2,
9796 bajtówWykorzystuje fakt, że wszystkie wielokrotności 3 są czyste. Przetestuj na Ideone .
Jak to działa
W pierwszym wierszu
r,=s={-1}
ustawia s = {-1} (zestaw) i r = -1 .Następnie odczytujemy liczbę całkowitą ze STDIN, powtarzamy pewien ciąg znaków wiele razy, a następnie go wykonujemy. Jest to równoważne z następującym kodem Python.
W każdej iteracji zaczynamy od znalezienia najmniejszego elementu {r + 1, r + 2, r + 3} , który nie należy do s . W pierwszej iteracji inicjuje r jako 0 .
We wszystkich kolejnych seriach s może (i będzie) zawierać niektóre z r + 1 , r + 2 i r + 3 , ale nigdy nie wszystkie, ponieważ wszystkie wielokrotności 3 są czyste. Aby zweryfikować to stwierdzenie, że nie obserwujemy wielokrotność m od 3 jest postaci 3k + 1 . To pozostawia 2m jako jedyny możliwy obraz wstępny, który jest również wielokrotnością 3 . Zatem m nie może pojawić się w sekwencji Collatz dowolnej liczby, która jest mniejsza niż m , a zatem jest czysta.
Po zidentyfikowaniu ri zainicjowaniu n , stosujemy funkcję Collatz za pomocą
n=(n/2,3*n+1)[n%2]
, dodając każdą wartość pośrednią n do zbioru s za pomocąs|={n}
. Gdy napotkamy liczbę n, która jest już w s ,{n}-s
da pusty zestaw, a iteracja się zatrzyma.Ostatnia wartość r jest pożądanym elementem sekwencji.
źródło
Pyth , 32 bajty
Zestaw testowy.
źródło
Java, 148 bajtów
Ideone to! (Ostrzeżenie: złożoność wykładnicza z powodu optymalizacji zerowej).
Przekształcenie go z
do...while
pętli wfor
pętlę byłoby bardziej golfowe, ale mam z tym problem.Porady w golfa są jak zwykle mile widziane.
źródło
for(b=1,i=1;i<n;i++)
nafor(b=1,i=0;++i<n;)
. Przy okazji, rozumiem, dlaczego twój ideone nie ma przypadku testowego dla 50, ale dlaczego brakuje również 10? Poradzi sobie bez problemu.int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
Perl6, 96
Na podstawie odpowiedzi Perla 5 . Trochę dłużej, ponieważ składnia Perl6 jest mniej wybaczająca niż składnia Perl5, ale na razie się z tym pogodzę.
źródło
PHP,
233124 bajty+4 dla funkcji:
źródło
Perl 5-74 bajtów
To dość proste rozwiązanie. Wielokrotnie stosuje funkcję Collatz do zmiennej
$a
i zapisuje w tablicy,@c
że wartość została zauważona, a następnie po osiągnięciu 0 lub 1 zwiększa się,$a
aż będzie liczbą, która nie została jeszcze zauważona. Jest to powtarzane kilka razy równe wartości wejściowej minus 2, a na koniec wartość$a
jest wyprowadzana.źródło
Mathematica, 134 bajty
Łatwiejszy do odczytania format:
źródło