Odwróć i odejmij

22

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

  • Zera końcowe należy pominąć. tj rev(5020) = 205.
  • Pamiętaj, że to , więc ustaw swój kod tak krótko, jak to możliwe!
  • Odpowiednia sekwencja: A072140
shooqie
źródło
Interesująca uwaga: możliwe jest skonstruowanie dowolnej liczby całkowitej o okresie zapętlenia 2, jak opisano w komentarzach do A072141 . Metoda jest identyczna również dla innych okresów, takich jak 12, 14, 17 i 22.
mbomb007

Odpowiedzi:

18

Pyth, 5 bajtów

4 bajty dzięki FryAmTheEggman

uas_`

Zestaw testowy.

Prawdziwa wartość to jedna z liczb w pętli.

Wartość falsey wynosi 0.

Wyjaśnienie

uas_`      Input:Q
uas_`GGQ   Implicit filling of variables.

u      Q   Set G as Q: do this repeatedly until result seen before: Set G as
 a             the absolute difference of
     G             G
    `              convert to string
   _               reverse
  s                convert to integer
      G        and G
Leaky Nun
źródło
Dobre wykorzystanie zmiennych autouzupełniania!
FryAmTheEggman
1
* nadużycie - - - - -
Leaky Nun
Jak to działa dla kogoś, kto nie zna Pytha?
Fatalize
3
jak Pyth jest tak krótki, ale wciąż w zakresie ASCII ._.
Downgoat
3
@Downgoat Ponieważ jest to pyth.
Leaky Nun
11

Mathematica, 39 37 bajtów

