Inversión-adición de palíndromo
El proceso de adición de reversión es donde se agrega un número al reverso hasta que el número creado es un palíndromo. Por ejemplo, si comenzamos con 68, el proceso sería:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Como puede ver, esto tomó 3 adiciones para llegar a un número palindrómico. Si comenzáramos 89
, necesitaríamos 24 pasos (que puede ver el desglose aquí ).
El récord mundial para la mayoría de los pasos dados antes de alcanzar un palíndromo es 261, lo que ocurre para el número 1186060307891929990
, produciendo un número mayor que 10 118 . Sin embargo, ha habido bastantes números que no hemos podido obtener un palíndromo. Estos se llaman números de Lychrel .
Como estamos trabajando en la base 10, realmente solo podemos llamarlos candidatos, porque no existe prueba de que estos números nunca lleguen a un palíndromo. Por ejemplo, el candidato más pequeño de base 10 Lychrel es 196, y ha pasado por más de mil millones de iteraciones. Si el palíndromo existe, es mucho más grande que 10 10 8.77 . En comparación, si esa cantidad de 1s estuviera inscrita en átomos, necesitaríamos 2.26772 × 10 588843575 universos por valor de átomos para escribirla, suponiendo que exista.
Tu tarea
Cree un programa o función que tome una entrada entera y devuelva o imprima el número de pasos necesarios para alcanzar un palíndromo. No tendrá que tratar con candidatos de Lychrel (es decir, su programa, cuando recibe un candidato de Lychrel, puede lanzar un error o ejecutarse para siempre).
Casos de prueba:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Reglas
Bonos
- Si imprime cada paso adicional, formateado
n + rev(n) = m
, puede multiplicar su puntaje por 0.75 . Las sumas deben imprimirse antes del número de pasos. - Si su código puede detectar si un número es un candidato de Lychrel, puede multiplicar su puntaje por 0.85 . En este caso, es suficiente suponer que cualquier cosa que requiera más de 261 iteraciones es un candidato de Lychrel. O no devuelve nada, o cualquier cosa que no sea un número que pueda confundirse con una respuesta correcta (etc.: cualquier cadena o un número que no esté en el rango 0-261). Cualquier error no cuenta como salida válida (p. Ej., Se excede la profundidad máxima de recursión) y no puede utilizarse en la detección.
- Si completa ambas bonificaciones, multiplique por 0.6 .
Este es el código de golf , por lo que gana el menor número de bytes.
Este fragmento de código muestra una solución de ejemplo en Python 3 con ambos bonos.
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
fuente
*0.6
bono está por encima de los demás? ¿O es solo eso?10 + 01 = 11
o10 + 1 = 11
depende de nosotros?262
?Respuestas:
Pyth, 12 bytes
Pruébelo en línea: demostración o prueba de arnés
Utiliza una función bastante nueva (solo 17 horas).
Explicación
editar:
Cambió el código un poco. La versión anterior era
El mismo recuento de bytes, pero el nuevo es mucho más genial.
fuente
Python, 51
Para Python 2, los backticks no pueden reemplazarse
str()
debido a losL
adjuntos along
literales.Aquí hay una versión alternativa con puntaje 64 * 0.85 = 54.4 :
Y una versión alternativa para Python 3 con puntaje 88 * 0.6 = 52.8 :
fuente
CJam,
232220.4 bytesEl código tiene 24 bytes de longitud e imprime -1 para los candidatos de Lychrel.
Pruébalo en línea.
Cómo funciona
Si
{}#
tiene éxito, el índice también es el número de pasos. Si, por otro lado, la matriz no contiene un palíndromo,{}#
empujará -1 .fuente
Java, 200 * 0.6 = 120
Este es un bucle simple que hace exactamente lo que dice en la caja, pero con algo de golf agregado. Devoluciones
1000
para los candidatos de Lychrel para obtener el bono de detección. Resulta que pude imprimir para no demasiados caracteres (al menos para Java) y enganchar ese bono también. Lo mejor que pude hacer sin el código de bono fue 156, por lo que valió la pena.Con algunos saltos de línea:
Respuesta anterior: 171 * 0.85 = 145.35 bytes
fuente
s++<999
Rubí, (80 + 2) * 0.6 = ~ 49.2
Con banderas
-nl
, correLa salida se ve como
Si se le da 196, imprime los primeros 261 pasos de suma y luego
nil
.Nada demasiado complicado aquí. Verificamos si
$_
(que se inicializa en la entrada) contiene su reverso, que solo es posible si son iguales ya que son del mismo tamaño. Si es así, imprimimos el número de paso y salimos, de lo contrario, mostramos y ejecutamos el paso de suma, almacenando el nuevo valor en$_
(desafortunadamente no puedo soloeval
la cadena que estoy mostrando porque interpreta un número invertido con un 0 al final como un literal octal).puts
devuelve un valor falsey para que el ciclo continúe.fuente
" + #{b} = "
Guarda un byte.-l
si ponemos el número en un archivo sin una nueva línea final y lo canalizamos?Pyth - 19 bytes
Utiliza while loop y un contador. Probablemente haya un algoritmo más pequeño que este, pero esto es bastante corto.
Pruébelo en línea aquí .
fuente
K, 25 bytes
No muy elegante La forma general (
{monad 1}{monad 2}\x
) es el equivalente de K de un ciclo general "while", donde la primera mónada es la condición de detención y la segunda es una función aplicada iterativamente al argumentox
. La primera mónada ({~x~|x}
) es la negación de la clásica frase "is xa palindrome". La segunda mónada concatena una cadena que representa x más el reverso de x, la evalúa y luego vuelve a arrojar el resultado en una cadena con$
.Una ejecución de muestra que muestra resultados intermedios:
Hacer una salida formateada según lo solicitado para la bonificación sería muy torpe y agregaría una cantidad significativa de código.
fuente
CJam, 23 bytes
Todavía solo unos pocos días en CJam, así que estoy bastante feliz de estar al menos en el mismo rango que algunos de los profesionales. :) Utilicé el truco de comparación de cadenas de Martin que también publicó en las sugerencias de CJam. También eché un vistazo a la solución de Dennis para descubrir cómo invertir una cadena.
Explicación:
Pruébelo en línea
fuente
Julia,
129120 bytes * 0.6 = 72Esto crea una función sin nombre que toma un entero como entrada y devuelve un entero, mientras imprime cada paso. Los candidatos de Lychrel tienen un valor de retorno de 262. Para llamar a esto, asígnele un nombre, p. Ej.
f=i->...
.Tenga en cuenta que omitiendo el código relacionado solo con los bonos, esta solución sería de 84 bytes.
Ungolfed + explicación:
Ejemplos:
¡Ahorró 2 bytes gracias a Geobits!
fuente
CJam, 24 bytes
Pruébalo aquí.
Explicación
Para obtener más información sobre por qué
#
se puede usar para verificar la desigualdad de cadenas, consulte este consejo .fuente
#
.Haskell,
6653 bytesEjemplo de uso:
fuente
r=reverse x
? Eso cambiaría su segunda líneaf x|x==r=0|1<2=1+f(show$read x+read(r))
y ahorraría 2 bytes.x
no estaría dentro del alcance. Sin embargo,f x|x==r=0 .... read(r)) where r=reverse x
funcionaría, pero es más largo.Clojure, 94 bytes
Este es mi primer intento de codificar golf, así que dígame si estoy haciendo algo mal.
Con algunos espacios:
Recurrencia simple de la función interna. Se necesitan dos argumentos, el entero
%1
y un índice.%2
. Si%1
es un palíndromo, se devuelve el índice. De lo contrario, la función se llama a sí misma con la suma y el índice incrementado. La función externa inicializa el índice con cero.Una muestra:
fuente
Boost.Build, 304 bytes
No es realmente un idioma. Aún genial
Bastante sencillo, aparte del elaborado truco basado en expresiones regulares que usé para invertir la cadena.
fuente
Rubí, 44
Necesita Ruby 1.9 o superior para la
->
sintaxis lambda.fuente