Suis-je un nombre automorphe?

20

Un nombre automorphe est un nombre qui est un suffixe de son carré en base 10. Il s'agit de la séquence A003226 dans l'OEIS.

Ta tâche:

Écrivez un programme ou une fonction pour déterminer si une entrée est un nombre automorphe.

Contribution:

Un entier compris entre 0 et 10 ^ 12 (inclus), qui peut ou non être un nombre automorphe.

Production:

Valeur de vérité / fausse indiquant si l'entrée est ou non un nombre automorphe.

Exemples:

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

Notation:

C'est le , le score le plus bas en octets gagne.

Gryphon - Rétablir Monica
la source
9
Btw la limite de 1e12 signifie que les soumissions devront gérer des nombres jusqu'à 1e24, qui est un nombre de 80 bits. Si la gestion de nombres aussi importants est une exigence difficile, la plupart des réponses existantes ne sont pas valides.
Dennis
Avons-nous besoin de gérer des nombres qui entraîneraient des problèmes de précision dans la langue choisie?
Shaggy
À condition de ne pas abuser de l'échappatoire standard à ce sujet, ce serait bien.
Gryphon - Réintègre Monica le
Plus précisément, cette échappatoire
Gryphon - Rétablir Monica le
La journée a été longue et je suis très, très fatiguée, mais vos commentaires me semblent valider ma solution JS. Pourriez-vous confirmer cela? (Aucun problème à supprimer sinon)
Shaggy

Réponses:

11

Brachylog , 5 octets

~√a₁?

Essayez-le en ligne!

Comment ça fonctionne

~√a₁?
~√      the input is the square root of a number
  a₁    whose suffix is
    ?   the input
Leaky Nun
la source
Non, il indique si x est un suffixe de son carré.
WGroleau
2
√a₁?Pourquoi pas?
2017 totalement humain
38

Python 2 , 24 octets

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

Essayez-le en ligne!

Pour la première fois dans l'histoire, Python 2 ajoutant un Là la reproduction des longs est une fonctionnalité plutôt qu'un bug.

L'idée est de vérifier si disons, 76^2=5776se termine en 76vérifiant si 76Lest une sous-chaîne de 5776L. Pour faire Lapparaître les nombres non énormes, nous multiplions par 1Lou avons 2Lcomme exposant, car une opération arithmétique avec un long avec produit un long.

xnor
la source
9

Python 2 , 31 octets

Hors-golf par xnor ... (cela arrive à chaque fois)> <Mais bon, c'est étonnamment Pythonic pour le .

Les gens n'ont pas tendance à se souvenir que Python a str.endswith()...

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

Essayez-le en ligne!

totalement humain
la source
Ne pouvez-vous pas utiliser `n*n`pour convertir un nombre en chaîne?
Downgoat
@Downgoat qui cloue un «L» sur des nombres plus longs.
totalement humain le
@totallyhuman Bon point, j'ai raté son utilisation.
isaacg
5

05AB1E , 5 octets

n.s¹å

Essayez-le en ligne!

Erik le Outgolfer
la source
6
Je voterais si je savais comment cela fonctionnait.
isaacg
Je suppose, nest carré, .sest des suffixes, ¹est l'entrée et åteste l'adhésion @isaacg
Conor O'Brien
@isaacg Ce que Conor a dit ... n'a pas eu le temps d'ajouter d'explication.
Erik the Outgolfer
5

Rétine , 44 octets

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

Essayez-le en ligne!

Il existe exactement 4 solutions à l'équation 10-adique x*x = x.

Leaky Nun
la source
1
Euh? Tous ces chiffres ne sont-ils pas des solutions valables?
Leo
@Leo Non, ils ne le sont pas. Evidemment 5*5 != 5. Cependant, vous pouvez remarquer une tendance dans les numéros auxquels vous avez lié. Les 4 solutions sont: 0, 1, ... 59918212890625, ... 40081787109376 (les nombres p-adiques vont infiniment vers la gauche ). Les nombres que vous avez liés sont des suffixes des 4 nombres.
Leaky Nun
Oh ok, merci, je ne connaissais pas les nombres p-adiques
Leo
4

Alice , 17 octets

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

Essayez-le en ligne!