Nest[Abs[#-IntegerReverse@#]&,#,#]<1&

Po prostu stosuje nczasy transformacji do tyłu / odejmowania na danych wejściowych, na następnie sprawdza, czy wynik jest 0. 10nDotarcie 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ż 10nliczba bez więcej cyfr niż n. Zobacz dowód Dennisa, jak zmniejszyć to ograniczenie n.

Martin Ender
źródło
10

Galaretka , 6 5 bajtów

ṚḌạµ¡

Wypróbuj online!

tło

Wykorzystuje @ MartinEnder górna związany z 10n iteracji i następujących uwag.

  1. Istnieje 9 x 10 k - 1 dodatnie liczby całkowite n o k cyfr.

  2. 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.

  3. 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 .

  4. 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

ṚḌạµ¡  Main link. Argument: n

   µ¡  Iteratively apply the chain to the left n times.
Ṛ      Reverse n (casts to digits).
 Ḍ     Undecimal; convert from base 10 to integer.
  ạ    Take the absolute difference of the result and the argument.
Dennis
źródło
11
Czy Pyth pokonał Jelly?
Leaky Nun
3
Cóż, to remis.
Dennis
To nie są bajty.
mik
1
@mik Kliknij link bajtów w nagłówku.
Dennis
5

Oracle SQL 11.2, 136 bajtów

WITH v(n)AS(SELECT :1 FROM DUAL UNION ALL SELECT ABS(n-REVERSE(n||''))FROM v WHERE n>0)CYCLE n SET c TO 0 DEFAULT 1 SELECT MIN(c)FROM v;

Nie grał w golfa

WITH v(n) AS
(
  SELECT :1 FROM DUAL
  UNION ALL
  SELECT ABS(n-REVERSE(n||''))FROM v WHERE n>0 
) CYCLE n SET c TO 0 DEFAULT 1
SELECT MIN(c)FROM v
Jeto
źródło
5

APL, 26 znaków

0∘{⍵∊⍺:×⍵⋄(⍺,⍵)∇|⍵-⍎⌽⍕⍵}

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 :

 {×{|⍵-⍎⌽⍕⍵}⍣(10×⍵)⊣⍵}

Brzmi on: „jaki jest znak wyniku po zastosowaniu poszukiwanych 10 razy”?

lstefano
źródło
4

Python 2, 50 bajtów

n=input()
exec'n=abs(n-int(`n`[::-1]));'*n
print n

Przetestuj na Ideone .

tło

Wykorzystuje @ MartinEnder górna związany z 10n iteracji i następujących uwag.

  1. Istnieje 9 x 10 k - 1 dodatnie liczby całkowite n o k cyfr.

  2. 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.

  3. 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 .

  4. 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 .

Dennis
źródło
3

Python, 129 120 96 bajtów

Jeś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.

def r(n):a=abs(n-int(str(n)[::-1]));return a and r(a)
try:print(r(int(input())))
except:print(1)

Dzięki @LeakyNun
Dzięki @shooqie

TuxCrafting
źródło
To oficjalnie (miłe) nadużycie nieskończonej rekurencji.
Leaky Nun
return a and rev(a)
Leaky Nun
3
Czy nie jest możliwe uzyskanie RuntimeError z powodu bardzo długiej rekurencji bez koniecznej nieskończoności?
Fatalize
a=[n-x,x-n][n>x]
Leaky Nun
Można go skrócić drastycznie: def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a). rrev
Nazwij
3

Python, 101 98 bajtów

Algorytm żółwia i zająca.

Prawda jest dowolną wartością w pętli, falsey jest 0.

g=lambda n:abs(n-int(str(n)[::-1]))
def r(n):
    t=g(n);h=g(t)
    while t-h:h=g(g(h));t=g(t)
    return h

Ideone to!

Leaky Nun
źródło
3

Python 2, 85 84 83 bajtów

L=[]
def f(n,L=L):
    if n<1or n in L:print n<1
    else:L+=[n];f(abs(n-int(`n`[::-1])))

Kolejna 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.

atlasolog
źródło
1
Wierzę, że print n<1działa (ponieważ nzawsze jest nieujemny) i oszczędza bajt
NonlinearFruit
def 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ów
Leaky Nun
3

05AB1E, 11 8 6 bajtów

DFÂï-Ä

Wyjaśnił

DF          # input number of times do
  Â         # push current number and its reverse
   ï-       # convert reverse to int and subtract
     Ä      # absolute value
            # implicitly print after loop ends

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

DFÂ-Ä
Emigna
źródło
Ok, to trochę dziwny golf, ale DFÂ-Ädziała w wersji 7.9, ale nie w obecnej wersji. W bieżącej wersji musisz najpierw przekonwertować go na int (tak jak to DFÂï-Ä), ale możesz użyć wersji 7.9, aby uzyskać 5 bajtów: p.
Adnan
@Adnan Nie mogę uwierzyć, że zapomniałem o funkcji bifurkacji. Pozostanę jednak przy aktualnej wersji. Możesz opublikować 7.9 jako osobną odpowiedź, jeśli chcesz. W przeciwnym razie umieszczę to jako notatkę.
Emigna
Prawdopodobnie nie opublikuję tego, ponieważ dzieli go zaledwie 1 bajt od tej odpowiedzi: str.
Adnan
1

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.

import java.util.*;int z(int a){int o,r,c=a;Set s=new HashSet();while(c!=0){for(r=0,o=c;o!=0;r=r*10+o%10,o/=10);c=Math.abs(c-r);if(!s.add(c))return 1;}return 0;}
Szturchać
źródło
Zauważam, że widziałem wcześniej importowanie i funkcje. przykład
Poke
Czy to 1prawda?
Leaky Nun
1
@LeakyNun 1 nie jest uważany za prawdziwy w Javie, ale listy OP (True, 1) i (False, 0) są akceptowalnymi wynikami.
Poke
@LeakyNun Czy Java ma nawet poczucie prawdy lub fałszu?
Neil
@Neil Java ma poczucie, że wykorzystuje synergiczne możliwości w kontekście rynku pionowego - to wszystko
cat
1

Brachylog , 49 32 23 bajtów

:10*N,?:N:{r:?-+.}itT'0

Zwraca truenieskończone pętle i falsenie tylko.

Jest to bezwstydna adaptacja algorytmu Martina Endera.

Poprzednia odpowiedź, 32 bajty

g{tTr:T-+U(0!\;?:ImU;?:[U]c:1&)}

Wyjaśnienie poprzedniej odpowiedzi

g{                             } Call predicate with [Input] as input
  tT                             T is the last element of Input
    r:T-                         Subtract T from the reverse of T
        +U                       U is the absolute value of T
          (0!\                   If U is 0, return false
              ;                  Or
               ?:ImU             If U is in Input, return true
                    ;            Or
                     ?:[U]c:1&)  Recursive call with U concatenated to the Input
Fatalizować
źródło
0

PowerShell v2 +, 94 bajty

param($n)for($a=,0;){if(($n=[math]::Abs($n-(-join"$n"["$n".length..0])))-in$a){$n;exit}$a+=$n}

Pobiera dane wejściowe $n, rozpoczyna nieskończoną forpętlę za pomocą$a=,0 jako warunek początkowy (używa operatora przecinka, aby ustawić $atablicę jednego elementu 0). To $ajest nasza tablica już widocznych wartości.

Każdą iterację pętli sprawdzamy if. Warunek najpierw ustawia następną wartość $nużycia odwracania łańcuchów i [math]::Abswywołania .NET i sprawdza, czy ta wartość już jest-in $a . Jeśli tak, wysyłamy $ni exit. W przeciwnym razie dodajemy tę wartość do tablicy i kontynuujemy pętlę.

Dane 0wyjś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ścia 2178dla danych wejściowych 1584.

AdmBorkBork
źródło
0

Haskell, 65 bajtów

_#0=0
a#n|elem n a=1|1<2=(n:a)#abs(n-(read$reverse$show n))
([]#)

Zwraca 0za False i 1True. Przykład użycia: ([]#) 1584-> 1.

Oczywiste podejście: prowadź listę wszystkich dotychczas zaobserwowanych wyników. Oblicz następny numer do 0lub na liście.

nimi
źródło
0

JavaScript (ES6), 75 bajtów

f=(n,...a)=>a.includes(n=n<0?-n:n)?n:f([...n+``].reverse().join``-n,n,...a)

n<0?n=-n:na n*=n>0||-1także praca. Algorytm przypomina nieco odpowiedź programu PowerShell, chociaż jest to formuła rekurencyjna.

Neil
źródło
0

Rubinowy, 57 bajtów

->n,*h{h[n]=n=(n-"#{n}".reverse.to_i).abs until h[n];n>0}

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ą.

histocrat
źródło
0

Perl 6  58 53 33  30 bajtów

sub {$/=%;$^a,{return ?1 if $/{$_}++;abs $_-.flip}...0;?0}
{$/=%;?($_,{last if $/{$_}++;abs $_-.flip}...0)[*-1]}
{?($_,{abs $_-.flip}...0)[10**$_]}

{?($_,{abs $_-.flip}...0)[$_]}

Wyjaśnienie:

{ # block lambda with implicit parameter $_

  # coerce the following to Bool
  # ( False for Nil or 0, True otherwise )
  ?

  (

    $_, # start a sequence with the input

    # block lambda with implicit parameter $_
    # subtracts the previous value in the sequence and its reverse
    # ( .flip is short for $_.flip where a term is expected )
    { abs $_ - .flip } 

    ... # repeat that lambda
    0   # until you get 0

  # get the element indexed with the block's input
  # may be 0, Nil, or a number that is part of a repeating sequence
  )[ $_ ]
}

(opiera się na poprzednim spostrzeżeniu, że transformację tę należy wykonać tylko w większości nprzypadków)

Brad Gilbert b2gills
źródło
0

Perl 5, 31 29 bajtów

perl -pe'for$x(1..$_){$_=abs$_-reverse}'

perl -pe'eval"\$_=abs\$_-reverse;"x$_'

Iteruje 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 evali xpowtarzaj operatora zamiast forpętli.

mik
źródło
Ładna odpowiedź i witamy w PPCG! Zauważ, że dla Perla opcje wiersza poleceń muszą być uwzględnione w twojej liczbie bajtów, więc nie jest to całkiem 30 bajtów.
AdmBorkBork
@ TimmyD ok, +1 dla -popcji, -lnie jest konieczne dla pojedynczego wejścia
mik
0

Matlab, 89 84 bajtów

n=input('');z=n;while n
z=abs(z-str2num(fliplr(num2str(z))));n=[n z]*all(n~=z);end
z

Proste podejście - układa wszystkie liczby w stos i sprawdza, czy liczba pojawiła się wcześniej.

Wyjaśnienie

n=input('');z=n;  -- take input, initiate z
while n           -- n is said to be positive
z=abs(z-str2num(fliplr(num2str(z)))) -- calculate the "reverse and substract"
n=[n z]           -- put the value at the end of the vector
       *all(n~=z) -- make the n all zeroes if z is previously in the vector (break the loop)
end
z                 -- print z (0 when not entered loop, >0 otherwise)
pajonk
źródło