Itu Hip menjadi Square

44

Tantangan

Jadi, um, tampaknya, sementara kita memiliki banyak tantangan yang bekerja dengan bilangan kuadrat atau jumlah bentuk lainnya, kita tidak memiliki satu yang hanya bertanya:

Diberikan integer n(di mana n>=0) sebagai input mengembalikan nilai kebenaran jika nkuadrat sempurna atau nilai falsey jika tidak.


Aturan

  • Anda dapat mengambil input dengan cara yang masuk akal, nyaman selama diizinkan oleh aturan I / O standar .
  • Anda tidak perlu menangani input yang lebih besar dari apa yang dapat dipilih oleh bahasa pilihan Anda atau yang akan menyebabkan ketidakakuratan titik mengambang.
  • Output harus menjadi salah satu dari dua nilai yang konsisten truthy / falsey (misalnya, trueatau false, 1atau 0) - truthy jika input adalah persegi sempurna, falsey jika tidak.
  • Ini adalah sehingga jumlah byte terendah menang.

Uji Kasus

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false
Shaggy
sumber
@Neil Saya menyadari kesalahan saya. Saya menarik kembali saran itu, dan alih-alih menawarkan 18014398509481982( 2**54-2), yang dapat direpresentasikan dengan ganda, dan menyebabkan jawaban yang digunakan sqrtgagal.
Mego
@Mego Saya mungkin salah atau hanya salah paham apa yang Anda katakan, tapi saya yakin 2**54-2masih lebih besar daripada yang bisa ditangani dengan aman, setidaknya di JavaScript18014398509481982 > 9007199254740991
Tom
@Mego Saya pikir nilai pembatas adalah 9007199515875288. Ini bukan kuadrat dari 94906267, karena itu tidak mewakili dalam ganda, tetapi jika Anda mengambil akar kuadratnya, maka Anda mendapatkan bilangan bulat itu sebagai hasilnya.
Neil
@ Tom Ketik 2**54-2ke konsol JS, dan bandingkan dengan apa yang Anda dapatkan 18014398509481982(nilai persisnya). JS menampilkan nilai yang tepat, oleh karena 2**54-2itu direpresentasikan dengan ganda. Jika itu masih tidak meyakinkan Anda, ambil data biner 0100001101001111111111111111111111111111111111111111111111111111, tafsirkan sebagai pelampung presisi ganda IEEE-754, dan lihat nilai apa yang Anda dapatkan.
Mego
3
Maaf, teman-teman, pergi makan siang dan ... yah, itu meningkat! Dan di sana saya pikir ini akan menjadi tantangan yang bagus dan sederhana! Apakah menambahkan aturan yang Anda tidak perlu menangani input yang mengarah ke ketidakakuratan titik mengambang dalam bahasa yang Anda pilih akan mencakupnya?
Shaggy

Jawaban:

27

Neim , 2 byte

q𝕚

Penjelasan:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

Ketika saya mengatakan 'tak terbatas' saya maksudkan sampai kita mencapai nilai maksimum long (2 ^ 63-1). Namun, Neim (perlahan) bertransisi menjadi BigIntegers besar yang secara teoritis sangat besar.

Cobalah!

Okx
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis
Menarik. Jadi, apakah ini pra-buffer daftar atau itu generator / iterator yang terus memeriksa keberadaan input sampai berakhir?
Patrick Roberts
@ PatrickRoberts Bisakah kita bicara dalam obrolan?
Okx
Tentu, cukup ping saya di The Nineteenth Byte . Saya di sana sesekali.
Patrick Roberts
Nah, ini ... FUNGSI SUNGGUHNYA
Chromium
10

Jelly , 2 byte

Ʋ

Cobalah online!

Erik the Outgolfer
sumber
1
Juga bekerja dengan Ohm.
Nick Clifford
8

TI-Basic, 4 byte