Ne produit rien (ce qui est faux en mode Ordinal) ou Jabberwocky(qui est non vide et donc véridique en mode Ordinal; c'est aussi la valeur de chaîne véridique canonique).

Explication

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

Il s'agit d'une légère modification du cadre général des programmes en mode Ordinal linéaire. Le /au milieu est utilisé pour avoir un seul opérateur en mode Cardinal entre (le *) et ensuite nous devons le #sauter en mode Ordinal au retour. Le programme linéaire est alors:

i..*.QLzno@

Passons par là:

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
la source
4

Mathematica, 31 octets

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

Essayez-le en ligne! Les mathématiques impriment un message supplémentaire mais la réponse est correcte

J42161217
la source
4

Python 2, 37 33 30 29 octets

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

4 octets enregistrés grâce à @LeakyNun. Enregistré 3 octets en remarquant que l'entrée est inférieure à 10 ^ 12 donc nne se termine pas par un "L". Enregistré 1 octet grâce à @Dennis parce que j'ai mal compté en premier lieu.

Essayez-le en ligne! (Lien TIO avec l'aimable autorisation de @Dennis).

non
la source
3

C (gcc) , 57 octets

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

D'après la réponse de @ betseg, il s'agit d'une fonction qui renvoie 1 ou 0 . Il produit une sortie poubelle vers STDOUT, ce qui est autorisé par défaut .

Le score contient +4 octets pour l'indicateur du compilateur -lm.

Essayez-le en ligne!

Dennis
la source
3

C # (.NET Core) , 47 octets

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

Essayez-le en ligne!

kakkarot
la source
N'est-il pas possible de passer $"{n}"à n+""? Pouvez-vous également ajouter un lien TryItOnline ? Oh, et ceci est un extrait, pas une fonction / programme. Vous devez donc ajouter n=>devant.
Kevin Cruijssen
1
@KevinCruijssen Terminé! Est-il possible de simplifier encore plus? TIL vous pouvez convertir un int en chaîne en utilisant n+"". Merci!
kakkarot
Vous n'avez pas besoin bool f(long n)ou point-virgule fuite des réponses lambda en C #, Java, etc. Juste n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")suffit. :) Et j'ai presque oublié: Bienvenue chez PPCG!
Kevin Cruijssen
@KevinCruijssen Merci!
kakkarot
Vous êtes les bienvenus! :) Oh, et voici votre convertisseur TIO-link à utiliser simplementn=> , en utilisant a System.Func.
Kevin Cruijssen
3

Fusain , 12 11 octets

I¬⌕⮌IXIθ²⮌θ

Essayez-le en ligne!

Renvoie au Falsefur falseyet à Truemesure truthy.

  • 1 octet enregistré grâce à ASCII uniquement! (Comment pourrais-je manquer la Powerfonction?)
Charlie
la source
Ce rendement 0pour 10, 100... 1pour 50, 60... 2pour 760, 3792...
Neil
@Neil corrigé maintenant, merci!
Charlie
2
Je pensais que le fusain n'était bon que pour l'art ASCII. ಠ_ಠ
totalement humain
11 octets
ASCII uniquement
@totallyhuman C'est toujours le cas, regardez tous les golflangs normaux avec des solutions <6 octets
ASCII uniquement
2

JavaScript (ES6), 23 octets

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

Essayez-le

J'ai écrit cet extrait sur mon téléphone, veuillez donc le modifier s'il ne fonctionne pas correctement.

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>

Hirsute
la source
Cela échoue pour 212890625 en raison de problèmes de précision.
Dennis
Merci de l'avoir signalé, @Dennis; cela a été rapide pendant une pause-fumée, donc je n'ai (stupidement) vérifié que les cas de test. Va demander des éclaircissements sur les erreurs de précision et les supprimer lorsque je reviens à un ordinateur, si nécessaire.
Shaggy
2

Gelée , 6 octets

²ṚwṚ⁼1

Essayez-le en ligne!

Erik le Outgolfer
la source
Beau travail me surpassant.
Leaky Nun
@LeakyNun Et j'aurais même attaché Brachylog si j'avais pu utiliser ...
Erik the Outgolfer
2

Kotlin, 36 octets

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

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

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

Essayez-le en ligne!

betseg
la source
2
Peut utiliser n*npour pow(n,2)et économisez 5 octets.
Noodle9
2

R, 28 octets

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

Crée une fonction:

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

Prend le module de x^2telle sorte que nous gardons les derniers chiffres, auxquels nous comparons x.

JAD
la source
1

Rétine , 47 33 octets

14 octets grâce à Martin Ender.

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

Essayez-le en ligne!

Leaky Nun
la source
J'ai besoin d'apprendre $%...
Neil
1

PHP , 41 octets

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

PHP Sandbox Online

PHP , 42 octets

sans regex

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

PHP , 44 octets

Utilisez la distance levenshtein

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

Dyvil , 26 octets

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

Usage:

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

Lot, 122 octets

@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))

L'algorithme n'est limité que par le type entier utilisé pour les variables. Dans le cas de Batch, il s'agit d'entiers signés 32 bits, donc le maximum est 2147483647. Fonctionne en testant à la fois n et n-1 pour les puissances nécessaires de 2 et 5 comme facteurs. (Sauf lorsque n est 0 ou 1, n et n-1 auront chacun un facteur.)

Neil
la source
1

> <> , 30 octets

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

Essayez-le en ligne ou regardez-le au terrain de pêche !

Suppose que le numéro d'entrée x est déjà sur la pile.

Explication: Le poisson prend le quotient de x 2 en augmentant les puissances de 10 et compte combien de fois cela équivaut à x . Lorsque la puissance de 10 devient supérieure à x , elle imprime le nombre et s'arrête. Le compte sera 1 si x est automorphe et 0 s'il ne l'est pas.

Pas un arbre
la source
1

Pyth , 10 9 octets

-1 octet grâce à isaacg .

x_`^vz2_z

Renvoie 0 lorsque le nombre est automorphe, rien d'autre s'il ne l'est pas.

Testez-le en ligne!

Explications

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
la source
1
`est converti en chaîne.
isaacg
0

Perl 6 , 15 octets

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

Essayez-le en ligne!

Renvoie un objet Match véridique pour les entrées automorphes et une valeur fausse Nil pour les autres nombres.

Sean
la source
0

Clojure, 59 octets

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

Cela semble trop verbeux.

NikoNyrh
la source
Pourquoi ne pas simplement y aller #(.endsWith(str(* % %))(str %))?
cliffroot
Oh, c'est vrai, il est si facile d'oublier les fonctions intégrées Java.
NikoNyrh
0

MATL , 10 octets

UUVG36hXXn

Cela fonctionne pour les nombres jusqu'à floor(sqrt(2^53)), selon doubleles limitations de précision.

La sortie est un nombre positif (qui est vrai) si elle est automorphe, ou vide (qui est faux) sinon.

Essayez-le en ligne!

Explication

C'est drôle que cette réponse utilise les deux versions surchargées de U: avec une entrée de chaîne, elle évalue un nombre, et avec une entrée de nombre, elle calcule le carré.

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
la source