Apakah saya nomor automorfik?

20

Angka Automorfik adalah angka yang merupakan sufiks kuadratnya dalam basis 10. Ini adalah urutan A003226 dalam OEIS.

Tugas Anda:

Tulis program atau fungsi untuk menentukan apakah input adalah nomor Automorphic.

Memasukkan:

Integer antara 0 dan 10 ^ 12 (inklusif), yang mungkin atau mungkin bukan angka Automorfik.

Keluaran:

Nilai kebenaran / kepalsuan yang menunjukkan apakah input adalah angka Automorfik atau tidak.

Contoh:

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

Mencetak:

Ini adalah , skor terendah dalam byte yang menang.

Gryphon - Pasang kembali Monica
sumber
9
Dengan batas 1e12 berarti pengiriman harus menangani angka hingga 1e24, yang merupakan angka 80-bit. Jika menangani angka yang besar merupakan persyaratan yang sulit, banyak jawaban yang keluar tidak valid.
Dennis
Perlukah kita menangani angka yang mengarah pada masalah presisi dalam bahasa pilihan kita?
Shaggy
Asalkan Anda tidak menyalahgunakan celah standar tentang itu, maka itu akan baik-baik saja.
Gryphon - Pasang kembali Monica
Secara khusus, celah ini
Gryphon - Reinstate Monica
Sudah hari yang panjang dan saya sangat, sangat lelah tetapi komentar Anda membacakan kepada saya sebagai memvalidasi solusi JS saya. Bisakah Anda mengonfirmasi itu? (Tidak ada masalah menghapus jika tidak)
Shaggy

Jawaban:

11

Brachylog , 5 byte

~√a₁?

Cobalah online!

Bagaimana itu bekerja

~√a₁?
~√      the input is the square root of a number
  a₁    whose suffix is
    ?   the input
Biarawati Bocor
sumber
Tidak, dikatakan jika x adalah akhiran dari kuadratnya.
WGroleau
2
√a₁?Kenapa tidak?
totallyhuman
38

Python 2 , 24 byte

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

Cobalah online!

Untuk pertama kalinya dalam sejarah, Python 2 menambahkan sebuah Lke repr dari long adalah fitur daripada bug.

Idenya adalah untuk memeriksa apakah mengatakan, 76^2=5776diakhiri 76dengan memeriksa apakah 76Lsubstring 5776L. Untuk membuat tampilan Luntuk angka yang tidak besar, kita kalikan dengan 1Latau miliki 2Lsebagai eksponen, karena operasi aritmatika dengan panjang dengan menghasilkan panjang.

Tidak
sumber
9

Python 2 , 31 byte

Keluar dengan xnor ... (ini terjadi setiap saat)> <Tapi hei, ini mengejutkan Pythonic untuk .

Orang tidak cenderung mengingat Python str.endswith()...

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

Cobalah online!

benar-benar manusiawi
sumber
Tidak bisakah Anda menggunakan `n*n`untuk mengonversi angka menjadi string?
Downgoat
@Downgoat Itu menekan 'L' pada nomor yang lebih panjang.
totallyhuman
@totallyhuman Poin bagus, saya melewatkan penggunaannya.
isaacg
5

05AB1E , 5 byte

n.s¹å

Cobalah online!

Erik the Outgolfer
sumber
6
Saya akan berubah pendapat jika saya tahu cara kerjanya.
isaacg
Saya kira, nadalah persegi, .sadalah sufiks, ¹adalah input, dan åtes untuk keanggotaan @isaacg
Conor O'Brien
@isaacg Apa yang dikatakan Conor ... tidak punya waktu untuk menambahkan penjelasan.
Erik the Outgolfer
5

Retina , 44 byte

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

Cobalah online!

Ada persis 4 solusi untuk persamaan 10-adic x*x = x.

