Sono un numero automorfo?


20

Un numero automorfo è un numero che è un suffisso del suo quadrato nella base 10. Questa è la sequenza A003226 nell'OEIS.

Il tuo compito:

Scrivi un programma o una funzione per determinare se un input è un numero automorfo.

Ingresso:

Un numero intero compreso tra 0 e 10 ^ 12 (incluso), che può essere o meno un numero automorfo.

Produzione:

Un valore di verità / falsità che indica se l'ingresso è o meno un numero automorfo.

Esempi:

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

punteggio:

Questo è , il punteggio più basso in byte vince.


9
Tra il limite di 1e12, gli invii dovranno gestire numeri fino a 1e24, che è un numero di 80 bit. Se la gestione di numeri così grandi è un requisito difficile, molte delle risposte in uscita non sono valide.
Dennis,

Dobbiamo gestire i numeri che porterebbero a problemi di precisione nella lingua prescelta?
Shaggy,

A condizione che tu non abusi della scappatoia standard a riguardo, allora andrebbe bene.
Gryphon - Ripristina Monica il


È stata una giornata molto lunga e sono molto, molto stanco, ma i tuoi commenti mi leggono come una convalida della mia soluzione JS. Potresti confermarlo? (Nessun problema con l'eliminazione in caso contrario)
Shaggy

Risposte:



38

Python 2 , 24 byte

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

Provalo online!

Per la prima volta nella storia, l'aggiunta di Python 2 Lal repr of longs è una caratteristica piuttosto che un bug.

L'idea è di verificare se si dice, 76^2=5776finisce 76controllando se 76Lè una sottostringa di 5776L. Per far Lapparire i numeri non enormi, moltiplichiamo 1Lo abbiamo 2Lcome esponente, poiché un'operazione aritmetica con un long con produce un long.


9

Python 2 , 31 byte

Out-golfed by xnor ... (questo accade ogni volta)> <Ma hey, è sorprendentemente Pythonic per il .

Le persone non tendono a ricordare che Python ha str.endswith()...

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

Provalo online!


Non puoi usare `n*n`per convertire il numero in stringa?
Downgoat,

@Downgoat che mette una "L" su numeri più lunghi.
totalmente umano il

@totallyhuman Un buon punto, ho perso il suo uso.
Isaacg,


5

Retina , 44 byte

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

Provalo online!

Esistono esattamente 4 soluzioni all'equazione 10-adica x*x = x.


1
Uh? Tutti questi numeri non sono soluzioni valide?
Leo,

@Leo No, non lo sono. Ovviamente 5*5 != 5. Tuttavia, puoi notare alcuni schemi nei numeri a cui ti sei collegato. Le 4 soluzioni sono: 0, 1, ... 59918212890625, ... 40081787109376 (i numeri p-adici vanno infinitamente a sinistra ). I numeri a cui sei collegato sono suffissi dei 4 numeri.
Leaky Nun,

Oh ok, grazie, non sapevo dei numeri p-adici
Leo,

4

Alice , 17 byte

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

Provalo online!

Non genera nulla (che è falso in modalità Ordinale) o Jabberwocky(che non è vuoto e quindi verità in modalità Ordinale; è anche il valore canonico della stringa di verità).

Spiegazione

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

Questa è una leggera modifica del quadro generale per i programmi di modalità Ordinale lineare. Il /mezzo è usato per avere un solo operatore in modalità Cardinale tra (il *) e quindi abbiamo bisogno #di saltarlo in modalità Ordinale sulla via del ritorno. Il programma lineare è quindi:

i..*.QLzno@

Passiamo attraverso quello:

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

Mathematica, 31 byte

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

Provalo online! La matematica stampa un messaggio aggiuntivo ma la risposta è corretta


4

Python 2, 37 33 30 29 byte

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

Salvato 4 byte grazie a @LeakyNun. Salvato 3 byte notando che l'ingresso è inferiore a 10 ^ 12, quindi nnon termina con una "L". Salvato 1 byte grazie a @Dennis perché ho sbagliato a contare in primo luogo.

Provalo online! (Link TIO per gentile concessione di @Dennis).




3

C # (.NET Core) , 47 byte

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

Provalo online!


Non è possibile passare $"{n}"a n+""? Inoltre, potresti forse aggiungere un link TryItOnline ? Oh, e questo è uno snippet, non una funzione / programma. Quindi dovresti aggiungere n=>di fronte.
Kevin Cruijssen,

1
@KevinCruijssen Fatto! È possibile semplificare ulteriormente? TIL è possibile convertire un int in stringa usando n+"". Grazie!
Kakkarot,

Non è necessario il punto bool f(long n)o virgola finale per le risposte lambda in C #, Java, ecc. n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")È sufficiente. :) E quasi dimenticavo: benvenuto in PPCG!
Kevin Cruijssen,

@KevinCruijssen Grazie!
Kakkarot,

Prego! :) Oh, ed ecco il tuo convertitore TIO-link da usare solon=> , usando a System.Func.
Kevin Cruijssen,

