Kami memiliki banyak tantangan berdasarkan pada basis 10, basis 2, basis 36, atau bahkan basis -10 , tetapi bagaimana dengan semua basis rasional lainnya?
Tugas
Diberikan bilangan bulat di basis 10 dan basis rasional, kembalikan integer di basis itu (sebagai array, string, dll.).
Proses
Sulit membayangkan dasar yang rasional, jadi mari kita bayangkan dengan menggunakan Exploding Dots :
Pertimbangkan animasi ini, dengan mengekspresikan 17 pada basis 3:
Setiap titik mewakili satuan, dan kotak mewakili angka: kotak paling kanan adalah tempat seseorang, kotak tengah adalah tempat 3 ^ 1, dan kotak paling kiri adalah tempat 3 ^ 2.
Kita bisa mulai dengan 17 titik di tempat seseorang. Namun, ini adalah basis 3, jadi tempat yang harus kurang dari 3. Oleh karena itu, kami "meledak" 3 titik dan membuat sebuah titik pada kotak di sebelah kiri. Kami ulangi ini sampai kami memiliki posisi stabil tanpa titik yang dapat meledak (yaitu 3 titik di kotak yang sama).
Jadi 17 di basis 10 adalah 122 di basis 3.
Basis pecahan adalah analog dengan meledaknya sejumlah titik menjadi lebih dari satu titik. Basis 3/2 akan meledak 3 titik untuk membuat 2.
Mengekspresikan 17 dalam basis 3/2:
Jadi 17 di basis 10 adalah 21012 di basis 3/2.
Basis negatif bekerja dengan cara yang sama, tetapi kita harus melacak tanda-tanda (menggunakan apa yang disebut anti-dots, sama dengan -1; diwakili oleh lingkaran terbuka).
Mengekspresikan 17 dalam basis -3:
Catatan, ada ledakan tambahan untuk membuat tanda semua kotak sama (mengabaikan nol).
Jadi, 17 pada basis 10 adalah 212 pada basis -3.
Basis rasional negatif bekerja sama, dalam kombinasi dari dua kasus di atas.
Aturan
- Tidak ada celah standar.
- Tanda setiap "digit" pada output harus sama (atau nol).
- Nilai absolut dari semua digit harus kurang dari nilai absolut pembilang dari basis.
- Anda dapat mengasumsikan bahwa nilai absolut dari pangkalan lebih besar dari 1.
- Anda dapat berasumsi bahwa basis rasional adalah dalam bentuk tereduksi terendah.
- Anda dapat mengambil pembilang dan penyebut basis secara terpisah dalam input.
- Jika angka memiliki beberapa representasi, Anda dapat menampilkan salah satu dari mereka. (mis. 12 di base 10 bisa
{-2, -8}
dan{1, 9, 2}
di base -10)
Kasus uji:
Format: {in, base} -> result
{7, 4/3} -> {3, 3}
{-42, -2} -> {1, 0, 1, 0, 1, 0}
{-112, -7/3} -> {-6, -5, 0, -1, 0}
{1234, 9/2} -> {2, 3, 6, 4, 1}
{60043, -37/3} -> {-33, -14, -22, -8}
Karena beberapa input mungkin memiliki beberapa representasi, saya sarankan menguji output menggunakan potongan Mathematica ini di TIO.
Ini adalah kode-golf , jadi pengiriman dengan jumlah byte terpendek di setiap bahasa akan menang!
Untuk informasi lebih lanjut tentang titik-titik yang meledak, kunjungi situs web proyek matematika global ! Mereka memiliki banyak hal keren yang keren!
sumber
Jawaban:
Python 2 ,
4239 byteCobalah online!
Terima kasih kepada @xnor karena menemukan formulir yang lebih pendek.
Versi usang (42 byte):
Cobalah online!
Parameter: input, pembilang (dengan tanda) dan penyebut.
Mengembalikan array, digit terendah terlebih dahulu.
Ini hanya berfungsi karena pembagian dan modulo dalam Python mengikuti tanda penyebut, jadi kita tidak perlu peduli dengan tanda yang sama secara eksplisit.
Output kasus uji:
sumber
Aheui (esotope) , 91 byte
Cobalah online!
Membawa
integer
,numerator of base
, dandenominator of base
.Karena keterbatasan TIO interpreter, setiap input harus diakhiri dengan baris baru.
Penerapan jawaban @ Bubbler's Python 2 . Untungnya, juru bahasa Aheui ini ditulis dengan Python, jadi kita bisa menggunakan trik yang sama.
sumber
05AB1E ,
1110 byteCobalah online!
Mengambil
integer
,numerator of base
dandenominator of base
menyukai semua jawaban. Karena interpreter 05AB1E ditulis dalam Python (?), Trik jawaban Bubthon tentang Python 2 dapat digunakan dalam 05AB1E juga.Penjelasan
Jadi program ini bekerja kurang lebih sama dengan kode Python ini:
11> 10 Terima kasih, Neil
sumber
_
daripada di0Q
sini.