Biarawati Bocor
sumber
1
Uh? Bukankah semua angka ini solusi yang valid?
Leo
@ Leo Tidak, mereka tidak. Jelas sekali 5*5 != 5. Namun, Anda dapat melihat beberapa pola dalam angka yang Anda tautkan. 4 solusi adalah: 0, 1, ... 59918212890625, ... 40081787109376 (angka p-adic pergi tanpa batas ke kiri ). Angka-angka yang Anda tautkan adalah sufiks dari 4 angka.
Leaky Nun
Oh ok, terima kasih, saya tidak tahu tentang nomor p-adic
Leo
4

Alice , 17 byte

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

Cobalah online!

Tidak menghasilkan apa-apa (yang salah dalam mode Ordinal) atau Jabberwocky(yang tidak kosong dan karenanya benar dalam mode Ordinal; ini juga merupakan nilai string kebenaran kanonik).

Penjelasan

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

Ini adalah sedikit modifikasi dari kerangka umum untuk program mode ordinal linier. Di /tengah digunakan untuk memiliki satu operator dalam mode Kardinal di antara (yang *) dan kemudian kita perlu #melewati itu dalam mode Ordinal dalam perjalanan kembali. Program linear adalah:

i..*.QLzno@

Mari kita lalui itu:

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
sumber
4

Mathematica, 31 byte

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

Cobalah online! Matematika mencetak pesan tambahan tetapi jawabannya benar

J42161217
sumber
4

Python 2, 37 33 30 29 byte

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

Disimpan 4 byte berkat @LeakyNun. Disimpan 3 byte dengan memperhatikan bahwa input lebih rendah dari 10 ^ 12 sehingga ntidak diakhiri dengan "L". Disimpan 1 byte berkat @ Dennis karena saya salah hitung sejak awal.

Cobalah online! (TIO link milik @Dennis).

Nore
sumber
3

C (gcc) , 57 byte

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

Berdasarkan jawaban @ betseg, ini adalah fungsi yang mengembalikan 1 atau 0 . Ini menghasilkan keluaran sampah ke STDOUT, yang diizinkan secara default .

Skor tersebut berisi +4 byte untuk flag compiler -lm.

Cobalah online!

Dennis
sumber
3

Ruby, 22 byte

->n{"#{n*n}"=~/#{n}$/}

Cobalah online!

epidemi
sumber
3

C # (.NET Core) , 47 byte

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

Cobalah online!

kakkarot
sumber
Tidak mungkin untuk perubahan $"{n}"ke n+""? Juga, dapatkah Anda menambahkan tautan TryItOnline ? Oh, dan ini potongan, bukan fungsi / program. Jadi, Anda harus menambahkan n=>di depannya.
Kevin Cruijssen
1
@KevinCruijssen Selesai! Apakah mungkin untuk menyederhanakan lebih jauh? TIL Anda bisa mengonversi int ke string menggunakan n+"". Terima kasih!
kakkarot
Anda tidak memerlukan bool f(long n)atau mengikuti semi-kolon untuk jawaban lambda di C #, Java, dll. Cukup n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")sudah. :) Dan saya hampir lupa: Selamat datang di PPCG!
Kevin Cruijssen
@KevinCruijssen Terima kasih!
kakkarot
Sama-sama! :) Oh, dan ini konverter TIO-link Anda hanya menggunakann=> , dengan menggunakan a System.Func.
Kevin Cruijssen
3

Arang , 12 11 byte

I¬⌕⮌IXIθ²⮌θ

Cobalah online!

Kembali Falsesebagai falseydan Truesebagai truthy.

  • 1 byte disimpan berkat ASCII-only! (Bagaimana saya bisa melewatkan Powerfungsinya?)
Charlie
sumber
Ini mengembalikan 0untuk 10,, 100... 1untuk 50, 60... 2untuk 760, 3792...
Neil
@Neil diperbaiki sekarang, terima kasih!
Charlie
2
Saya pikir Charcoal hanya baik untuk seni ASCII. ಠ_ಠ
totallyhuman
11 byte
ASCII
@totallyhuman Masih, lihat semua pegolf normal dengan <6 byte solusi
ASCII-satunya
2

JavaScript (ES6), 23 byte

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

Cobalah