not(fPart(√(Ans

Cukup periksa apakah akar kuadrat adalah bilangan bulat dengan mencari bagian pecahan / desimal nol.

Timtech
sumber
Bisakah Anda menambahkan TIO (atau yang setara)?
Shaggy
@ Shaggy Saya tidak berpikir ada. TI-Basic adalah hak milik dan hanya akan berjalan pada kalkulator TI dan dalam emulator yang menjalankan ROM dari kalkulator, jadi Anda tidak dapat menggunakan TI-Basic secara legal jika Anda tidak memiliki kalkulator.
Adm
1
@ Shaggy Jika Anda memiliki ROM, Anda dapat menggunakan emulator (preferensi saya adalah jstified) untuk mencoba ini secara online.
Timtech
8

C #, 27 byte

n=>System.Math.Sqrt(n)%1==0

Cara yang lebih benar / akurat untuk melakukan ini adalah:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100
TheLethalCoder
sumber
double.Epsilon tidak berguna untuk jenis cek ini . tl; dr: Saat membandingkan angka> 2, Double.Epsilon pada dasarnya sama dengan nol. Mengalikan dengan 100 hanya akan menunda sedikit.
Robert Fraser
@RobertFraser Saya hanya melewati pos SO yang ditautkan dan tidak banyak membaca. Either way itu tidak berguna hanya tidak berguna di angka yang lebih tinggi.
TheLethalCoder
...<int>==0adalah ...!<int>saya pikir
Stan Strum
@StanStrum Not in C #
TheLethalCoder
7

JavaScript (ES6), 13 byte

n=>!(n**.5%1)

Mengembalikan nilai true jika akar kuadrat dari n adalah bilangan bulat.

Potongan:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));

Rick Hitchcock
sumber
7

dc, 9

0?dvd*-^p

Output 1 untuk truey dan 0 untuk falsey.

Cobalah online .

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

Catatan dc's ^perintah eksponensial memberikan 0 0 = 1 dan 0 n = 0, di mana n> 0.

Trauma Digital
sumber
Cantik! +1 untuk digunakan dcdengan cara yang cerdik.
Wildcard
6

Retina , 18 byte

.+
$*
(^1?|11\1)+$

Cobalah online! Tanpa malu-malu diadaptasi dari jawaban @ MartinEnder untuk Apakah angka ini berbentuk segitiga? tetapi dengan konversi basis disertakan dengan biaya 6 byte.

Perhatikan bahwa Apakah angka ini berbentuk segitiga? bukan karena alasan yang tidak dapat dijelaskan diperlukan untuk mendukung nol sebagai angka segitiga, jadi bagian dari adaptasi adalah menambahkan a ?untuk menjadikan 1 sebagai opsional, yang memungkinkan grup untuk mencocokkan string kosong, dan karenanya menjadi input nol. Namun, setelah sekarang mencocokkan string kosong, +operator berhenti mengulangi, untuk menghindari loop tak terbatas yang akan terjadi jika tetap rakus mencocokkan string kosong (setelah semua, ^1?tentu akan tetap cocok). Ini berarti bahwa ia bahkan tidak mencoba untuk mencocokkan alternatif lain dalam grup, sehingga menghindari kecocokan 2, 6, 12 dll. Seperti yang ditunjukkan oleh @MartinEnder, cara yang lebih sederhana untuk menghindari itu sambil tetap mencocokkan string kosong adalah dengan jangkar pertandingan di awal sementara membuat opsional kelompok untuk menghitung byte yang sama: ^(^1|11\1)*$.

Neil
sumber
Menantikan penjelasan Anda mengapa ini tidak cocok 2, 6atau nomor lainnya dari formulir n^2-n. ;) (Cara untuk menghindari penjelasan untuk jumlah byte yang sama adalah ^(^1|11\1)*$.)
Martin Ender
@ MartinEnder Alasan yang sama yang tidak bisa Anda gunakan (^|1\1)+$, saya pikir?
Neil
Ya itu benar. Hanya berpikir itu mungkin akan baik untuk disebutkan karena kebanyakan orang mungkin belum membaca komentar saya pada jawaban segitiga (dan dalam hal ini sebenarnya relevan dengan mengapa solusinya benar, dibandingkan dengan hanya mengapa itu tidak bisa di-golf lebih lanjut ).
Martin Ender
Sebagai catatan, +itu juga akan berhenti pengulangan jika tidak ada lagi alternatif kosong, misalnya dalam kasus ((?(1)11\1|1?))+. Setelah ada iterasi kosong, itu tidak akan mencoba yang lebih lanjut, terlepas dari apakah mereka mungkin kosong atau tidak.
Martin Ender
@ MartinEnder Memang, saya maksudkan "sekarang sudah cocok" bukannya "segera cocok". Tetap.
Neil
6

C (gcc), 30 byte