3

Carbone , 12 11 byte

I¬⌕⮌IXIθ²⮌θ

Provalo online!

Restituisce Falsecome falseye Truecome truthy.

  • 1 byte salvato grazie solo a ASCII! (Come potrei perdere la Powerfunzione?)

Ciò restituisce 0per 10, 100, ... 1per 50, 60... 2per 760, 3792...
Neil

@Neil risolto ora, grazie!
Charlie,

2
Ho pensato che il carbone fosse buono solo per l'arte ASCII. ಠ_ಠ
totalmente umano il


@totallyhuman Lo è ancora, guarda tutti i normali golflang con soluzioni <6 byte
ASCII-only

2

JavaScript (ES6), 23 byte

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

Provalo

Ho scritto questo frammento sul mio telefono, quindi modifica se non funziona correttamente.

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>


Questo non riesce per 212890625 a causa di problemi di precisione.
Dennis,

Grazie per averlo sottolineato, @Dennis; questo è stato veloce durante una pausa fumo, quindi ho (stupidamente) controllato solo i casi di test. Chiederà chiarimenti sugli errori di precisione ed elimina quando torno a un computer, se necessario.
Shaggy,


2

Kotlin, 36 byte

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

2

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

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

Provalo online!


2
Può usare n*nper pow(n,2)e risparmiare 5 byte.
Noodle9,

2

R, 28 byte

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

Crea una funzione:

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

Prende il modulo in x^2modo tale da mantenere le ultime cifre, a cui confrontiamo x.






1

Dyvil , 26 byte

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

Uso:

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

1

Lotto, 122 byte

@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'algoritmo è limitato solo dal tipo intero utilizzato per le variabili. Nel caso di Batch, si tratta di numeri interi con segno a 32 bit, quindi il massimo è 2147483647. Funziona testando sia n che n-1 per le potenze necessarie di 2 e 5 come fattori. (Tranne quando n è 0 o 1, n e n-1 avranno un fattore ciascuno.)


1

> <> , 30 byte

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

Provalo online o guardalo nel parco giochi per pesci !

Presuppone il numero di input x sia già nello stack.

Spiegazione: Il pesce prende il quoziente di x 2 aumentando i poteri di 10 e conta quante volte questo equivale a x . Quando la potenza di 10 diventa maggiore di x , stampa il conteggio e si ferma. Il conteggio sarà 1 se x è automorfo e 0 se non lo è.



1

Pyth , 10 9 byte

-1 byte grazie a isaacg .

x_`^vz2_z

Restituisce 0 quando il numero è automorfo, altrimenti se non lo è.

Provalo online!

spiegazioni

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
`viene convertito in stringa.
Isaacg,


0

Perl 6 , 15 byte

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

Provalo online!

Restituisce un oggetto Match veritiero per input automorfi e un valore Null errato per altri numeri.


0

Clojure, 59 byte

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

Questo sembra eccessivamente prolisso.


Perché non andare semplicemente con #(.endsWith(str(* % %))(str %))?
cliffroot,

Oh vero, è così facile dimenticare i built-in Java.
NikoNyrh,

0

MATL , 10 byte

UUVG36hXXn

Funziona con numeri fino a floor(sqrt(2^53)), come dadouble limiti di precisione.

L'output è un numero positivo (che è vero) se automorfo, o vuoto (che è falso) in caso contrario.

Provalo online!

Spiegazione

Divertente che questa risposta usi le due versioni sovraccaricate di U: con l'input della stringa valuta come un numero e con l'input del numero calcola il quadrato.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.