Collatz Sequence (zwany również problem 3x + 1) jest tam, gdzie zaczynają się każdej liczby całkowitej dodatniej, w tym przykładzie użyjemy 10, i zastosować zestaw kroków do niego:
if n is even:
Divide it by 2
if n is odd:
Multiply it by 3 and add 1
repeat until n = 1
10 jest parzyste, więc dzielimy przez 2, aby uzyskać 5. 5 jest nieparzyste, więc mnożymy przez 3 i dodajemy 1, aby uzyskać 16. 16 jest parzyste, więc przeciąć na pół, aby uzyskać 8. Połowa z 8 to 4, połowa z 4 to 2, a połowa 2 to 1. Ponieważ zajęło nam to 6 kroków, mówimy, że 10 ma dystans zatrzymania równy 6.
Liczba Super Collatz to liczba, której droga hamowania jest większa niż droga hamowania każdej liczby mniejszej od niej. Na przykład 6 to liczba Super Collatz, ponieważ 6 ma drogę hamowania 8, 5 ma drogę hamowania 5, 4 ma 2, 3 ma 7, 2 ma 1, a 1 ma 0. ( A006877 w OEIS) Musisz weź liczbę n jako dane wejściowe i wyślij wszystkie liczby Super Collatz do n .
Zasady
Pełny program lub funkcja jest akceptowalna.
Nie można wstępnie obliczyć ani zakodować na stałe sekwencji Super Collatz.
Możesz przyjmować dane wejściowe w dowolnym rozsądnym formacie.
Dane wyjściowe można zwrócić jako listę z funkcji lub wydrukować do STDOUT lub pliku. Którykolwiek jest najwygodniejszy.
Niepoprawne dane wejściowe (nieliczbowe, dziesiętne, liczby ujemne itp.) Powodują niezdefiniowane zachowanie.
Przykładowy python bez golfa
def collatzDist(n):
if n == 1:
return 0
if n % 2 == 0:
return 1 + collatzDist(n / 2)
return 1 + collatzDist((n * 3) + 1)
n = input()
max = -1
superCollatz = []
for i in range(1, n + 1):
dist = collatzDist(i)
if dist > max:
superCollatz.append(i)
max = dist
print superCollatz
Próbka IO:
#in #out
4 --> 1, 2, 3
50 --> 1, 2, 3, 6, 7, 9, 18, 25, 27
0 --> invalid
10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171
Oto także pierwsze 44 numery Super Collatz:
1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799
Odpowiedzi:
Pyth, 23 bajty
Demonstracja
Działa to poprzez zwiększenie maksymalnego zasięgu do każdej liczby według odległości zatrzymania Collatz i sprawdzenie, czy ta maksymalna liczba jest liczbą.
źródło
Python 2, 104 bajty
c
to funkcja pomocnicza, która oblicza odległość Collatz dla danej liczby całkowitej. Nienazwana lambda jest główną funkcją, która oblicza liczby super Collatz do (ale nie wliczając) danych wejściowych.źródło
Dyalog APL , 41 bajtów
Funkcja bez nazwy. Imię lub nawias, aby zastosować.
Przypadki testowe:
0 powoduje niezdefiniowane zachowanie.
źródło
ES6,
8683 bajtówEdycja: Zapisano 3 bajty, przełączając
filter
się na rozumienie tablicy.źródło
Haskell, 84 bajty
Jest to oczywiście bardzo powolne, ale działa!
źródło
Oracle SQL 11.2, 329 bajtów
Wersja bez gry w golfa
Widok q jest prawdziwym widokiem rekurencyjnym (nie jest zapytaniem hierarchicznym z CONNECT BY), który oblicza wszystkie kroki w kierunku 1 dla każdej liczby całkowitej od 1 do: 1.
Widok v oblicza odległości zatrzymania.
Widok m używa analitycznej wersji MAX, aby zastosować ją do każdego wiersza poprzedzającego, z wyjątkiem bieżącego wiersza. W ten sposób dla każdej liczby całkowitej wiemy, że jest to droga hamowania i aktualna największa droga hamowania.
Ostatnie zapytanie sprawdza, czy droga hamowania jest większa niż największa droga hamowania. I dodaje kilka sztuczek do obsługi 1 oraz specjalny przypadek: 1 o wartości 0.
źródło
MATL , 37 bajtów
Wypróbuj online!
źródło
𝔼𝕊𝕄𝕚𝕟, 30 znaków / 38 bajtów
Try it here (Firefox only).
Jedynym powodem, dla którego nie opublikowałem tego wcześniej, było to, że nie miałem jasności co do specyfikacji. Wykorzystuje niestandardowe kodowanie, które koduje 10-bitowe znaki.
Wyjaśnienie
⩥ïⓜ
tworzy zakres[0,input)
do odwzorowania.МȬ⧺$,a=[])
generuje liczby Collatz w pustej tablicy i⋎⟮aꝈ-1⟯>ɐ
używa tablicy liczb Collatz, aby uzyskać odległość zatrzymania i sprawdzić, czy jest ona większa niż poprzednia maksymalna droga zatrzymania. Jeśli tak,⅋(ɐ=Ⅰ,ᵖ$
bieżąca odległość zatrzymania staje się maksymalną odległością zatrzymania i wypycha bieżący przedmiot z zakresu na stos. Następnie elementy stosu są domyślnie drukowane.źródło
Galaretka , 17 bajtów
Wypróbuj online!
Może zaskakujące, to tylko 3 linki! Są
×3‘µHḂ?µÐĿL$€
,<Ṫ$
iẠ
.źródło