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.


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


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:



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.


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!


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

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.


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.


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


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!



3

C # (.NET Core) , 47 octets

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

Essayez-le en ligne!


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

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


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


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

Kotlin, 36 octets

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

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!


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.






1

Dyvil , 26 octets

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

Usage:

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

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


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.



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

1
`est converti en chaîne.
isaacg



0

Clojure, 59 octets

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

Cela semble trop verbeux.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.