f(n){n=sqrt(n)==(int)sqrt(n);}

Cobalah online!

C, 34 byte

f(n){return(int)sqrt(n)==sqrt(n);}

Cobalah online!

C, 33 byte

#define f(n)(int)sqrt(n)==sqrt(n)

Cobalah online!

Steadybox
sumber
6

MATL , 5 4 byte

Terima kasih kepada Luis untuk mengurangi kode satu byte saya yang lebih panjang dengan dua byte, menjadikannya yang terpendek.

t:Um

Cobalah online

Penjelasan:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

Jawaban lama:

X^1\~

Cobalah online!

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0
Stewie Griffin
sumber
@Mego saya tidak setuju. MATL bahkan tidak bisa melakukannya mod(2**127-, 1000). Kecuali jika empat angka terakhir adalah 0 ....
Stewie Griffin
Anda juga bisa menggunakan t:Um. Itu bekerja untuk input hingga2^53 , karena presisi titik apung terbatas
Luis Mendo
Saya melihat sekarang bahwa ini mirip dengan hasil edit Anda, hanya sedikit lebih pendek :-)
Luis Mendo
Perintah persegi yang tersembunyi dengan baik! U: str2num / string to array / square. Saya tahu harus ada fungsi persegi, tapi saya tidak bisa menemukannya ...
Stewie Griffin
1
@cairdcoinheringaahing yang sebagian sengaja. Saya punya dua solusi, satu adalah 5 byte, yang lain 6 byte. Luis bermain golf dua byte dari satu dengan 6. Jadi saya menyelamatkan dua byte berkat dia, tapi saya hanya menyimpan satu byte pada skor ...
Stewie Griffin
6

Python 3 , 40 38 byte

Terima kasih kepada squid karena telah menghemat 2 byte!

lambda n:n in(i*i for i in range(n+1))

Cobalah online!

Terlalu lambat untuk mengembalikan jawaban 2147483647dalam jumlah waktu yang wajar. (Tetapi ditulis menggunakan generator untuk menghemat memori, karena tidak ada biaya byte.)

Bekerja di Python 2 juga, meskipun OverflowErrorkemungkinan karena rangejika Anda mencobanya dengan input besar. (A MemoryErrorjuga kemungkinan ada di Python 2, juga karena range.)

mathmandan
sumber
5

Perl 5 , 14 byte

13 byte kode + -pbendera.

$_=sqrt!~/\./

Cobalah online!

Hitung akar kuadrat, dan lihat apakah itu bilangan bulat (lebih tepatnya, jika tidak mengandung titik ( /\./).

Dada
sumber
5

05AB1E , 4 byte

Ln¹å

Cobalah online!

Erik the Outgolfer
sumber
Tidak berfungsi untuk jumlah besar, misalnya4111817668062926054213257208
Emigna
@Emigna Oh karena ini dianggap panjang? Saya pikir 05AB1E menggunakan Python 3.
Erik the Outgolfer
Gagal untuk input besar ( input yang diberikan adalah 2**127-1, perdana Mersenne).
Mego
Itu menggunakan python 3. Masalahnya adalah bahwa root kuadrat memberikan kesalahan pembulatan untuk jumlah besar.
Emigna
@Emigna Oh ... Saya rasa saya harus mencari cara lain, seharusnya tidak sulit.
Erik the Outgolfer
5

Python 3 , 19 byte

lambda n:n**.5%1==0

Cobalah online!

sagiksp
sumber
Gagal untuk input besar, mis 4111817668062926054213257208.
L3viathan
Diperbaiki dalam 25 byte:lambda n:int(n**.5)**2==n
L3viathan
4
@ L3viathan Itu (bersama dengan solusi apa pun yang melibatkan sqrt) gagal pada nilai-nilai yang berada di luar kisaran ganda, seperti 2**4253-1.
Mego
@totallyhuman pelampung setelah %1pasti <1, jadi proposal Anda akan kembali benar untuk semua input. Perhatikan bahwa itu n**.5adalah pelampung.
Leaky Nun
5

SageMath , 9 byte

is_square

Cobalah online

Fungsi bawaan melakukan apa yang tertulis di kaleng. Karena Sage menggunakan perhitungan simbolik, itu bebas dari kesalahan akurasi komputasi yang mengganggu IEEE-754 mengapung.

Mego
sumber
5

Japt , 3 byte

¬v1

Cobalah online!

Tampaknya berfungsi dengan baik 2**54-2dalam Japt Interpreter tetapi gagal pada TIO karena beberapa alasan ...

Tom
sumber
Gagal untuk input besar (input adalah 2**127-1, prime Mersenne).
Mego
@Mego, bukankan norma bahwa solusi tidak perlu menangani angka yang lebih besar daripada bahasa yang mampu ditangani?
Shaggy
@Shaggy Japt didasarkan pada JavaScript, yang menggunakan float presisi ganda. 2**127-1baik dalam kisaran ganda.
Mego
2
@Mego Bukankah int aman untuk JavaScript 2**53-1?
Tom
3
@Mego Tetapi angka JavaScript hanya memiliki ketepatan 53 bit, jadi JS tidak dapat secara tepat mewakili nilai 2**127-1sebagai angka. Yang paling dekat yang bisa didapat adalah 2**127.
ETHproduk
5

Haskell, 26 24 byte

f n=elem n$map(^2)[0..n]

Cobalah online!

Cek apakah n ada dalam daftar semua kotak dari 0hingga n.

nimi
sumber
1
jumlah byte yang sama: f n=or[i*i==n|i<-[0..n]]:)
vroomfondel
5

