Kemarin saat bermain dengan anak saya, saya perhatikan nomor di kereta mainannya:
Jadi kita memiliki yang dapat dibagi menjadi atau
Jadi tantangan sederhana: diberi angka non-negatif sebagai input, kembalikan nilai kebenaran dan falsey yang konsisten yang mewakili apakah representasi string dari angka (di basis 10 dan tanpa nol di depan) dapat entah bagaimana dipecah menjadi angka yang merupakan kekuatan 2 .
Contoh:
4281 truthy (4-2-8-1)
164 truthy (16-4 or 1-64)
8192 truthy (the number itself is a power of 2)
81024 truthy (8-1024 or 8-1-02-4)
101 truthy (1-01)
0 falsey (0 cannot be represented as 2^x for any x)
1 truthy
3 falsey
234789 falsey
256323 falsey (we have 256 and 32 but then 3)
8132 truthy (8-1-32)
Tests for very large numbers (not really necessary to be handled by your code):
81024256641116 truthy (8-1024-256-64-1-1-16)
64512819237913 falsey
Ini adalah kode-golf , jadi semoga kode terpendek untuk setiap bahasa menang!
code-golf
string
number
decision-problem
Charlie
sumber
sumber
int
tipe standar (4 byte), tetapi sebenarnya saya tidak keberatan jika kode Anda tidak mendukung angka yang sangat besar. Cukup nyatakan dalam jawaban Anda keterbatasan kode Anda.101
(salah karena 0) ... atau apakah ini masih benar (1 - 01
)?101
kasus ini dengan jawaban saat ini dan semuanya kembalitrue
, karena dapat dibagi menjadi1-01
dua kekuatan 2, jadi saya akan menganggap kasus itu benar.log2(n)
tidak mengandung angka desimal setelah koma. 2) Periksa apakahn AND (n-1) == 0
. 3) Buat daftar nr-square dan periksa apakahn
ada dalam daftar itu.Jawaban:
05AB1E ,
98 byte-1 byte terima kasih kepada @Emigna dengan menggunakan
Z
(maks) untuk daftar 0s dan 1s untuk meniruany
perintah untuk1
(truey).Cobalah secara online atau verifikasi semua kasus uji . (CATATAN: Di
т
header adalah100
untuk hanya mendapatkan daya 100 pertama dari 2 angka, bukan jumlah input pertama dari kekuatan 2 angka. Ia bekerja dengan jumlah daya input 2 juga, tetapi cukup tidak efisien dan mungkin batas waktu pada TIO jika inputnya cukup besar.)Penjelasan:
sumber
.œ.²1%O0å
(9 byte juga). Tambang gagal0
, namun..²1%O0
cukup pintar juga. Saya berpikir untuk menggunakanlog2
seperti ini.²DïQ
, tetapi akan membutuhkan peta di sekitarnya untuk melakukan ini untuk setiap nomor, dan memang tidak bekerja untuk kasus tepi0
.JavaScript (Node.js) , 54 byte
Cobalah online!
sumber
JavaScript (Node.js) ,
696458 byteCobalah online!
Masukkan sebagai angka. Bagian logika cukup berbelit-belit, jadi tidak ada ide bagaimana menguraikannya dan menyingkirkannya
q
.-11 byte dengan melakukan golf pada cek power-of-2.
sumber
JavaScript (Node.js) ,
7569 byte-6 byte terima kasih @Arnauld. Paling banyak dukungan 32-bit
Cobalah online!
Input sebagai string.
sumber
Jelly , 9 byte
Lihat ruang tes!
Alternatif
Tidak berfungsi untuk kasus uji besar karena masalah presisi.
Lihat ruang tes!
Bagaimana?
Program I
Program II
sumber
Python 2 ,
7270 byteCobalah online!
sumber
JavaScript, 59 byte
Cobalah online!
Membangun regex seperti
/^(1|0*2|0*4|0*8|0*16|0*32|…|0*1)+$/
kekuatan 2, dan mengujinyas
.Hanya bekerja hingga ketepatan angka JavaScript, tentu saja: akhirnya istilah dalam regex akan terlihat seperti
1.2345678e30
(atauInf
). Tetapi karena kekuatan 2 mudah untuk diwakili secara akurat dalam floating-point, mereka tidak akan pernah salah bilangan bulat yang , yang akan lebih mendiskualifikasi, saya pikir.@tsh menyimpan 14 byte. Neato!
sumber
Python 2 , 85 byte
Cobalah online!
sumber
Perl 6 ,
282423 byte-4 byte terima kasih kepada Jo King
Cobalah online!
Menangani kekuatan hingga 2 31 .
sumber
0*
yang diinterpolasiAPL (NARS), 154 karakter, 308 byte
Fungsi untuk latihan itu adalah h. Algoritme tampaknya bukan uji eksponensial atau faktorial:
sumber
Python 2 , 57 byte
Cobalah online!
sumber
Python 2 , 86 byte
Cobalah online!
sumber
Ruby , 55 byte
Cobalah online!
Output adalah
0
jika benar dannil
jika salah.sumber
Ruby , 49 byte
Cobalah online!
Hanya bekerja secara teori. Dibutuhkan selamanya untuk nilai besar
n
sumber
PHP, 101 byte
Tampaknya tidak bisa mendapatkan ini di bawah 100; tapi aku bisa mendapatkannya untuk 100 jika
101
adalah kasus falsy.variasi:
PHP 5 atau lebih tua, 95 byte
sumber
Merah ,
212211 byteCobalah online!
Satu lagi pengajuan panjang, tapi saya sama sekali tidak puas, karena tidak ada built-in untuk menemukan semua substring di Red.
Lebih mudah dibaca:
sumber
Aksioma, 198 byte
ungolf dan tes
sumber
Japt
-!
, 12 byteMengambil input sebagai string.
Cobalah
sumber
0
kasus outputtrue
dan karenanya kasus seperti1010
juga keluarantrue
.C # 157 byte
Anda dapat mencobanya secara online
sumber
APL (NARS), 70 karakter, 140 byte
uji:
saya tidak mencoba untuk melakukan angka lebih besar lainnya ... saya harus mencatat bahwa P bukan partisi normal, tetapi itu adalah satu partisi di mana semua elemen adalah himpunan bagian yang memiliki anggota semua berturut-turut, misalnya
perhatikan bahwa tidak ada elemen ((ac) (b)) atau lebih baik ,, ¨ ('ac') 'b'
sumber
POSIX ERE, 91 byte
Ini benar-benar curang, berdasarkan teks angka besar (tidak benar-benar perlu ditangani oleh kode Anda) dalam pertanyaan; ini menangani semua nilai dalam rentang ukuran contoh. Jelas dapat diperpanjang hingga jangkauan penuh tipe integer 32 atau 64-bit dengan mengorbankan ukuran. Saya terutama menulisnya sebagai demonstrasi bagaimana masalah itu secara alami cocok dengan alat itu. Latihan yang menyenangkan akan menulis ulangnya sebagai program yang menghasilkan ERE untuk rentang sewenang-wenang kemudian cocok dengan itu.
sumber
C (gcc) ,
-DA=asprintf(&c,
+ 108 = 124 byteCobalah online!
Ini membangun regex dari kekuatan 2 hingga 2 ** 32, dan kemudian mencocokkan string input dengan itu.
sumber
Powershell, 56 byte
Skrip uji:
Keluaran:
Penjelasan:
Membangun regex seperti
^(0*1|0*2|0*4|0*8|0*16|0*32|…)+$
kekuatan 2, dan mengujinya pada argumen.sumber
JavaScript (Node.js) , 56 byte
Cobalah online!
sumber