Tulis Cuplikan ini di ponsel saya, jadi harap edit jika tidak berfungsi dengan benar.

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>

Shaggy
sumber
Ini gagal untuk 212890625 karena masalah presisi.
Dennis
Terima kasih telah menunjukkannya, @ Dennis; ini adalah quicky sementara pada istirahat asap jadi saya (bodohnya) hanya memeriksa kasus uji. Akan meminta klarifikasi tentang kesalahan presisi dan menghapus ketika saya kembali ke komputer, jika perlu.
Shaggy
2

Jelly , 6 byte

²ṚwṚ⁼1

Cobalah online!

Erik the Outgolfer
sumber
Kerja bagus mengalahkan saya.
Leaky Nun
@ LeakyNun Dan aku bahkan akan mengikat Brachylog jika aku bisa menggunakan ...
Erik the Outgolfer
2

Kotlin, 36 byte

fun a(i:Int)="${i*i}".endsWith("$i")
Weston
sumber
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;}

Cobalah online!

betseg
sumber
2
Dapat digunakan n*nuntuk pow(n,2)dan menyimpan 5 byte.
Noodle9
2

R, 28 byte

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

Menciptakan fungsi:

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

Mengambil modulus x^2sedemikian rupa sehingga kita menyimpan digit terakhir, yang kita bandingkan x.

JAD
sumber
1

Retina , 47 33 byte

14 byte berkat Martin Ender.

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

Cobalah online!

Biarawati Bocor
sumber
Saya perlu belajar $%...
Neil
1

PHP , 41 byte

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

PHP Sandbox Online

PHP , 42 byte

tanpa Regex

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

PHP , 44 byte

Gunakan jarak levenshtein

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

Dyvil , 26 byte

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

Pemakaian:

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

Batch, 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))

Algoritma hanya dibatasi oleh tipe integer yang digunakan untuk variabel. Dalam kasus Batch, ini adalah bilangan bulat bertanda 32-bit, jadi maksimumnya adalah 2147483647. Bekerja dengan menguji n dan n-1 untuk kekuatan yang diperlukan 2 dan 5 sebagai faktor. (Kecuali jika n adalah 0 atau 1, n dan n-1 masing-masing memiliki satu faktor.)

Neil
sumber
1

> <> , 30 byte

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

Cobalah online , atau tonton di taman bermain ikan !

Mengasumsikan nomor input x sudah ada di tumpukan.

Penjelasan: Ikan mengambil hasil bagi x 2 dengan meningkatkan kekuatan 10, dan menghitung berapa kali ini sama dengan x . Ketika kekuatan 10 menjadi lebih besar dari x , ia mencetak jumlah dan berhenti. Hitungannya adalah 1 jika x adalah automorfik, dan 0 jika tidak.

Bukan pohon
sumber
1

Pyth , 10 9 byte

-1 byte terima kasih kepada isaacg .

x_`^vz2_z

Mengembalikan 0 ketika nomor tersebut automorfik, apa pun jika tidak.

Uji secara online!

Penjelasan

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
sumber
1
`dikonversi ke string.
isaacg
0

Perl 6 , 15 byte

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

Cobalah online!

Mengembalikan objek Pencocokan yang sebenarnya untuk input automorfik, dan nilai Nil palsu untuk angka lainnya.

Sean
sumber
0

Clojure, 59 byte

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

Ini sepertinya terlalu bertele-tele.

NikoNyrh
sumber
Kenapa tidak pergi saja #(.endsWith(str(* % %))(str %))?
cliffroot
Oh benar, sangat mudah untuk melupakan Java built-in.
NikoNyrh
0

MATL , 10 byte

UUVG36hXXn

Ini berfungsi untuk angka hingga floor(sqrt(2^53)), sesuai doublebatasan presisi.

Output adalah angka positif (yang benar) jika automorfik, atau kosong (yang salah) jika tidak.

Cobalah online!

Penjelasan

Lucu bahwa jawaban ini menggunakan dua versi overload U: dengan input string yang dievaluasi sebagai angka, dan dengan input angka menghitung kuadrat.

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
sumber