Prolog (SWI) , 27 byte

+N:-between(0,N,I),N=:=I*I.

Cobalah online!

Penjelasan

Menelusuri semua angka yang lebih besar atau sama dengan 0dan kurang dari atau sama dengan Ndan menguji apakah angka kuadrat itu sama dengan N.

0 '
sumber
1
@Dosc selesai !
0
5

MathGolf , 1 byte

°

Cobalah online!

Saya pikir tidak diperlukan penjelasan. Saya melihat perlunya operator "kotak yang sempurna" sebelum saya melihat tantangan ini, karena bahasanya dirancang untuk menangani tantangan golf terkait matematika. Mengembalikan 0 atau 1, karena MathGolf menggunakan bilangan bulat untuk mewakili boolean.

maks
sumber
4

PHP, 21 byte

<?=(-1)**$argn**.5<2;

Jika akar kuadrat bukan angka integer, (-1)**$argn**.5adalah NAN.

pengguna63956
sumber
Bagaimana saya menjalankan ini?
Titus
@Titus Dengan -Fbendera dan pipa: echo 144 | php -F script.php.
user63956
Ah, aku fpunya surat itu. Terima kasih.
Titus
4

Ruby, 25 byte

Math.sqrt(gets.to_i)%1==0

Mungkin ada cara yang lebih pendek tapi hanya itu yang saya temukan.

Cobalah online!

Gregory
sumber
Selamat datang di PPCG :) Tolong bisakah Anda menambahkan TIO (atau yang setara) dengan ini?
Shaggy
Terima kasih telah menambahkan TIO, ini sepertinya tidak menghasilkan output apa pun.
Shaggy
Buruk saya, saya memperbaruinya.
Gregory
Tidak, masih tidak berfungsi.
Shaggy
3

CJam , 8 byte

ri_mQ2#=

Cobalah online!

Penjelasan

Root kuadrat integer, kuadrat, bandingkan dengan angka asli.

Luis Mendo
sumber
Saya kira sesuai dengan ini , Anda tidak perlu 2 byte pertama
Chromium
Dan, sebagai alternatif, dengan menggunakan ide jawaban ini , Anda dapat melakukannya mq1%0=, yang juga 6 byte
Chromium
@ Chromium Terima kasih, tetapi dalam hal ini saya perlu {... }untuk membuat kode fungsi, jumlah byte yang sama
Luis Mendo
Sebenarnya, saya agak bingung apakah akan menambahkan kurung kurawal atau tidak. Karena jika Anda tidak menambahkannya, itu sebenarnya sebuah program, yang diizinkan.
Chromium
@Chromium Sebuah program perlu mengambil inputnya, sehingga ridiperlukan dalam hal ini
Luis Mendo
3

Mathematica, 13 byte

AtomQ@Sqrt@#&

Cobalah online!

