W Collatz Conjecture postulaty że jeśli wziąć dowolną dodatnią liczbę całkowitą, a następnie powtórzyć tyle razy następujący algorytm:
if number is odd, then multiply by three and add one
if number is even, then divide by two
ostatecznie skończysz jako 1. Wygląda na to, że zawsze działa, ale nigdy nie udowodniono, że zawsze działa.
Grałeś już w golfa, obliczając ile czasu zajmuje dotarcie do 1 , więc pomyślałem, że trochę zmienię.
Zaczynając od podanej dodatniej liczby całkowitej, oblicz, ile czasu zajmuje dotarcie do 1 (jej „czasu zatrzymania”). Znajdź czas zatrzymania tego numeru.
Powtarzaj tę czynność, aż dojdziesz do 1 lub do całkowicie arbitralnego limitu 100 iteracji. W pierwszym przypadku wydrukuj ile iteracji to zajęło. W tym drugim przypadku wypisz „Fail” lub inny spójny wynik według własnego wyboru, o ile nie jest to liczba całkowita 1≤n≤100
. Nie możesz wypisać pustego ciągu dla tej opcji. Wyprowadzenie liczby całkowitej spoza zakresu [1, 100] jest jednak dozwolone.
Przykłady:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Jak obliczyłem 10^100
i 12345678901234567890
używając języka, który obsługuje tylko liczby rzeczywiste dla tego rozmiaru, jeśli Twój język jest dokładniejszy, możesz uzyskać inne wyniki dla nich.
Punktacja
Ponieważ jest to gra w golfa , wygrywa odpowiedź z najmniejszą ilością bajtów.
źródło
Odpowiedzi:
Galaretka , 24 bajty
Wypróbuj online!
źródło
³
zamiastȷ2
jest dozwolone ).Python 2 , 70 bajtów
Zwraca 199 za sto lub więcej iteracji.
Wypróbuj online!
źródło
Attache , 40 bajtów
Wypróbuj online!
To jest nowy język, który stworzyłem. Chciałem zająć się tworzeniem poprawnego języka, a to jest wynik: podróbka matematyki. Brawo?
Wyjaśnienie
Jest to kompozycja kilku funkcji. Te funkcje to:
PeriodicSteps[CollatzSize@Max&1]
Daje to funkcję, która stosuje swój argument, aż wyniki zawierają zduplikowany element. Ta funkcjaCollatzSize@Max&1
ma zastosowanieCollatzSize
do większej wartości wejściowej i1
, aby uniknąć nieprawidłowej wartości wejściowej0
dla CollatSize.`#
jest notowanym operatorem; zastosowane monadycznie w tym sensie, uzyskuje rozmiar swojego argumentu`-&3
to funkcja powiązana, która wiąże argument3
z funkcją o`-
treści „minus 3”. Wynika to z faktu, że aplikacja PeriodicSteps daje wyniki0
s, które należy uwzględnić. (To także starannie obsługuje liczby poza granicami, takie jak5
, które mapują-1
.)źródło
J ,
4945 bajtów-4 bajty dzięki krótszemu kodowi sekwencji Collatz pobranemu z komentarza @ randomra tutaj .
Dane wyjściowe
101
dla nieprawidłowych wyników.Wypróbuj online!
Wyjaśnienie
Nic dziwnego, że to wyjaśnienie szybko się zdezaktualizowało. Zostawię to w kategoriach starej 49-bajtowej odpowiedzi, którą otrzymałem, którą poniżej. Jeśli chcesz aktualizacji, daj mi znać. Sposób, w jaki odnajduje długość sekwencji rekurencyjnej, pozostaje taki sam, właśnie zastosowałem krótszą metodę Sekwencji Collatza.
Znalezienie długości sekwencji Collatz
Ta sekcja kodu jest następująca
Oto wyjaśnienie:
Niestety, czasownik zastosuj (
^:
), gdy zostanie wyświetlony monit o zapisywanie wyników, przechowuje również wartość początkową, więc oznacza to, że (jak zawsze) jesteśmy wyłączeni o jeden. Dlatego odejmujemy 1.Znalezienie długości sekwencji rekurencyjnej
źródło
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
powinno być równoważnychC (gcc) , 75 bajtów
Zwraca
-1
dlan>=100
iteracji.Wypróbuj online!
C (gcc) , 73 bajty
Zwraca
0
dlan>=100
iteracji.Wypróbuj online!
źródło
JavaScript (ES6), 57 bajtów
Zwraca,
true
gdy zawiedzie. Zwraca0
za1
.Przypadki testowe
Pokaż fragment kodu
źródło
APL (Dyalog Unicode) ,
3960535249 bajtów-3 bajty dzięki @ngn
Wypróbuj online!
Używa kodu @ngn dla Collatz, ale wcześniej używał kodu @ Uriel.
Oto stara wersja, która nie spełniała specyfikacji:
źródło
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 bajtów
Wypróbuj online!
Zwraca
101
sekwencję nie kończącą się.źródło
Łuska , 21 bajtów
Wypróbuj online! Zwraca
-1
w przypadku awarii0
na wejściu1
.Wyjaśnienie
źródło
C (gcc) ,
7073 bajtówWypróbuj online!
Zwraca,
101
gdy liczba iteracji przekroczy 100.źródło
m=0
do swojegof
(prawdopodobnie nawet korzystając z obecnie pustegofor
narzędzia do usuwania, aby go zapisać;
).Czysty ,
146... 86 bajtów-11 bajtów dzięki Ørjan Johansen
Jako dosłowność funkcji częściowej.
Wypróbuj online!
Przerywa,
hd of []
jeśli liczba iteracji przekracza 100.Wyjście z
Heap Full
dla wartości wejściowych powyżej ~,2^23
chyba że podasz większy rozmiar sterty.źródło
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
części, to curry. (Lub eta zmniejsza.)Python 2 ,
999897 bajtówc and t or f
zamiastt if c else f
.-1
zamiastf
lub'f'
dla danych wejściowych bez zatrzymania.Wypróbuj online!
źródło
BiwaScheme , 151 znaków
Możesz spróbować tutaj .
źródło
R ,
119107 bajtówCzęściowo używa kodu collatz Jarko Dubbeldam stąd . Zwraca
0
dla> 100 iteracji (błąd).Wypróbuj online!
źródło
APL NARS, 115 bajtów, 63 znaków
Prawdopodobnie przy użyciu pętli byłoby to bardziej jasne ... Istnieją 4 funkcje, 2 zagnieżdżone i pobudzające, a pierwsza tylko do definiowania i inicjalizacji na = 0, zmienna d, widziana z 2. funkcji jako licznik zmiennej globalnej.
Ta trzecia funkcja byłaby funkcją zwracającą liczbę wywołań dla rozwiązania hipotezy Collatza dla jej argumentu
Jest to druga funkcja, jeśli jej argument = 1, zatrzymaj jej rekurencję i zwróć d liczbę razy, gdy zostanie ona nazwana sobą-1; w przeciwnym razie, jeśli sam zostanie wywołany więcej niż 99 razy, zatrzymaj jego rekurencję i zwróć -1 (niepowodzenie), w przeciwnym razie oblicz hipotezę Collatza dla jej argumentu i wywołaj wartość długości sekwencji Collatza. Dla mnie nawet jeśli wszystko wydaje się działać, może być dużym problemem, jeśli jest zdefiniowana zmienna globalna i jedna zmienna w funkcji o tej samej nazwie, gdy programista widzi ją jako zmienną lokalną.
źródło
(Emacs, Common, ...) Lisp, 105 bajtów
Zwraca t dla iteracji> 100
Rozszerzony:
źródło