¿Soy un número automórfico?


20

Un número automórfico es un número que es un sufijo de su cuadrado en la base 10. Esta es la secuencia A003226 en el OEIS.

Tu tarea:

Escriba un programa o función para determinar si una entrada es un número Automorphic.

Entrada:

Un número entero entre 0 y 10 ^ 12 (inclusive), que puede o no ser un número Automorphic.

Salida:

Un valor verdadero / falso que indica si la entrada es o no un número Automorphic.

Ejemplos:

0           -> truthy
1           -> truthy
2           -> falsy
9376        -> truthy
8212890625  -> truthy

Puntuación:

Este es el , gana la puntuación más baja en bytes.


99
Por cierto, el límite de 1e12 significa que las presentaciones deberán manejar números hasta 1e24, que es un número de 80 bits. Si manejar números tan grandes es un requisito difícil, muchas de las respuestas existentes no son válidas.
Dennis

¿Necesitamos manejar números que conduzcan a problemas de precisión en nuestro idioma elegido?
Shaggy

Siempre que no abuses de la laguna estándar sobre eso, entonces estaría bien.
Gryphon - Restablece a Monica el


Ha sido un día muuuy largo y estoy muy, muy cansado, pero sus comentarios me leyeron como validando mi solución JS. ¿Podrías confirmar eso? (Sin problemas de eliminación si no)
Shaggy

Respuestas:



38

Python 2 , 24 bytes

lambda n:`n*1L`in`n**2L`

Pruébalo en línea!

Por primera vez en la historia, la adición de Python 2 La la repetición de longs es una característica más que un error.

La idea es verificar si decir, 76^2=5776termina 76verificando si 76Les una subcadena de 5776L. Para hacer Laparecer los números no grandes, multiplicamos por 1Lo tenemos 2Lcomo exponente, ya que una operación aritmética con un largo con produce un largo.




5

Retina , 44 bytes

$
;918212890625;81787109376;0;1;
^(\d+;).*\1

Pruébalo en línea!

Hay exactamente 4 soluciones a la ecuación de 10 adic x*x = x.


1
Uh ¿No son todos estos números soluciones válidas?
Leo

@Leo No, no lo son. Obviamente 5*5 != 5. Sin embargo, puede notar algún patrón en los números a los que se vinculó. Las 4 soluciones son: 0, 1, ... 59918212890625, ... 40081787109376 (los números de p-adic van infinitamente a la izquierda ). Los números a los que se vinculó son sufijos de los 4 números.
Leaky Nun

Oh ok, gracias, no sabía sobre los números de p-adic
Leo

4

Alice , 17 bytes

/o.z/#Q/
@in.*.L\

Pruébalo en línea!

No genera nada (que es falso en el modo Ordinal) o Jabberwocky(que no está vacío y, por lo tanto, es verdadero en el modo Ordinal; también es el valor de cadena de verdad canónico).

Explicación

/.../#./
....*..\

Esta es una ligera modificación del marco general para los programas lineales en modo ordinal. El /en el medio se usa para tener un solo operador en modo Cardinal entre (the *) y luego necesitamos #saltearlo en modo Ordinal en el camino de regreso. El programa lineal es entonces:

i..*.QLzno@

Veamos eso:

i    Read all input as a string and push it to the stack.
..   Make two copies.
*    This is run in Cardinal mode, so it implicitly converts the top two
     copies to their integer value and multiplies them to compute the square.
.    Implicitly convert the square back to a string and make a copy of it.
Q    Reverse the stack to bring the input on top of the two copies of its square.
L    Shortest common supersequence. This pops the input and the square from
     the top of the stack and pushes the shortest string which begins with
     the square and ends with the input. Iff the square already ends with the
     input, this gives us the square, otherwise it gives us some longer string.
z    Drop. Pop the SCS and the square. If the square contains the SCS (which
     would mean they're equal), this removes everything up to the SCS from
     the square. In other words, if the SCS computation left the square
     unchanged, this gives us an empty string. Otherwise, it gives us back
     the square.
n    Logical not. Turns the empty string into "Jabberwocky" and everything
     else into an empty string.
o    Print the result.
@    Terminate the program.


4

Python 2, 37 33 30 29 bytes

lambda n:n*~-n%10**len(`n`)<1

Guardado 4 bytes gracias a @LeakyNun. Se guardaron 3 bytes al notar que la entrada es inferior a 10 ^ 12, por lo nque no termina con una "L". Ahorré 1 byte gracias a @Dennis porque en primer lugar conté mal.

Pruébalo en línea! (Enlace TIO cortesía de @Dennis).


3

C (gcc) , 57 bytes

f(__int128 n){n=n*n%(long)pow(10,printf("%u",n))==n;}

Según la respuesta de @ betseg, esta es una función que devuelve 1 o 0 . Produce salida de basura a STDOUT, que está permitida por defecto .

La puntuación contiene +4 bytes para el indicador del compilador -lm.

Pruébalo en línea!



3

C # (.NET Core) , 47 bytes

n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")

Pruébalo en línea!


No es posible cambiar $"{n}"a n+""? Además, ¿podría agregar un enlace TryItOnline ? Ah, y este es un fragmento, no una función / programa. Por lo tanto, debe agregar n=>delante de él.
Kevin Cruijssen

1
@KevinCruijssen Hecho! ¿Es posible simplificar aún más? TIL puede convertir un int a string usando n+"". ¡Gracias!
kakkarot

No necesita el punto bool f(long n)y coma final para las respuestas lambda en C #, Java, etc. Simplemente n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")es suficiente. :) Y casi se me olvida: ¡Bienvenido a PPCG!
Kevin Cruijssen

@KevinCruijssen ¡Gracias!
kakkarot

¡De nada! :) Ah, y aquí está tu convertidor TIO-link para usar solon=> , usando a System.Func.
Kevin Cruijssen

