Kami memiliki beberapa tantangan untuk konversi basis, tetapi semuanya tampaknya berlaku untuk nilai integer. Mari kita lakukan dengan bilangan real!
Tantangan
Input:
- Angka positif x nyata , dinyatakan dalam basis 10. Ini dapat diambil sebagai pelampung presisi ganda atau sebagai string. Untuk menghindari masalah presisi, angka tersebut dapat dianggap lebih besar dari 10 −6 dan kurang dari 10 15 .
- Sebuah basis sasaran b . Ini akan menjadi bilangan bulat dari 2 hingga 36.
- Sejumlah digit fraksional n . Ini akan menjadi bilangan bulat dari 1 hingga 20.
Output: the representasi dari x dalam basis b dengan n pecahan digit.
Saat menghitung ekspresi output, digit di luar n -th harus dipotong (tidak dibulatkan). Misalnya, x = 3.141592653589793
dalam basis b = 3
adalah 10.0102110122...
, jadi untuk n = 3
output akan menjadi 10.010
(pemotongan), bukan 10.011
(pembulatan).
Untuk x dan b yang menghasilkan jumlah digit hingga dalam bagian fraksional, representasi tak hingga yang ekivalen (terpotong menjadi n digit) juga diperbolehkan. Misalnya, 4.5
dalam desimal juga dapat direpresentasikan sebagai 4.49999...
.
Jangan khawatir tentang kesalahan floating point .
Format input dan output
x akan diberikan tanpa nol di depan. Jika x adalah bilangan bulat, Anda dapat mengasumsikan bahwa itu akan diberikan dengan bagian nol desimal ( 3.0
), atau tanpa bagian desimal ( 3
).
Outputnya fleksibel. Misalnya, itu bisa:
- Sebuah string yang mewakili angka dengan pemisah yang cocok (titik desimal) antara bagian bilangan bulat dan pecahan. Digit
11
,12
dll (untuk b di atas 10) dapat direpresentasikan sebagai hurufA
,B
seperti biasa, atau sebagai karakter berbeda lainnya (harap sebutkan). - String untuk bagian integer dan string lain untuk bagian fraksional.
- Dua array / daftar, satu untuk setiap bagian, berisi angka dari
0
hingga35
sebagai digit.
Satu-satunya batasan adalah bagian integer dan fraksional dapat dipisahkan (pemisah yang sesuai) dan menggunakan format yang sama (misalnya, tidak [5, 11]
untuk daftar yang mewakili bagian integer dan ['5', 'B']
untuk daftar yang mewakili bagian fraksional).
Aturan tambahan
- Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang.
- Kode terpendek dalam byte menang.
Uji kasus
Output ditampilkan sebagai string dengan angka 0
, ..., 9
, A
, ..., Z
, menggunakan .
sebagai pemisah desimal.
x, b, n -> output(s)
4.5, 10, 5 -> 4.50000 or 4.49999
42, 13, 1 -> 33.0 or 32.C
3.141592653589793, 3, 8 -> 10.01021101
3.141592653589793, 5, 10 -> 3.0323221430
1.234, 16, 12 -> 1.3BE76C8B4395
10.5, 2, 8 -> 1010.10000000 or 1010.01111111
10.5, 3, 8 -> 101.11111111
6.5817645, 20, 10 -> 6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10 -> 0.94N2MGH7G8
12944892982609, 29, 9 -> PPCGROCKS.000000000
sumber
42, 13, 1
bisakah kita memiliki,33
bukan33.0
?n
angka desimalJawaban:
Jelly , 16 byte
Cobalah online!
Perhatikan bahwa lajang dicetak sebagai elemen dalam output.
sumber
JavaScript (ES8),
817471 byteBerfungsi untuk
x
antara1e-6
dan1e21
,b
dari2
ke36
(persis seperti yang diperlukan) dann
dari1
ke apa pun10
hingga48
bergantung pada basis sebelum kesalahan floating-point merayap masuk. Edit: Menyimpan 7 byte dengan bantuan dari @Birjolaxew. Menyimpan 3 byte lebih lanjut dengan bantuan dari @tsh. Versi 74 byte sebelumnya juga bekerja dengan angka negatif:sumber
n
"digit" dari string..toString(b)
... bodoh saya> _ <Python 2 ,
153149144137135109 byteTidak memperhatikan saya hanya bisa mengembalikan digit sebagai angka, sehingga membuatnya jauh lebih sederhana. Mengembalikan dua daftar digit, pertama untuk bagian integer, kedua untuk fraksional.
Cobalah online!
sumber
1e-6
(dan kurang dari1e15
, seperti sebelumnya)Perl 6 , 25 byte
Cobalah
Diperluas:
Perhatikan bahwa ruang sehingga parsing sebagai
(+x).base(b,n)
tidak
+( x.base(b,n) )
.sumber
1e-6
(dan kurang dari1e15
, seperti sebelumnya)Mathematica, 158 byte
karena tantangan ini sudah mendapat jawaban yang sangat bagus dalam mathatica oleh @KellyLowder, saya mencoba untuk menghasilkan (dengan pendekatan yang berbeda) hasil yang tepat seperti yang ditunjukkan dalam kasus uji
memasukkan
keluaran
sumber
Ruby , 45 byte
Mengapa?
Karena b ^ n dalam basis b adalah 10 ^ n, kita mengalikan x dengan angka itu, dan kemudian menambahkan titik desimal di mana ia berada.
Cobalah online!
sumber
.round
dengan.to_i
; ini memperbaiki digit terakhir dari output untuk yang tidak sesuai dengan output pengujian. -1 byte lebih banyak dengan menggunakan.insert ~n,?.
, tanpa tanda kurung.C (gcc) ,
157152 bytePerlu 64 bit
long int
untuk ini agar bisa bekerja dengan case uji yang lebih besar-5 byte terima kasih kepada Peter Cordes
Cobalah online!
sunting: beberapa byte dapat dicukur jika diizinkan untuk menghasilkan dua string yang dipisahkan oleh pemisah baris baru:
149 byte:
sunting: kiriman ini bukan yang terpanjang, yay!
sumber
printf(z+r)
jika tidak mengandung%
karakter apa pun . (Ini adalah kode-golf; keamanan dan praktik-praktik baik keluar jendela: P). Anda juga dapat menggunakanputs(z+r)
untuk mendapatkan baris baru secara gratis (menyimpanputs("")
dalam versi kedua).float
lebih pendek daridouble
, tetapi tampaknya pertanyaannya memang membutuhkandouble
input string atau.long
, dan sesuai dengan aturan kode-golf itu saja yang Anda butuhkan agar jawaban Anda valid. (Juga, itu biasa untuk C dan C ++ jawaban kode-golf untuk mengasumsikan 64-bitlong
, karena itulah yang digunakan Try It Online.) Saya sarankan memutar kembali hasil edit Anda, dan hanya menambahkan catatan seperti "long
harus 64-bit untuk ini untuk mendukung kasus uji yang lebih besar. "Mathematica 47 Bytes
Memanggil
RealDigits
dua kali untuk pertama mengetahui angka digit di sebelah kiri desimalsumber
1e-6
(dan kurang dari1e15
, seperti sebelumnya)TakeDrop@@RealDigits[##]
& tetapi kemudian saya menyadari bahwa saya telah salah membaca - solusi Anda tampaknya optimal.SageMath , 68 byte
Cobalah online!
sumber
1e-6
(dan kurang dari1e15
, seperti sebelumnya)Haskell , 188 byte
Cobalah online!
g
mengonversi angka menjadi daftar yang menunjukkan angka itu di basis tertentuz
memetakan bilangan bulat ke huruf (36 = .
)h
menerapkan fungsi sebelumnya ke bagian bilangan bulat dan pecahan angka.sumber
Aksioma, 566 byte
pertanyaan ini sulit; setelah beberapa saat menulis sesuatu, hasil yang tepat tampaknya menghasilkan menggunakan satu makro untuk mempertahankan digit () ... itu tidak golf terlalu banyak ... hasil:
target sebenarnya adalah satu fungsi yang dikonversi ke basis 2..36 setiap Float [yang memiliki k: = digit ()] atau setiap angka yang dihitung sebagai% pi atau% e atau pembagian dua float / int seperti pada 1./3 . ['oo' digit]
sumber
Aksioma, 127 byte
hasil
Ini memiliki sedikit masalah untuk contoh nol akhir
Akan kembali '4,5' dan bukan '4,50000'
sumber