J42161217
sumber
Tidak terpasang? Aneh ....
TheLethalCoder
1
Anda bisa menggunakan AtomQbukan IntegerQ.
Martin Ender
1
tentu saja shaggy ...
J42161217
1
Anda masih bisa menggunakan @*.
Martin Ender
4
AtomQ@*Sqrtadalah sinonim untuk AtomQ@Sqrt@#&. Misalnya, AtomQ@*Sqrt@4pengembalian Truedan AtomQ@*Sqrt@5pengembalian False. (Karena didahulukan, AtomQ@*Sqrt[4]tidak berfungsi dengan benar, kembali AtomQ@*2.)
Greg Martin
3

APL (Dyalog) , 8 byte

0=1|*∘.5

Cobalah online!

0= adalah nol sama dengan

1| modulus-1 (yaitu bagian fraksional) dari

*∘.5 Argumen itu memunculkan kekuatan setengah

Adm
sumber
3

AWK , 27 + 2 byte

{x=int($0^0.5);$0=x*x==$1}1

Cobalah online!

Tambahkan +2byte untuk menggunakan -Mflag untuk presisi yang sewenang-wenang. Saya awalnya menggunakan perbandingan string karena jumlah besar dibandingkan sama, meskipun mereka tidak, tetapi sqrtjuga mengembalikan nilai yang tidak tepat. 2^127-2seharusnya bukan persegi yang sempurna.

Robert Benson
sumber
3

T-SQL, 38 byte

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

Mencari titik desimal di akar kuadrat. IIFkhusus untuk MS SQL, diuji dan berfungsi di MS SQL Server 2012.

Input pada kolom a dari tabel t yang sudah ada , sesuai aturan input kami .

BradC
sumber
3

Ohm , 2 byte

Ʋ

Menggunakan CP-437penyandian.

Penjelasan

Input Tersirat -> Built-in kuadrat sempurna -> Output Tersirat ...

Roman Gräf
sumber
3

Java 8, 20 byte

n->Math.sqrt(n)%1==0

Masukan adalah int .

Coba di sini.

Kevin Cruijssen
sumber
Tidak dapat diperdebatkan: pertanyaannya secara eksplisit mengatakan "Diberikan bilangan bulat n (di mana n> = 0)". Jawaban terpendek adalah yang terbaik. Sunting: tidak akan memberi +1 hingga jawaban tersingkat bukanlah yang pertama: p
Olivier Grégoire
@ OlivierGrégoire Hmm, itu cara yang bagus untuk melihatnya. Tapi Anda masih tidak akan tahu apakah itu sebuah int, long, short. Dan dengan pertanyaan di mana mereka meminta integer tetapi format input fleksibel, saya kadang-kadang menggunakan input String untuk menyimpan beberapa byte. Secara pribadi saya pikir menggunakan n->baik-baik saja, dan Anda harus menyatakan apa jenisnya, tetapi tampaknya tidak semua orang setuju dengan ini. Di sisi lain, berasal dari sejarah jawaban Java 7, pergi dari int c(int n){return ...;}ke (int n)->...merek yang lebih masuk akal daripada n->...(meskipun saya pribadi lebih suka yang kedua sejak lebih pendek tentu saja).
Kevin Cruijssen
2
@ OlivierGrégoire Ok, saya sudah mengubahnya. Setelah membaca pembahasan dalam jawaban ini , saya sampai pada kesimpulan bahwa menyatakan input adalah integer di Java, tidak ada bedanya dengan menyatakan input adalah daftar dua String di CJam atau array sel string di MATL .
Kevin Cruijssen
3

Tambahkan ++ , 24 13 11 byte

+?
S
%1
N
O

Cobalah online!

Saya menghapus fungsi kikuk di bagian atas dan menulis ulang ke dalam tubuh pertanyaan untuk menghapus 11 byte.

Karena bagian pertama sudah dijelaskan di bawah, mari kita cari tahu cara kerja bagian baru

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

Versi lama, 24 byte

D,i,@,1@%!
+?
^.5
$i,x
O

Cobalah online!

Fungsi di atas ( D,i,@,1@%!) adalah bagian utama dari program, jadi mari kita masuk ke detail lebih lanjut.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result
caird coinheringaahing
sumber
3

Python 3 , 28 27 25 byte

  • Terima kasih kepada @mdahmoune untuk 1 byte: bandingkan int root kuadrat dengan yang asli
  • 2 byte disimpan: lambda disingkat
lambda x:int(x**.5)**2==x

Cobalah online!

officialaimm
sumber
1
bagaimana dengan f = lambda x: int (x **. 5) ** 2 == x 27bytes
mdahmoune