Tantangan Anda, jika Anda memilih untuk menerimanya, adalah, diberikan bilangan bulat K >= 1
, temukan bilangan bulat non-negatif A
dan B
setidaknya satu dari dua syarat berikut ini berlaku:
K = 2^A + 2^B
K = 2^A - 2^B
Jika tidak ada A
dan B
, program Anda mungkin berperilaku dengan cara apa pun. (Untuk memperjelas, A
dan B
bisa sama.)
Uji kasus
Seringkali ada beberapa solusi untuk suatu angka, tetapi berikut ini beberapa:
K => A, B
1 => 1, 0
15 => 4, 0 ; 16 - 1 = 15
16 => 5, 4 ; 32 - 16 = 16; also 3, 3: 8 + 8 = 16
40 => 5, 3 ; 2^5 + 2^3 = 40
264 => 8, 3
17179867136 => 34, 11 ; 17179869184 - 2048 = 17179867136
Kasing uji terakhir 17179867136
,, harus berjalan di bawah 10 detik pada mesin yang relatif modern. Ini adalah kode golf, jadi program terpendek dalam byte menang. Anda dapat menggunakan program atau fungsi lengkap.
16
, keduanya5,4
dan3,3
valid.A
,B
menjadi negatif? (mis.-1, -1
untuk 1)Jawaban:
Jelly ,
1110 byteMenerapkan trik memutar-mutar sedikit dari jawaban Python oleh @xnor
Uji di TryItOnline
Semua kotak uji juga ada di TryItOnline
Bagaimana?
sumber
Python 2, 43 byte
Katakan itu
n==2^a ± 2^b
dengana>b
. Kemudian, faktor kekuatan-2 terbesarn
adalah2^b
, dan kita bisa menemukannya menggunakan bit-trick2^b = n&-n
. Itu memungkinkan kita menghitung2^b + n
, yang sama dengan2^a + 2 * 2^b
atau adil2^a
. Salah satu memiliki panjang bit yang sama panjangnya dengana
*. Jadi, kami menampilkan bit-lengthsn&-n
dan(n&-n)+n
, dihitung dari panjang representasi binernya. Python 3 lebih panjang satu byte untuk parens difor k in(n,0)]
.* Kecuali bahwa
2^a + 2^b
dengana==b+1
memiliki panjang bit yang lebih panjang, tapi itu tidak masalah karena kita dapat mengartikannya sebagai2^(a+1)-2^b
.sumber
n=4
atau8
atau16
tolong.f(2**n)
kembali(n+1,n)
dan2**(n+1)-2**n=2**n
tidak ada masalah.bin()
dalam Python?0b
, karenanya-3
.JavaScript (ES6), 73 byte
Untuk kasus pengurangan, angka pertama adalah jumlah digit dalam representasi biner dan angka kedua adalah jumlah trailing nol. Untuk kasus tambahan, kita kurangi 1 dari angka pertama. Jika representasi biner adalah semua 1s diikuti oleh beberapa 0s maka kasus tambahan diasumsikan sebaliknya diasumsikan kasus pengurangan. Port 36 byte versi @ xnor yang hanya berfungsi untuk B≤30 dalam JavaScript:
sumber
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
Dan kedua versi kembali[34,11]
pada test case terakhir (Saya menggunakan FF 48).Perl,
524932 byteSolusi lama (49 byte)
Termasuk +1 untuk
-p
Berikan masukan pada STDIN:
pow2.pl
Namun, menggunakan algoritma xnor dan menambahkan twist memberikan 32 byte:
Hanya kode:
Ini menderita kesalahan pembulatan parah karena
13/9 = 1.444...
sedikit di atas1/log 2 = 1.44269...
(log
itu sendiri juga memiliki kesalahan pembulatan tetapi itu jauh lebih kecil sehingga kita dapat membungkusnya dalam analisis 13/9). Tapi karena ada yang2**big - 2** small
diperbaiki2** big
sebelum log ini tidak mater dan perhitungan untuk2**big + 2 * 2**small
terpotong jadi juga aman .. Dan di sisi lain dari jangkauan2**n+2**(n-1)
tidak mendapatkan peningkatan yang cukup dalam kisaran[0,64]
(Saya tidak bisa dengan benar mendukung lebih dari rentang bilangan bulat karena penggunaan&
) untuk mengarah pada hasil yang salah (multiplicator1.5
namun akan terlalu jauh untuk jumlah yang besar).sumber
Brachylog , 23 byte
Cobalah online!
Ini jauh lebih cepat dari yang dibutuhkan, misalnya ini masih di bawah 10 detik pada TIO .
Penjelasan
Ini pada dasarnya adalah transkripsi langsung formula tanpa optimasi:
sumber
Python, 69 byte
Tes ada di ideone
Karena input yang tidak valid dapat melakukan apa saja, kita tahu bahwa jika inputnya persis 2 bit, maka jumlah itu adalah jumlah dari 2 kekuatan 2, dan sebaliknya (jika valid) itu akan menjadi sejumlah bit yang dijalankan (termasuk kemungkinan hanya 1 bit) dan akan menjadi perbedaan antara kekuatan tertinggi berikutnya 2 dari MSB dan set LSB.
sumber
7 JAWA,
142,140, 134 BYTESIni adalah posting pertama saya di PPCG! Saya akan sangat menghargai umpan balik tentang tips golf.
Terima kasih untuk membekukan karena menghemat 2 byte
UNGOLF
ideone
sumber
40=2**3+2**5
, misalnya. Melihat itu, saya tidak bisa melihat mengapa tidak, mungkin saya membuat kesalahan transkripsi ...1
alih-alih mendeklarasikan variabel untuknya?for(int i=-1,j;[...]
Mathematica,
5754 byteDisimpan 3 byte berkat LegionMammal978!
Sebenarnya mencetak semua 1 pasangan yang sesuai {a, b}.
2Log@#+1
adalah batas atas untuk terbesara
yang mungkin dapat muncul saat mewakili input#
(batas atas ketat adalah Log [2 #] / Log [2] = 1,44 ... Log [#] + 1). Berjalan hampir seketika pada input uji, dan dalam waktu kurang dari seperempat detik (pada komputer saya yang baru tetapi tidak tersedia) pada input 100 digit.1 Membiarkan
a
mulai dengan nilai default 1 bukannya 0 menghemat dua byte; itu menyebabkan output {0,0} dilewatkan ketika input 2, tetapi menemukan output {2,1} dalam kasus itu, yang cukup baik.sumber
If[Abs[2^a-#]==2^b,Print@{a,b}]
dapat diganti denganAbs[2^a-#]==2^b&&Print@{a,b}
untuk menyimpan 3 byte.)MATL ,
2322 byteCobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Perl 6 , 41 byte
(Algoritma disalin tanpa malu-malu dari jawaban Perl 5 )
Penjelasan:
Pemakaian:
sumber
PHP, 73 byte
Saya bisa menyalin solusi Jonathan Pyhton 2 untuk 54 byte (+13 overhead),
tetapi ingin datang dengan sesuatu yang berbeda.
simpan ke file, lalu jalankan dengan
php
atauphp-cgi
.cetakan
a
danb
dipisahkan oleh garis bawah, apa pun tanpa solusi.solusi khas, 96 byte
cetakan
a
danb
dipisahkan oleh garis bawah; satu-satunya garis bawah tanpa solusi.Bahkan memberi tahu Anda operasi untuk 11 byte lebih:
Cukup ganti garis bawah pertama dalam kode dengan
'-+'[!$m[2]]
.sumber
PHP, 117 Bytes
Versi diperpanjang 4 Kasus
serikat versi pendek Kasus 1 dan 3 dan membuat Perbedaan ke Kasus 3 dan di kedua versi Kasus 4 tidak menghasilkan output.
sumber