Ada cara pintar untuk menentukan apakah angka adalah kekuatan 2. Itu bukan lagi masalah yang menarik, jadi mari kita tentukan apakah bilangan bulat yang diberikan adalah kekuatan bilangan bulat -2 . Sebagai contoh:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
Aturan
Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar untuk menerima input dan memberikan output.
Input Anda adalah bilangan bulat tunggal, dan output harus nilai kebenaran jika bilangan bulat adalah kekuatan bilangan bulat -2, dan nilai palsu sebaliknya. Tidak ada output lain (mis. Pesan peringatan) diizinkan.
Aturan bilangan bulat bilangan bulat yang biasa berlaku: solusi Anda harus dapat bekerja untuk bilangan bulat besar yang sewenang-wenang dalam versi hipotetis (atau mungkin nyata) bahasa Anda di mana semua bilangan bulat tidak terikat secara default, tetapi jika program Anda gagal dalam praktik karena implementasi tidak mendukung bilangan bulat yang besar, itu tidak membatalkan solusi.
Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.
Kondisi menang
Ini adalah kontes kode-golf : jawabannya yang memiliki byte paling sedikit (dalam pengkodean pilihan Anda) adalah pemenangnya.
sumber
i
seperti itu(-2)^i = 2
-0.5
harus valid karena 2 ^ (- 1) .i
tidak alamiJawaban:
Mathematica, 22 byte
Cobalah online! (Sebaliknya, menggunakan Matematika, tempat solusi ini juga berfungsi.)
Saya mencoba mencari solusi dengan operator bitwise untuk sementara waktu, dan meskipun ada yang pasti, saya akhirnya menemukan sesuatu yang mungkin lebih sederhana:
Max[#,-2#]
mengalikan input dengan -2 jika negatif. Mengalikan dengan faktor -2 lainnya tidak mengubah apakah nilainya kekuatan -2 atau tidak. Tapi sekarang semua kekuatan ganjil -2 telah berubah menjadi kekuatan genap -2 .Log2@...
dan memeriksa apakah hasilnya bilangan bulat (untuk memeriksa apakah itu kekuatan 2 ). Ini sudah menghemat dua byte lebihLog[4,...]
(cara lain untuk melihat kekuatan genap -2 ).EvenQ
alih-alihIntegerQ
.sumber
Log[4,...]
lebih panjang dariLog2@...
danIntegerQ
lebih panjang dariEvenQ
.Jelly , 5 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Python , 46 byte
-2 byte terima kasih kepada @ovs.
Fungsi dengan penggunaan:
Cobalah online!
sumber
print g(8)
cetakanFalse
print g(4)
melakukan hal yang sama;
bukan baris baru ... maaf untuk itu. Memperbaiki @FelipeNardiBatistaJelly , 6 byte
Cobalah online!
Ini didasarkan pada bagaimana Jelly mengkonversi bilangan bulat N ke sembarang basis B , dengan melakukan konversi N ke array, di mana setiap bilangan bulat adalah digit d dari ( N ) B , yang dapat memiliki nilai 0≤ V d < B . Di sini, kita akan 0-indeks digit dari kanan, sehingga setiap digit menambahkan V d B d untuk membentuk N . V d < B ⇔ V d B d < BB d = B d +1 , oleh karena itu setiap kemungkinanN hanya memiliki satu representasi yang unik, jika kita mengabaikan 0s terkemuka di ( N ) B .
Di sini, d = input, B = -2. N = B d = 1 B d = V d B d ⇔1 = V d ⇔ V d = 1, dan, karena kita tidak menambahkan kelipatan kekuatan B lainnya , setiap V lainnya akan menjadi 0. Saat ini, array harus berupa 1 concatenated dengan d 0s. Karena Jelly 1-indeks dari kiri, kita harus memeriksa apakah elemen 1 array adalah 1, dan semua elemen lainnya adalah 0.
Hmm ... semuanya baik-baik saja, kan? Tidak? Apa yang sedang terjadi? Oh ya, aku punya ide yang lebih baik! Pertama, mari kita ambil jumlah semua bilangan bulat dalam array, memperlakukannya seolah-olah itu adalah array integer dan bukan angka di basis -2. Jika angka 1, itu berarti bahwa hanya ada satu angka 1, dan semua bilangan bulat lainnya adalah 0. Karena tidak mungkin ada angka nol di depannya, kecuali dalam kasus 0 -2(di mana jumlahnya adalah 0 ≠ 1), integer 1 harus bukan nol. Satu-satunya bilangan bulat bukan nol dalam array adalah 1, jadi harus yang pertama. Oleh karena itu, ini adalah satu-satunya kasus bahwa jumlah semua bilangan bulat dalam array adalah 1, karena jumlah terkecil dari sepasang bilangan bulat positif adalah Σ {1,1} = 2, karena bilangan bulat positif terkecil adalah 1 Setiap bilangan bulat dalam representasi basis adalah non-negatif, jadi satu-satunya cara penjumlahannya adalah 1 adalah dengan hanya memiliki 1, dan semua bilangan bulat lainnya adalah 0. Oleh karena itu, kami hanya dapat memeriksa apakah jumlah semua bilangan bulat dalam array adalah 1.
Inilah yang dilakukan oleh kode:
sumber
Python 2 ,
353432 byteCobalah online!
sumber
Python 2 ,
9850 byteCobalah online!
sumber
Excel,
4036 byteDisimpan 4 byte oleh CallumDA
Excel pasti dapat melakukannya tetapi memperbaiki kesalahan menambah 11 byte
Input ada di sel
A1
. Output adalahTRUE
atauFALSE
Jika diizinkan untuk mengembalikan salah
FALSE
atau#NUM!
kesalahan untuk nilai-nilai salah, itu hanya akan menjadi 25 byte:sumber
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
ÄLY(småO
for 8.Y(sÄLm¢Z
for 8 ... Nevermind, all 8.JavaScript (ES6),
37 2824 byteDisimpan 4 byte berkat Arnauld.
sumber
C (gcc) ,
3429 byteCobalah online!
sumber
MATL ,
98 byteCobalah online! Atau verifikasi semua kasus uji .
Bagaimana itu bekerja
Pertimbangkan input
-8
sebagai contohsumber
n
, ini menciptakan array ukurann
sebagai langkah perantara. Kerja bagus, efisiensi bukanlah kriteria di sini!Oktaf , 28 byte
Ini mendefinisikan fungsi anonim. Pendekatannya mirip dengan yang ada di jawaban MATL saya.
Cobalah online!
sumber
PHP, 41 Bytes
PHP, 52 Bytes
PHP, 64 Bytes
Bekerja dengan Regex
sumber
Python 3, 34 byte
sumber
JavaScript (ES6), 21 byte
Fungsi rekursif yang mengembalikan
0
atautrue
.Bagaimana itu bekerja
Ini tidak termasuk tes eksplisit - seperti
n
menjadi aneh atauabs(n)
kurang dari satu - untuk menghentikan rekursi lebih awal ketika input bukan kekuatan tepat -2.Kami keluar hanya ketika
n
persis sama dengan salah satu1
atau0
.Namun ini berhasil karena setiap float IEEE-754 pada akhirnya akan dibulatkan menjadi
0
ketika dibagi dengan 2 (atau -2) kali yang cukup, karena aritmatika underflow .Uji kasus
Tampilkan cuplikan kode
sumber
C (gcc) , 33 byte
Cobalah online!
sumber
Java 7, 55 byte
Penjelasan:
Kode uji:
Coba di sini.
Keluaran:
sumber
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
di Jawa, karena0%-2==0
akantrue
dan0/-2
masih0
, menyebabkan loop tak terbatas, itulah sebabnya saya menambahkann==0?0>1
bagian ke metode rekursif saya.Haskell,
2423 byteMenentukan fungsi
f
yang mengembalikan1
kekuatan -2 dan0
sebaliknya.Versi golf dari pengiriman pertama saya ke tantangan lain .
sumber
Javascript (ES7), 45 byte
sumber
**
adalah.Perl 6 , 21 byte
Cobalah
Diperluas:
Perhatikan bahwa
0.lsb
pengembalianNil
yang menghasilkan peringatan ketika digunakan sebagai angka, sehingga operator yang didefinisikan atau//
digunakan.(Anggap
//
sebagai||
dengan kemiringan yang berbeda)Panggilan metode tanpa undangan di mana istilah diharapkan secara implisit dipanggil
$_
. (.lsb
)Juga bekerja dengan
.msb
.sumber
Prolog (SWI) , 44 byte
Penerjemah online
sumber
Python , 24 byte
Cobalah online!
Trik bit
k&k-1==0
memeriksa apakahk
kekuatan 2 (atauk==0
). Memeriksa inik=n*n
sebagain*n&n*n-1==0
memberi tahu kita apakahabs(n)
kekuatan 2.Untuk lebih jauh melihat apakah
n
kekuatan -2, kita hanya perlu memeriksa itun%3==1
. Ini berfungsi karena mod 3, nilai -2 sama dengan 1, jadi kekuatannya adalah 1. Sebaliknya, negasinya adalah 2 mod 3, dan tentu saja 0 memberikan 0 mod 3.Kami menggabungkan cek
n*n&n*n-1==0
dann%3==1
menjadi satu ekspresi. Yang pertama dapat ditulis dengan<1
untuk==0
, karena itu tidak pernah negatif. Inin%3==1
sama dengann%3%2
, memberi 0 atau 1. Jadi, kita bisa menggabungkannya sebagain*n&n*n-1<n%3%2
.sumber
R, 22 byte
Mengambil input dari stdin, mengembalikan
TRUE
atauFALSE
sesuai.Saya tidak 100% yakin bahwa ini adalah jawaban yang valid, karena hanya berfungsi untuk bilangan bulat hingga batas ukuran R, dan jika bilangan bulat tidak terikat itu tidak akan berfungsi. Namun, aturannya menyatakan:
Dalam versi hipotetis R yang memungkinkan bilangan bulat tidak terikat, maka kita bisa menggunakan kode berikut, untuk jumlah byte yang sama:
Tentu saja, dalam R nyata, kode di atas hanya memberi
Error in 0:Inf : result would be too long a vector
.sumber
bc 88 byte
Saya memiliki ini dalam file
neg2.sh
dan mencetak1
untuk kekuatan-2
dan0
sebaliknyaSaya tahu ini sangat panjang, tapi itu menyenangkan
Uji
Penjelasan
Tubuh utama memiliki dua bagian, keduanya berusaha sama dengan nol untuk kekuatan
-2
.sumber
Julia 0,5 , 20 byte
Cobalah online!
sumber
Fourier , 53 byte
Saya akan mengerjakan golf ini nanti, tetapi garis besarnya adalah:
Di mana hasilnya adalah
0
untuk falsey dan1
untuk kebenaran .Cobalah online!
sumber
(G*G > X)*X
Casio BASIC , 76 byte
Perhatikan bahwa 76 byte adalah apa yang tertulis di kalkulator saya.
Ini adalah usaha pertama saya ke Casio BASIC ... Saya tidak pernah menyadari bahwa saya dapat menulis program yang layak seperti itu di kalkulator: D
sumber
Python 2.7, 40 byte
Kredit ke Tn. Xcoder untuk kode asli panjang 43 byte. Harus memposting sebagai jawaban terpisah karena saya tidak memiliki reputasi yang cukup untuk berkomentar.
sumber
int(input())
yang akan melampaui batas yangdef
fungsi -seperti. Selain itu, Dalam python 3, Anda harus menggunakanprint()
yang akan menghabiskan 1 byte. Itu sebabnya saya memilih seperti itu, karena dalam Python 3 itu menjadi lebih lama ...Retina , 27 byte
Cobalah online!
Mengambil input di unary, yang cukup standar untuk Retina. Dua baris pertama melakukan konversi unary ke binary sebagian berdasarkan pada dua baris pertama kode dari entri Tutorial (setiap
1
tambahan akan menyebabkan kecocokan tetap gagal), sedangkan baris terakhir memeriksa kekuatan empat atau kekuatan ganjil negatif dari dua.Cobalah online!
Kali ini saya melakukan sebagian unary ke base empat konversi. Kekuatan empat berakhir sebagai
^1_*$
sementara kekuatan aneh negatif dua berakhir sebagai^-11_*$
.Cobalah online!
Kali ini saya hanya membagi empat sebanyak yang saya bisa dan memeriksa
1
atau-11
pada akhirnya.Cobalah online!
Cara lain untuk membaginya dengan empat. Dan masih mengganggu 27 byte ...
sumber
Skema, 60 byte
Solusi rekursif.
sumber