Opis wyzwania
Weźmy dodatnią liczbę całkowitą n
, odwróć jej cyfry, aby uzyskać rev(n)
i uzyskać wartość bezwzględną różnicy tych dwóch liczb: |n - rev(n)|
(lub abs(n - rev(n))
).
Przykład:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
Po powtórzeniu tej operacji wystarczająco wiele razy większość liczb stanie się 0
(tym samym kończąc pętlę) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... chociaż niektóre liczby (jak 1584
) utknęły w nieskończonej pętli:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Twoim zadaniem jest ustalenie, czy dana liczba całkowita utknie w nieskończonej pętli.
Opis wejściowy
Dodatnia liczba całkowita.
Opis wyników
Wartość truthy ( True
, 1
), jeżeli liczba utknie w nieskończonej pętli wartość falsy ( False
, 0
) inaczej.
Notatki
code-golf
number-theory
shooqie
źródło
źródło
Odpowiedzi:
Pyth, 5 bajtów
4 bajty dzięki FryAmTheEggman
Zestaw testowy.
Prawdziwa wartość to jedna z liczb w pętli.
Wartość falsey wynosi
0
.Wyjaśnienie
źródło
Mathematica,
3937 bajtówPo prostu stosuje
n
czasy transformacji do tyłu / odejmowania na danych wejściowych,n
a następnie sprawdza, czy wynik jest0
.10n
Dotarcie do pętli nigdy nie może zająć więcej niż kroki, ponieważ transformacja nie może zwiększyć liczby cyfr, a liczba jest mniejsza niż10n
liczba bez więcej cyfr niżn
. Zobacz dowód Dennisa, jak zmniejszyć to ograniczenien
.źródło
Galaretka ,
65 bajtówWypróbuj online!
tło
Wykorzystuje @ MartinEnder górna związany z 10n iteracji i następujących uwag.
Istnieje 9 x 10 k - 1 dodatnie liczby całkowite n o k cyfr.
Różnica liczby i jej odwrotność jest zawsze wielokrotnością 9 , więc tylko 10 k - 1 z nich może wystąpić po pierwszej iteracji.
Z wielokrotności, więcej niż 1/10 straci cyfra w następnej iteracji (na początek, wszystko to początek i koniec z tymi samymi cyframi, a mniej więcej dwa razy tyle, jeśli pierwsza cyfra ma ani 1 ani 9 ), tak wejście w pętlę lub zgubienie cyfry zajmuje najwyżej 9 × 10 k - 2 .
Zastosowanie tego samego rozumowania do ostatecznej wynikowej liczby całkowitej k - 1 cyfr i tak dalej, potrzeba maksymalnie 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iteracji, aby wejść do pętli lub osiągnąć 0 .
Jak to działa
źródło
Oracle SQL 11.2, 136 bajtów
Nie grał w golfa
źródło
APL, 26 znaków
Używamy lewego argumentu jako akumulatora wartości, które już widzieliśmy. Inicjujemy go na „0”, co jest jednym z dwóch warunków zakończenia. Strażnik
⍵∊⍺:×⍵
jest czytany: „czy właściwy argument jest czymś, co już widzieliśmy (i który obejmuje zero)? Jeśli tak, zwróć znak liczby, czyli 1 lub 0”. W przeciwnym razie powtórzmy, nazywając się bezwzględną wartością odejmowania, po tym jak catenate bieżącą wartość do lewego argumentu.Przekształcenie rozwiązania Mathematica autorstwa Martina Endera osiągnęłoby 21 znaków :
Brzmi on: „jaki jest znak wyniku po zastosowaniu poszukiwanych 10 razy”?
źródło
Python 2, 50 bajtów
Przetestuj na Ideone .
tło
Wykorzystuje @ MartinEnder górna związany z 10n iteracji i następujących uwag.
Istnieje 9 x 10 k - 1 dodatnie liczby całkowite n o k cyfr.
Różnica liczby i jej odwrotność jest zawsze wielokrotnością 9 , więc tylko 10 k - 1 z nich może wystąpić po pierwszej iteracji.
Z wielokrotności, więcej niż 1/10 straci cyfra w następnej iteracji (na początek, wszystko to początek i koniec z tymi samymi cyframi, a mniej więcej dwa razy tyle, jeśli pierwsza cyfra ma ani 1 ani 9 ), tak wejście w pętlę lub zgubienie cyfry zajmuje najwyżej 9 × 10 k - 2 .
Zastosowanie tego samego rozumowania do ostatecznej wynikowej liczby całkowitej k - 1 cyfr i tak dalej, potrzeba maksymalnie 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iteracji, aby wejść do pętli lub osiągnąć 0 .
źródło
CJam,
1513 bajtówSprawdź to tutaj.
Tak samo jak moja odpowiedź Mathematica.
źródło
Python,
12912096 bajtówJeśli wychwycony zostanie wyjątek (zwykle jedynym wyjątkiem, który można zgłosić za pomocą tej funkcji, jest RuntimeError, z powodu nieskończonej rekurencji), wydrukuj 1. W przeciwnym razie wydrukuj wynik, 0.
Dzięki @LeakyNun
Dzięki @shooqie
źródło
return a and rev(a)
a=[n-x,x-n][n>x]
def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)
.r
rev
Python,
10198 bajtówAlgorytm żółwia i zająca.
Prawda jest dowolną wartością w pętli, falsey jest
0
.Ideone to!
źródło
Python 2,
858483 bajtówKolejna odpowiedź w języku Python. Dodaje n do listy dla każdej iteracji, a jeśli n jest już na liście, generuje
False
. W przeciwnym razie działa do 0.Dzięki @NonlinearFruit za jeden bajt.
źródło
print n<1
działa (ponieważn
zawsze jest nieujemny) i oszczędza bajtdef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
oszczędza 5 bajtów05AB1E,
1186 bajtówWyjaśnił
Prawdziwa wartość to liczba z pętli.
Wartość Falsy wynosi 0.
Wypróbuj online
Wykorzystuje górną granicę wyjaśnioną w odpowiedzi Dennisa „Galaretka”
Zaoszczędź 2 bajty dzięki @Adnan
W wersji 7.9 05AB1E następujące 5-bajtowe rozwiązania działają, jak zauważył @Adnan
źródło
DFÂ-Ä
działa w wersji 7.9, ale nie w obecnej wersji. W bieżącej wersji musisz najpierw przekonwertować go na int (tak jak toDFÂï-Ä
), ale możesz użyć wersji 7.9, aby uzyskać 5 bajtów: p.Java 7, 161 bajtów
Wymaga to importu, ale napisałem to jako funkcję. Krzyczcie na mnie w komentarzach, jeśli w tym scenariuszu preferowany jest pełny program. Zwraca 1, jeśli istnieje nieskończona pętla i 0, jeśli wartość osiąga 0.
źródło
1
prawda?Brachylog ,
493223 bajtówZwraca
true
nieskończone pętle ifalse
nie tylko.Jest to bezwstydna adaptacja algorytmu Martina Endera.
Poprzednia odpowiedź, 32 bajty
Wyjaśnienie poprzedniej odpowiedzi
źródło
PowerShell v2 +, 94 bajty
Pobiera dane wejściowe
$n
, rozpoczyna nieskończonąfor
pętlę za pomocą$a=,0
jako warunek początkowy (używa operatora przecinka, aby ustawić$a
tablicę jednego elementu0
). To$a
jest nasza tablica już widocznych wartości.Każdą iterację pętli sprawdzamy
if
. Warunek najpierw ustawia następną wartość$n
użycia odwracania łańcuchów i[math]::Abs
wywołania .NET i sprawdza, czy ta wartość już jest-in
$a
. Jeśli tak, wysyłamy$n
iexit
. W przeciwnym razie dodajemy tę wartość do tablicy i kontynuujemy pętlę.Dane
0
wyjściowe dla wartości wejściowych, w których nie przechodzi on w nieskończoną pętlę (która jest falsey w programie PowerShell) i generuje wartość, w której pętla napotkała się w przeciwnym razie (liczby całkowite niezerowe są prawdziwe). Na przykład wyjścia2178
dla danych wejściowych1584
.źródło
Haskell, 65 bajtów
Zwraca
0
za False i1
True. Przykład użycia:([]#) 1584
->1
.Oczywiste podejście: prowadź listę wszystkich dotychczas zaobserwowanych wyników. Oblicz następny numer do
0
lub na liście.źródło
JavaScript (ES6), 75 bajtów
n<0?n=-n:n
an*=n>0||-1
także praca. Algorytm przypomina nieco odpowiedź programu PowerShell, chociaż jest to formuła rekurencyjna.źródło
Rubinowy, 57 bajtów
Początkowo pusta tablica
h
śledzi wcześniej osiągnięte wartości. Iterujemy liczbę, aż osiągniemy poprzednią wartość, a następnie sprawdzamy wartość na ostatniej iteracji. Ponieważ 0 jest cyklem 1, będzie wynosił 0 wtedy i tylko wtedy, gdy nie będzie większego cyklu. Zajmuję dodatkowe 2 bajty, aby przekonwertować to na wartość logiczną, ponieważ 0 w Ruby jest zgodne z prawdą.źródło
Perl 6
58 53 3330 bajtówWyjaśnienie:
(opiera się na poprzednim spostrzeżeniu, że transformację tę należy wykonać tylko w większości
n
przypadków)źródło
Perl 5,
3129 bajtówIteruje
n=|n-rev(n)|
n razy, więc wynik wynosi 0, jeśli nie ma pętli, w przeciwnym razie 0. Dennis już udowodnił, że to wystarczy.Nowa wersja używa
eval
ix
powtarzaj operatora zamiastfor
pętli.źródło
-p
opcji,-l
nie jest konieczne dla pojedynczego wejściaMatlab,
8984 bajtówProste podejście - układa wszystkie liczby w stos i sprawdza, czy liczba pojawiła się wcześniej.
Wyjaśnienie
źródło