Descripción del desafío
Tomemos un número entero positivo n
, invierta sus dígitos para obtener rev(n)
y obtener el valor absoluto de la diferencia de estos dos números:|n - rev(n)|
(o abs(n - rev(n))
).
Ejemplo:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
Después de repetir esta operación muchas veces, la mayoría de los números se convertirán 0
(terminando así el ciclo) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... aunque algunos números (como 1584
) se atascan en un bucle infinito:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Su trabajo es determinar si un entero dado se atasca en un bucle infinito.
Descripción de entrada
Un entero positivo.
Descripción de salida
Un valor verdadero ( True
, 1
) si el número se atasca en un bucle infinito, un valor falso ( False
, 0
) de lo contrario.
Notas
- Se deben omitir los ceros finales. es decir
rev(5020) = 205
. - Recuerde que este es el código de golf , ¡así que haga su código lo más corto posible!
- Secuencia relevante: A072140
code-golf
number-theory
shooqie
fuente
fuente
Respuestas:
Pyth, 5 bytes
4 bytes gracias a FryAmTheEggman
Banco de pruebas.
El valor verdadero es uno de los números en el bucle.
El valor de falsey es
0
.Explicación
fuente
Mathematica
3937 bytesSimplemente aplica los
n
tiempos de transformación inversa / resta a la entradan
y luego verifica si el resultado es0
. Nunca puede tomar más que10n
pasos para alcanzar un bucle, porque la transformación no puede aumentar el número de dígitos, y hay menos de10n
números sin más dígitos quen
. Vea la prueba de Dennis sobre cómo reducir este límiten
.fuente
Jalea ,
65 bytesPruébalo en línea!
Fondo
Esto utiliza el límite superior de @ MartinEnder de 10n iteraciones y las siguientes observaciones.
Hay 9 × 10 k - 1 enteros positivos n con k dígitos.
La diferencia de un número y su reverso es siempre un múltiplo de 9 , por lo que solo 10 k - 1 de ellos pueden ocurrir después de la primera iteración.
De los múltiplos, más de 1/10 perderán un dígito en la próxima iteración (para empezar, todo eso comienza y termina con los mismos dígitos, y aproximadamente el doble si el primer dígito no es ni 1 ni 9 ), entonces se necesita como máximo 9 × 10 k - 2 para ingresar un bucle o perder un dígito.
Aplicando el mismo razonamiento al eventual entero resultante de k - 1 dígitos y así sucesivamente, toma como máximo 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iteraciones para ingresar un bucle o llegar a 0 .
Cómo funciona
fuente
Oracle SQL 11.2, 136 bytes
Sin golf
fuente
APL, 26 caracteres
Usamos el argumento izquierdo como el acumulador de los valores que ya hemos visto. Lo inicializamos a "0", que es una de las dos condiciones de terminación. El guardia
⍵∊⍺:×⍵
se lee: "¿es el argumento correcto algo que ya hemos visto (y que incluye cero)? Si es así, devuelve el signo del número, que es 1 o 0". De lo contrario, recurramos llamándonos con el valor absoluto de la resta después de haber cateado el valor actual al argumento izquierdo.Un relanzamiento de la solución de Mathematica por Martin Ender registraría 21 caracteres :
Se lee: "¿cuál es el signo del resultado después de aplicar las 10 veces deseadas"?
fuente
Python 2, 50 bytes
Pruébalo en Ideone .
Fondo
Esto utiliza el límite superior de @ MartinEnder de 10n iteraciones y las siguientes observaciones.
Hay 9 × 10 k - 1 enteros positivos n con k dígitos.
La diferencia de un número y su reverso es siempre un múltiplo de 9 , por lo que solo 10 k - 1 de ellos pueden ocurrir después de la primera iteración.
De los múltiplos, más de 1/10 perderán un dígito en la próxima iteración (para empezar, todo eso comienza y termina con los mismos dígitos, y aproximadamente el doble si el primer dígito no es ni 1 ni 9 ), entonces se necesita como máximo 9 × 10 k - 2 para ingresar un bucle o perder un dígito.
Aplicando el mismo razonamiento al eventual entero resultante de k - 1 dígitos y así sucesivamente, toma como máximo 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iteraciones para ingresar un bucle o llegar a 0 .
fuente
CJam,
1513 bytesPruébalo aquí.
Igual que mi respuesta de Mathematica.
fuente
Python,
12912096 bytesSi se detecta una excepción (normalmente la única excepción que se puede lanzar con esta función es un RuntimeError, debido a la recursión infinita), imprime 1. De lo contrario, imprime el resultado, 0.
Gracias a @LeakyNun
Gracias a @shooqie
fuente
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)
. Además, nombre el método como algo corto (como enr
lugar derev
)Python,
10198 bytesAlgoritmo de tortuga y liebre.
La verdad es cualquier valor en bucle, Falsey es
0
.Ideone it!
fuente
Python 2,
858483 bytesOtra respuesta de Python. Agrega n a una lista para cada iteración, y si n ya está en la lista, genera
False
. De lo contrario, funciona hasta 0.Gracias @NonlinearFruit por un byte.
fuente
print n<1
funciona (yan
que siempre es no negativo) y ahorra un bytedef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
ahorra 5 bytes05AB1E,
1186 bytesExplicado
El valor de verdad es un número del bucle.
El valor falso es 0.
Pruébalo en línea
Utiliza el límite superior explicado en la respuesta de Dennis 'Jelly
Guardado 2 bytes gracias a @Adnan
En la versión 7.9 de 05AB1E, las siguientes soluciones de 5 bytes funcionan según lo indicado por @Adnan
fuente
DFÂ-Ä
funciona en la versión 7.9 pero no en la versión actual. En la versión actual, primero debe convertirlo a un int (como esteDFÂï-Ä
), pero puede usar la versión 7.9 para convertirlo en 5 bytes: p.Java 7, 161 bytes
Esto requiere una importación, pero lo escribí como una función. Grítame en los comentarios si se prefiere un programa completo en este escenario. Emite 1 si hay un bucle infinito y 0 si el valor llega a 0.
fuente
1
verdad?Brachylog ,
493223 bytesDevuelve
true
para bucles infinitos y defalse
otra manera.Esta es una adaptación descarada del algoritmo de Martin Ender.
Respuesta anterior, 32 bytes
Explicación de la respuesta anterior.
fuente
PowerShell v2 +, 94 bytes
Toma entrada
$n
, inicia unfor
bucle infinito , con$a=,0
la condición inicial (esto usa el operador de coma para establecer$a
una matriz de un elemento0
). Este$a
es nuestro conjunto de valores ya vistos.Cada iteración de bucle verificamos un
if
. La condición primero establece el siguiente valor de$n
usar reversión de cadenas y la[math]::Abs
llamada .NET, y verifica si ese valor ya lo es-in
$a
. Si es así, sacamos$n
yexit
. De lo contrario, agregamos ese valor a la matriz y continuamos el ciclo.Emite
0
los valores de entrada donde no entra en un bucle infinito (que es falso en PowerShell) y emite el valor donde el bucle se encontró de otra manera (los enteros distintos de cero son verdaderos). Por ejemplo, salidas2178
para entrada1584
.fuente
Haskell, 65 bytes
Devoluciones
0
para Falso y1
para Verdadero. Ejemplo de uso:([]#) 1584
->1
.El enfoque obvio: mantener una lista con todos los resultados vistos hasta ahora. Calcule el siguiente número hasta
0
o esté en la lista.fuente
JavaScript (ES6), 75 bytes
n<0?n=-n:n
yn*=n>0||-1
tambien trabajo. Algoritmo se parece un poco a la respuesta de PowerShell, aunque esta es una formulación recursiva.fuente
Ruby, 57 bytes
La matriz inicialmente vacía
h
rastrea los valores previamente alcanzados. Repetimos el número hasta que alcanzamos un valor anterior, luego verificamos el valor en la última iteración. Como 0 es un ciclo de 1, será 0 si y solo si no hay un ciclo mayor. Tomo 2 bytes adicionales para convertir esto a un booleano porque 0 es verdadero en Ruby.fuente
Perl 6
58 53 3330 bytesExplicación:
(se basa en la observación anterior de que solo necesita hacer esta transformación la mayoría de las
n
veces)fuente
Perl 5,
3129 bytesSe itera
n=|n-rev(n)|
n veces, por lo que la salida es 0 si no hay bucle,> 0 en caso contrario. Dennis ya demostró que esto es suficiente.La nueva versión usa
eval
yx
repite el operador en lugar delfor
bucle.fuente
-p
opción,-l
no es necesario para una sola entradaMatlab,
8984 bytesEnfoque simple: apila todos los números y comprueba si un número apareció antes.
Explicación
fuente