3

Carbón , 12 11 bytes

I¬⌕⮌IXIθ²⮌θ

Pruébalo en línea!

Devuelve Falseas falseyy Trueas truthy.

  • ¡1 byte guardado gracias a ASCII-only! (¿Cómo podría perder la Powerfunción?)

Esto devuelve 0para 10, 100, ... 1para 50, 60... 2para 760, 3792...
Neil

@Neil arreglado ahora, gracias!
Charlie

2
Pensé que el carbón solo era bueno para el arte ASCII. ಠ_ಠ
totalmente humano


@totallyhuman Todavía lo es, mira todos los campos de golf normales con soluciones de <6 bytes
solo ASCII

2

JavaScript (ES6), 23 bytes

n=>`${n*n}`.endsWith(n)

Intentalo

Escribí este fragmento en mi teléfono, así que edítelo si no funciona correctamente.

f=
n=>`${n*n}`.endsWith(n)
oninput=_=>o.innerText=f(+i.value);o.innerText=f(i.value=1)
<input id=i type=number><pre id=o>


Esto falla para 212890625 debido a problemas de precisión.
Dennis

Gracias por señalar eso, @Dennis; esto fue rápido durante un descanso para fumar, así que (estúpidamente) solo revisé los casos de prueba. Solicitaré aclaraciones sobre errores de precisión y las eliminaré cuando regrese a una computadora, si es necesario.
Shaggy


2

Kotlin, 36 bytes

fun a(i:Int)="${i*i}".endsWith("$i")


2

R, 28 bytes

pryr::f(x^2%%10^nchar(x)==x)

Crea una función:

function (x) 
x^2%%10^nchar(x) == x

Toma el módulo de x^2tal manera que mantenemos los últimos dígitos, con los cuales los comparamos x.






1

Dyvil , 26 bytes

x=>"\(x*x)".endsWith"\(x)"

Uso:

let f: int->boolean = x=>"\(x*x)".endsWith"\(x)"
print(f 20) // false

1

Lote, 122 bytes

@set/an=%1,t=f=1
:l
@set/at+=t,f*=5,n/=10
@if %n% gtr 0 goto l
@cmd/cset/a"(!(%1%%t)|!(~-%1%%t))&(!(%1%%f)|!(~-%1%%f))

El algoritmo está limitado solo por el tipo entero usado para las variables. En el caso de Batch, se trata de enteros con signo de 32 bits, por lo que el máximo es 2147483647. Funciona probando tanto n como n-1 para las potencias necesarias de 2 y 5 como factores. (Excepto cuando n es 0 o 1, n y n-1 tendrán un factor cada uno).


1

> <> , 30 bytes

1&0}\{n;
:&(?\:::*&a*:&%={+}:&

¡Pruébelo en línea o mírelo en el parque de peces !

Asume que el número de entrada x ya está en la pila.

Explicación: El pez toma el cociente de x 2 aumentando las potencias de 10, y cuenta cuántas veces es igual a x . Cuando la potencia de 10 es mayor que x , imprime el conteo y se detiene. El recuento será 1 si x es automórfico y 0 si no lo es.



1

Pyth , 10 9 bytes

-1 byte gracias a isaacg .

x_`^vz2_z

Devuelve 0 cuando el número es automorfo, cualquier otra cosa si no lo es.

¡Pruébelo en línea!

Explicaciones

x_`^vz2_z

   ^vz2      # Evaluate the input to a number, compute the square
  `          # Convert the squared number to a string
 _           # Reverse it
x      _z    # Find the index of the first occurrence of the reversed input in the reversed square. That's basically equivalent of doing an endswith() in Python
             # Implicit input of the index. If 0, then the reversed square starts with the reversed input

1
`se convierte en cadena.
isaacg



0

Clojure, 59 bytes

#(apply = true(map =(reverse(str %))(reverse(str(* % %)))))

Esto parece demasiado detallado.


¿Por qué no simplemente ir con #(.endsWith(str(* % %))(str %))?
Cliffroot

Es cierto, es muy fácil olvidarse de las funciones integradas de Java.
NikoNyrh

0

MATL , 10 bytes

UUVG36hXXn

Esto funciona para números hasta floor(sqrt(2^53)), según doublelas limitaciones de precisión.

La salida es un número positivo (que es verdadero) si es automorfo, o vacío (que es falso) si no.

Pruébalo en línea!

Explicación

Es curioso que esta respuesta use las dos versiones sobrecargadas de U: con la entrada de cadena se evalúa como un número, y con la entrada de número calcula el cuadrado.

U      % Implicitly input a string. Evaluate as a number
U      % Square of number
V      % Convert number to string representation
G      % Push input string again
36h    % Post-pend '$'
XX     % Regexp match. Gives cell array of matching substrings.
n      % Number of elements. Implicitly display
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.