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

Gryphon - Restablece a Monica
fuente
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
Específicamente, esta escapatoria
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:

11

Brachylog , 5 bytes

~√a₁?

Pruébalo en línea!

Cómo funciona

~√a₁?
~√      the input is the square root of a number
  a₁    whose suffix is
    ?   the input
Monja permeable
fuente
No, dice que si x es un sufijo de su cuadrado.
WGroleau
2
√a₁?Por qué no?
Totalmente humano el
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.

xnor
fuente
9

Python 2 , 31 bytes

Out-golfed by xnor ... (esto sucede cada vez)> <Pero bueno, sorprendentemente es Pythonic para .

La gente no tiende a recordar que Python tiene str.endswith()...

lambda n:str(n*n).endswith(`n`)

Pruébalo en línea!

totalmente humano
fuente
¿No puedes usar `n*n`para convertir un número en una cadena?
Downgoat
@Downgoat Eso agrega una 'L' a números más largos.
totalmente humano
@totallyhuman Buen punto, perdí su uso.
isaacg
5

05AB1E , 5 bytes

n.s¹å

Pruébalo en línea!

Erik el Outgolfer
fuente
66
Votaría si supiera cómo funciona.
isaacg
Supongo que nes cuadrado, .stiene sufijos, ¹es la entrada y åprueba la membresía @isaacg
Conor O'Brien
@isaacg Lo que dijo Conor ... no tuvo tiempo de agregar una explicación.
Erik the Outgolfer
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.

Monja permeable
fuente
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.
Martin Ender
fuente
4

Mathematica, 31 bytes

Mod[#^2,10^IntegerLength@#]==#&

Pruébalo en línea! Matemáticas imprime un mensaje extra pero la respuesta es correcta

J42161217
fuente
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).

nore
fuente
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!

Dennis
fuente
3

C # (.NET Core) , 47 bytes

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

Pruébalo en línea!

kakkarot
fuente
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?)
Charlie
fuente
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
11 bytes
solo ASCII
@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>

Lanudo
fuente
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

Jalea , 6 bytes

²ṚwṚ⁼1

Pruébalo en línea!

Erik el Outgolfer
fuente
Buen trabajo superándome.
Leaky Nun
@LeakyNun Y hasta habría vinculado a Brachylog si hubiera podido usar ...
Erik the Outgolfer
2

Kotlin, 36 bytes

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

C, 77 + 4 ( -lm) = 81 bytes

#import<tgmath.h>
i;f(long double n){i=fmod(n*n,pow(10,(int)log10(n)+1))==n;}

Pruébalo en línea!

Betseg
fuente
2
Se puede usar n*npara pow(n,2)y guardar 5 bytes.
Noodle9
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.

JAD
fuente
1

Retina , 47 33 bytes

14 bytes gracias a Martin Ender.

.+
$*
$
¶$`
\G1
$%_
M%`1
(.+)¶\1$

Pruébalo en línea!

Monja permeable
fuente
Necesito aprender $%...
Neil
1

PHP , 41 bytes

<?=preg_match("#$argn$#",bcpow($argn,2));

PHP Sandbox en línea

PHP , 42 bytes

sin Regex

<?=strtr(bcpow($argn,2),[$argn=>X])[-1]>A;

PHP , 44 bytes

Usa la distancia levenshtein

<?=!levenshtein($argn,bcpow($argn,2),0,1,1);
Jörg Hülsermann
fuente
1

Dyvil , 26 bytes

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

Uso:

let f: int->boolean = x=>"\(x*x)".endsWith"\(x)"
print(f 20) // false
Choque suave
fuente
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).

Neil
fuente
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.

No un arbol
fuente
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
Jim
fuente
1
`se convierte en cadena.
isaacg
0

Perl 6 , 15 bytes

{$^x²~~/$^x$/}

Pruébalo en línea!

Devuelve un objeto Match verdadero para entradas automórficas y un valor Nulo falso para otros números.

Sean
fuente
0

Clojure, 59 bytes

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

Esto parece demasiado detallado.

NikoNyrh
fuente
¿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
Luis Mendo
fuente