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

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


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


8

TI-Basic, 4 byte

not(fPart(√(Ans

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


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

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


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.


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


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

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

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


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 ( /\./).


5

05AB1E , 4 byte

Ln¹å

Cobalah online!


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!


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.


5

Japt , 3 byte

¬v1

Cobalah online!

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


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.


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.


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.


4

PHP, 21 byte

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

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


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!


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.


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

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


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.


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 .


3

Ohm , 2 byte

Ʋ

Menggunakan CP-437penyandian.

Penjelasan

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


3

Java 8, 20 byte

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

Masukan adalah int .

Coba di sini.


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

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!


1
bagaimana dengan f = lambda x: int (x **. 5) ** 2 == x 27bytes
mdahmoune
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.