Basis gila tapi rasional

11

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:

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

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 , 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!

JungHwan Min
sumber
Terkait
JungHwan Min

Jawaban:

6

Python 2 , 42 39 byte

n,a,b=input()
while n:print n%a;n=n/a*b

Cobalah online!

Terima kasih kepada @xnor karena menemukan formulir yang lebih pendek.

Versi usang (42 byte):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

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:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]
Bubbler
sumber
4
Tidak seperti biasanya, sepertinya program lebih pendek .
xnor
@ xnor Terima kasih, saya selalu lupa cara menulis sesuatu ...
Bubbler
4

Aheui (esotope) , 91 byte

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

Cobalah online!

Membawa integer, numerator of base, dan denominator 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.

JungHwan Min
sumber
4
o_O apa-apaan bahasa ini ... D:
HyperNeutrino
3

05AB1E , 11 10 byte

[D_#²‰`,³*

Cobalah online!

Mengambil integer, numerator of basedan denominator of basemenyukai semua jawaban. Karena interpreter 05AB1E ditulis dalam Python (?), Trik jawaban Bubthon tentang Python 2 dapat digunakan dalam 05AB1E juga.

Penjelasan

[D_ # ² ‰ `, ³ *
[Infinite Loop
 D_ # Jika angkanya 0, keluar dari loop (input implisit
                                         dalam iterasi pertama)
     ² Dapatkan pembilang basis
      ‰ Divmod
       `Dorong semua elemen ke dalam tumpukan
        , Cetak sisanya
         ³ Dapatkan penyebut basis
          * Lipat gandakan.

Jadi program ini bekerja kurang lebih sama dengan kode Python ini:

i1, i2, i3 = input ()
tumpukan = []
sementara 1:
 stack = (stack atau [i1])
 tumpukan + = [tumpukan [-1]]
 jika tidak menumpuk [-1]: istirahat
 tumpukan + = [i2]
 stack = tumpukan [: - 2] + [divmod (tumpukan [-2], tumpukan [-1])]
 stack = tumpukan [: - 1] + daftar (tumpukan [-1])
 tumpukan cetak [-1]
 tumpukan = tumpukan [: - 1]
 tumpukan + = [i3]
 stack = stack [: - 2] + [stack [-2] * stack [-1]]

11> 10 Terima kasih, Neil

Shieru Asakoto
sumber
Saya pikir Anda bisa menggunakannya _daripada di 0Qsini.
Neil
@Neil Oh benar, saya lupa tentang boolean negatif!
Shieru Asakoto