Mengingat dua sewenang-wenang yang tepat desimal angka 0 ≤ x < y ≤ 1, menghitung terpendek (dalam angka) biner nomor b sehingga x ≤ b < y .
Keluarkan digit biner b setelah titik biner sebagai array atau string nol dan satu. Perhatikan bahwa array kosong berarti 0,0, berdasarkan penghapusan nol trailing. Ini juga memastikan bahwa ada jawaban unik yang benar untuk rentang apa pun.
Jika Anda tidak terbiasa dengan angka pecahan biner, angka itu berfungsi seperti angka desimal:
Base 10 0.625 = 0.6 + 0.02 + 0.005 = 6 x 10^-1 + 2 x 10^-2 + 5 x 10^-3
Base 2 0.101 = 0.1 + 0.00 + 0.001 = 1 x 2^-1 + 0 x 2^-2 + 1 x 2^-3
| | |
v v v
Base 10 0.625 = 0.5 + 0 + 0.125
Built-in yang meremehkan masalah ini tidak diizinkan.
Contoh:
0.0, 1.0 -> ""
0.1, 1.0 -> "1"
0.5, 0.6 -> "1"
0.4, 0.5 -> "0111"
Kode terpendek menang.
(0.98983459823945792125172638374187268447126843298479182647, 0.98983459823945792125172638374187268447126843298479182648)
? Juga, uji kasus akan sangat membantu.Jawaban:
CJam, 46
Cobalah online
Penjelasan:
Gagasan umum adalah: kalikan kedua angka dengan 10 eksponen cukup besar untuk mendapatkan bilangan bulat, kalikan lagi dengan 2 eksponen cukup besar untuk "memberi ruang" untuk digit biner dalam bentuk bilangan bulat, integer-bagi kembali dengan 10 eksponen pertama , kurangi angka (untuk sampai ke kasus "x <b ≤ y") dan mengonversi hasilnya menjadi basis 2. Temukan digit berbeda pertama (akan menjadi 0 pada angka pertama dan 1 pada angka kedua), dan cetak semua digit dari nomor kedua hingga dan termasuk yang itu.
Sebelum memulai dengan perkalian, saya menambahkan 3 ke bagian integer untuk memastikan bahwa hasilnya memiliki jumlah digit biner yang sama (tanpa nol di depan) setelah dikurangi. Pada akhirnya, saya melewatkan 2 digit biner pertama untuk mengkompensasi.
sumber
Ruby,
138132 byte13 byte ditambahkan untuk
-rbigdecimal
bendera. Mengharapkan input sebagai duaBigDecimal
s.Contoh dijalankan:
Penjelasan:
sumber
Mathematica, 72 byte
Penjelasan
Metode ini adalah untuk menemukan pengganda bentuk terkecil
2^n
yang memperbesar kesenjangan antara dua angka input sehingga berisi bilangan bulat.Misalnya
16*{0.4,0.5} = {6.4,8.}
berisi7
, jadi jawabannya adalah7/16
.Kasus cobaan
sumber
JavaScript (ES6), 144 byte
Mengasumsikan input dalam formulir
0.<digits>
(atau1.<zeros>
dapat diterima untuky
).d
adalah fungsi yang mengambil bagian desimal dari angka dan menggandakannya, lalu memangkas angka nol. Digit terdepan harus ada tetapi diabaikan. Nyamand("0.0")
kosong, dan karena itu ini digunakan sebagai tes untuk melihat apakahx
fraksi biner yang tepat; dalam hal inib
sudah memegang hasilnya. Jika tidak, ada tes agak berbelit-belit untuk menentukan apakah suffixing sebuah1
keb
servis untuk membedakan antarax
dany
; jika demikian dikembalikan. Kalau tidak, MSB darix
suffixed ke hasil dan fungsi memanggil dirinya secara rekursif untuk memproses bit berikutnya.Jika sebaliknya kita menginginkan
x < b ≤ y
fungsi lebih sederhana, sesuatu seperti ini (belum diuji):sumber