Tulis program yang memeriksa apakah bilangan bulat adalah kekuatan 2.
Input sampel:
8
Output sampel:
Yes
Input sampel:
10
Output sampel:
No
Aturan:
Jangan gunakan
+
,-
operasi.Gunakan semacam aliran input untuk mendapatkan nomor. Input semula tidak seharusnya disimpan dalam variabel.
Kode terpendek (dalam byte) menang.
Anda dapat menggunakan respons yang benar / salah (misalnya, true
/ false
). Anda dapat berasumsi bahwa jumlah input lebih besar dari 0
.
code-golf
restricted-source
decision-problem
integer
gthacoder
sumber
sumber
pred
Fungsi, bila diterapkan ke integer n, kembali n - 1. Apakah fungsi seperti ini, yang penyamaran tipis sekitar operator dilarang, juga dilarang?)
, atau sebagian besar bahasa berbasis c '--
.Jawaban:
GolfScript, 6 karakter, tanpa pengurangan
Inilah solusi yang tidak menggunakan
x & (x-1)
metode dalam bentuk apa pun . Ini menggunakanx & (x/3)
sebagai gantinya. ;-) Keluaran0
jika salah,1
jika benar.Penjelasan:
~
evals string input untuk mengubahnya menjadi angka,.
duplikat (untuk selanjutnya&
),3/
membaginya dengan tiga (memotong ke bawah),&
menghitung bitwise AND dari nilai yang dibagi dengan yang asli, yang akan menjadi nol jika dan hanya jika inputnya nol atau memiliki kekuatan dua (yaitu memiliki paling banyak satu set bit), dan!
secara logis meniadakan ini, memetakan nol ke satu dan semua nilai lainnya ke nol.Catatan:
Sesuai aturan yang diklarifikasi, nol bukan input yang valid , jadi kode ini tidak apa-apa, meskipun output
1
jika inputnya nol.Jika operator decrement GolfScript
(
diperbolehkan, maka 5 karakter solusi~.(&!
diposting oleh aditsu cukup. Namun, tampaknya bertentangan dengan semangat aturan , jika bukan surat itu.Saya menemukan
x & (x/3)
triknya bertahun-tahun yang lalu di milis Fun With Perl. (Saya yakin saya bukan orang pertama yang menemukannya, tetapi saya memang menciptakannya kembali.) Berikut ini tautan ke pos asli , termasuk bukti bahwa itu benar-benar berfungsi.sumber
7/3 = 2 (0010)
, jadi7 & 2 = 0111 & 0010 = 0010
yang jelas bit terakhir bukan 1APL (7)
Ya, itu 7 byte . Asumsikan untuk saat ini saya menggunakan IBM codepage 907 alih-alih Unicode dan kemudian setiap karakter adalah byte :)
yaitu
0 = mod(log(input(),2),1)
sumber
Indeterminate
ketika saya mencobanya.GolfScript, 11 (untuk 1 (benar) dan 0 (salah))
Masukkan nomor pada tumpukan dan kemudian jalankan.
GolfScript, 22 (untuk Ya / Tidak)
Saya suka bagaimana mengkonversi
1
/0
keYes
/No
mengambil kode sebanyak tantangan itu sendiri: DPeringatan: SANGAT tidak efisien;) Tidak berfungsi dengan baik untuk angka hingga 10.000, tetapi begitu Anda mendapatkan setinggi itu, Anda mulai melihat sedikit jeda.
Penjelasan:
.,
: berubahn
menjadin 0..n
(.
duplikat,,
rentang 0..n){2\?}
: dengan kekuatan 2%
: memetakan "kekuatan 2" lebih dari "0..n" sehingga menjadin [1 2 4 8 16 ...]
?0>
: memeriksa untuk melihat apakah array berisi angka (0 lebih besar dari indeks)sumber
.,{2\?}%?0<'YesNo'3/=
:; juga saya pikir Anda curang dengan meminta "Masukkan nomor di tumpukan", Anda harus mulai dengan~
.Mathematica 28
Untuk kekuatan bilangan bulat 2, pembilang dari log basis 2 akan menjadi 1 (artinya log adalah fraksi satuan).
Di sini kita memodifikasi fungsi sedikit untuk menampilkan input yang diduga. Kami menggunakan
#
menggantikanInput[]
dan menambahkan&
untuk mendefinisikan fungsi murni. Ini mengembalikan jawaban yang sama yang akan dikembalikan jika pengguna memasukkan angka dalam fungsi di atas.Menguji beberapa angka sekaligus.
sumber
Perl 6 (17 karakter)
Program ini mendapat garis dari
get
fungsi STDIN , menghitung logaritma dengan basis 2 di atasnya (log(2)
), dan memeriksa apakah hasilnya dibagi dengan 1 (%%1
, di mana%%
dibagi oleh operator). Tidak sesingkat solusi GolfScript, tapi saya menemukan ini dapat diterima (GolfScript memenangkan segalanya), tetapi lebih cepat (bahkan mengingat Perl 6 sedang lambat saat ini).sumber
+
dan-
dilarang untuk tantangan ini, adalah karena jikax & (x - 1)
sama dengan0
, makax
adalah kekuatan 2.x&~(~0*x)
masih berfungsi. Itu hanya 2 karakter lagi.Oktaf (
1523)EDIT: Diperbarui karena persyaratan input pengguna;
Memungkinkan pengguna memasukkan nilai dan output 1 untuk true, 0 untuk false.
Diuji dalam Oktaf, harus bekerja di Matlab juga.
sumber
R,
1311Berdasarkan solusi Perl. Pengembalian
FALSE
atauTRUE
.Parameter
i
mewakili variabel input.Versi alternatif dengan input pengguna:
sumber
GolfScript, 5
Output 1 untuk true, 0 untuk false. Berdasarkan ide user3142747:
Catatan:
(
adalah pengurangan, mudah-mudahan itu tidak dihitung sebagai-
:)Jika ya (dan komentar OP menyarankan itu mungkin), maka silakan merujuk ke solusi Ilmari Karonen sebagai gantinya.
Untuk output Y / N, tambahkan
'NY'1/=
di akhir (7 byte lebih).sumber
Python, 31
sumber
bin(input()).rfind('1')<3
2==
karena saya pikir itu harus bekerja untuk nomor nonpositif juga. Itu secara eksplisit tidak diharuskan oleh aturan, jadi ...print bin(input()).count('1')<2
dengan total 31 karakter, tetapi terlalu mirip dengan Anda.C, 48
sumber
*
memiliki prioritas lebih tinggi daripada biner&
, Anda tidak perlu parens. Dan jika nilai pengembalian diterima (hanya diminta)exit(x&x*-1)
akan jauh lebih pendek.-
:x*-1
.-
yang dilarang.Saya memutuskan untuk menggunakan pendekatan lain, berdasarkan jumlah populasi atau jumlah sideways dari jumlah (jumlah 1-bit). Idenya adalah bahwa semua kekuatan dua memiliki tepat satu
1
bit, dan tidak ada angka lainnya. Saya menambahkan versi JavaScript karena menurut saya itu lucu, meskipun tentu tidak akan memenangkan kompetisi golf.J,
1415 karakter (output 0 atau 1)JavaScript, 76 karakter (output benar atau salah)
sumber
Klip ,
987Membaca angka dari stdin.
Penjelasan:
Untuk mulai dengan,
Z
=0
,W
=2
danO
= 1. Ini memungkinkan penempatanW
dan diO
samping satu sama lain, sedangkan menggunakan2
dan1
akan ditafsirkan sebagai angka 21 tanpa ruang pemisah (karakter tambahan yang tidak diinginkan). Dalam Klip, fungsi modulo (%
) bekerja pada non-integer, jadi, untuk mengetahui apakah beberapa nilaiv
adalah integer, Anda memeriksa apakahv
mod 1 = 0. Menggunakan sintaksis Klip, ini ditulis sebagai=0%v1
. Namun, sebagai booleans disimpan sebagai1
(atau apa pun) dan0
, memeriksa apakah ada yang sama dengan0
hanya 'tidak' itu. Untuk ini, Clip memiliki!
operator. Dalam kode saya,v
adalahlnx2
.x
adalah input dari stdin,n
mengkonversi string ke nomor danlab
basis log .b
daria
. Oleh karena itu, program ini menerjemahkan (lebih mudah dibaca) menjadi0 = ((log base 2 of parseInt(readLine)) mod 1)
Contoh:
output
dan
output
Sunting 1: diganti
0
,1
dan2
denganZ
,O
danW
.Sunting 2: diganti
=Z
dengan!
.Juga:
Pyth , 5
Kompres versi Klip lebih jauh, karena Pyth memiliki Q untuk input yang sudah dievaluasi dan fungsi log2 (a), bukan hanya log umum (a, b).
sumber
Javascript (37)
Skrip sederhana yang hanya dibagi 2 berulang kali dan memeriksa sisanya.
sumber
for
lingkaran (juga 37 karakter)for(i=prompt();i>1;i/=2){}alert(i==1)
Mathematica (21)
Tanpa input sedikit lebih pendek
sumber
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
4140 karakterCara kerjanya: Anda menggunakan logaritma di base 2 menggunakan
l(prompt()) / l(2)
, dan jika hasil modulo 1 sama dengan nol, maka itu adalah kekuatan 2.Sebagai contoh: setelah mengambil logaritma 8 di pangkalan
2
, Anda dapatkan3
.3 modulo 1
sama dengan 0, jadi ini mengembalikan true.Setelah mengambil logaritma 7 pada basis 2, Anda dapatkan
2.807354922057604
.2.807354922057604 modulo 1
sama dengan0.807354922057604
, jadi ini mengembalikan false.sumber
Math.log
akan melakukannya : "Masing-masing fungsi objek Matematika berikut menerapkan operator abstrak ToNumber ke setiap argumennya ..."JavaScript, 35
Bekerja untuk byte.
Versi 46 karakter , Berfungsi untuk angka 16 bit.
Trik ini berfungsi dalam sebagian besar bahasa dinamis.
Penjelasan: Konversi angka menjadi basis 2, tafsirkan string itu sebagai basis 10, lakukan modulo 9 untuk mendapatkan jumlah digit, yang harus 1.
sumber
0x2ff
basis 2 mana1111111111
?+1
!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13+ 1 = 14 karakter
Menggunakan metode yang sama dari utas FWP lama sebagai entri GolfScript saya . Mencetak
1
jika input adalah kekuatan dua, dan jalur kosong sebaliknya.Perlu dijalankan
perl -nE
; yangn
biaya satu char tambahan , untuk total 14 karakter. Atau, inilah versi 18 karakter yang tidak memerlukann
:sumber
python 3, 38
python, 32
Namun, kode tidak berfungsi di setiap versi.
Perhatikan bahwa solusinya juga berfungsi untuk 0 (cetak Salah).
sumber
==
dengan&
?Ruby - 17 karakter (percobaan keempat)
Yang terbaik saat ini adalah gabungan dari jawaban @ steenslag dengan jawaban saya sendiri. Di bawah ini adalah upaya saya sebelumnya.
Ruby - 19 karakter (percobaan ketiga)
Ruby - 22 karakter (percobaan kedua)
Ruby - 24 karakter (percobaan pertama)
sumber
K / Kona (
2417)Mengembalikan 1 jika benar dan 0 jika salah. Setiap kekuatan 2 memiliki bit tunggal sama dengan 1:
(ini mencetak semua kekuatan 2 (dari 0 hingga 9) dalam bentuk biner)
Jadi saya meringkas semua komponen dari ekspresi biner
x
dan melihat apakah itu sama dengan 1; jika ya makax=2^n
, sebaliknya tidak.... tahu aku bisa membuatnya lebih kecil
sumber
C # (54 karakter)
sumber
Int32
, bukanToInt32
...int
alih-alihInt32
untuk 2 karakter lebih sedikit.Rebmu (9 karakter)
Uji
Rebmu adalah dialek bahasa Rebol yang terbatas. Kode dasarnya adalah:
Alternatif
14 karakter — Rebmu tidak memiliki bitwise 'bubur' DAN ~
Dalam Rebol:
sumber
GTB , 46 byte
sumber
Python, 35
Tidak hanya menggunakan operasi +/-, tetapi operasi matematika selain mengonversi ke bentuk biner.
Hal-hal lain (menarik, tetapi tidak untuk kompetisi):
Saya juga memiliki versi regexp (61) :
(Menyukai idenya, tetapi fungsi impor dan cocok membuatnya terlalu lama)
Dan versi operasi bitwise yang bagus, tetapi membosankan (31) :
(ya, ini lebih pendek, tetapi ia menggunakan ~ -x untuk decrement yang comtains - operasi)
sumber
Python 2.7 (
30293937)EDIT: Diperbarui karena persyaratan input pengguna;
Brute force, coba bagi hingga = 1 (berhasil) atau <1 (gagal)
sumber
not a%2
dapat ditulis sebagaia%2==0
. Memang, ini akan lebih lama dalam banyak bahasa, tetapi tidak Python.a%2<1
,.2.
Menghapus yang akan menghemat satu byte!Python (33)
sumber
int(bin(input()*2)[3:])<1
juga bekerja dari shell python dengan hanya 25 karakter.Ruby,
33,28, 25sumber
APL (12 untuk 0/1, 27 untuk ya / tidak)
atau, jika kita harus menampilkan teks:
Baca dalam A. Bentuk vektor 0..A, lalu vektor 2 0 ..2 A (ya, itu jauh lebih dari yang diperlukan), kemudian vektor yang membandingkan A dengan masing-masing (menghasilkan vektor 0 dan paling banyak satu 1), lalu xor itu (tidak ada xor operator di APL, tetapi ≠ yang diterapkan pada boolean akan bertindak sebagai satu.) Kita sekarang memiliki 0 atau 1.
Untuk mendapatkan YA atau TIDAK: kalikan 0 atau 1 dengan 3, jatuhkan jumlah karakter ini dari 'YESNO', lalu ambil 3 karakter pertama dari ini.
sumber
C, 65 byte
sumber
main(k){...
, bergantung padaint
pengetikan tersirat . Mungkin UB, tapi ini golf kode. TIDAK PERNAH menggunakan sesuatu seperti itu dalam produksi, tentu saja.Haskell (
5250)sumber