Latar Belakang
Sebuah basis bijective b penomoran , di mana b adalah bilangan bulat positif, adalah notasi posisional bijective yang menggunakan b simbol dengan nilai-nilai terkait dari 1 ke b .
Tidak seperti mitra non-bijektifnya, tidak ada simbol yang memiliki nilai 0 . Dengan cara ini, setiap bilangan bulat n -negatif memiliki representasi unik dalam basis kata sifat b .
Angka bijective populer termasuk unary, basis bijective 2 (digunakan dalam pengkodean run-length bzip2 ) dan basis bijective 26 (digunakan untuk memberi nomor kolom dalam spreadsheet).
Definisi
Dalam tantangan ini, kita mendefinisikan himpunan M simbol sebagai
123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz<=>
dan fungsi i dari M ke bilangan asli sedemikian sehingga i ('1') = 1,…, i ('>') = 64 .
Mengingat basis b antara 1 dan 64 (keduanya inklusif), kita mendefinisikan bahwa setiap bilangan bulat non-negatif n bersesuaian dengan string yang k ... a 0 , yang terdiri dari simbol M , sehingga n = b k i (a k ) + … + B 0 i (a 0 ) .
Korespondensi ini didefinisikan dengan baik dan bijektif. Karena jumlah kosong didefinisikan sebagai 0 , bilangan bulat 0 dapat dikodekan sebagai string kosong.
Tugas
Terima tiga string sebagai input:
Basis input b antara 1 dan 64 , dikodekan sebagai string basis 64 kata sifat .
Sebuah bilangan bulat non-negatif n , dikodekan sebagai dasar bijective b tali.
Basis keluaran B antara 1 dan 64 , dikodekan sebagai basis bijective 64 string.
Dengan ketiga input ini, enkode n sebagai string B berbasis kata sifat bi .
Uji kasus
Semua kasus uji menentukan input dalam urutan b , n , B .
Input: "4" "" "8"
Output: ""
Input: "A" "16" "2"
Output: "1112"
Input: "2" "122" "A"
Output: "A"
Input: "3" "31" "1"
Output: "1111111111"
Input: ">" "Fe" "a"
Output: "RS"
Aturan
Anda dapat membaca tiga string dalam urutan yang mudah, dengan demikian, array string, representasi stringnya, digabungkan atau dipisahkan oleh pembatas karakter tunggal pilihan Anda.
Jika Anda memilih untuk mencetak output ke STDOUT, Anda hanya dapat mencetak simbol dan (opsional) baris baru.
Basis konversi bawaan semua jenis diperbolehkan.
Aturan standar kode-golf berlaku.
sumber
Pip,
848078 byteRepositori GitHub untuk Pip
Algoritma diadaptasi dari artikel Wikipedia. Berikut ini penjelasan untuk versi sebelumnya yang sedikit tidak ungolfed:
Contoh dijalankan:
sumber
Oktaf, 166 byte
Versi multi-baris:
Daripada membuat peta untuk mengkonversi karakter ke nilai indeks, saya hanya membuat tabel pencarian terbalik
N
untuk nilai ascii1..'z'
dan mengisinya dengan indeks pada nilai yang sesuai.polyval
mengevaluasi persamaanmenggunakan nilai input yang dikonversi dengan desimal sebagai vektor koefisien
c
dan basis asalnyax
. (Sayangnya, Octavebase2dec()
menolak simbol di luar kisaran normal.)Setelah kami memiliki nilai input pada basis 10, perhitungan nilai pada basis baru menjadi mudah.
Tes driver:
Hasil:
sumber
Perl,
261248229 bytemulti-line, sedangkan loop tidak disatukan:
t
adalah fungsi untuk mengurai angka dari string bijective-base dari basis yang diberikan.r
adalah fungsi untuk menghasilkan string bijective-base dari basis yang diberikan dari angka. 3 parameter yang dipisahkan koma diurai dari stdin dan fungsinya disebut sesuai kebutuhan.Mengonversi angka positif ke string basis bijective mirip dengan basis normal. Namun di mana Anda akan melakukan sesuatu seperti ini untuk basis normal:
Anda menyesuaikan mod untuk memberikan rentang dari 1 ke basis, bukan 0 ke basis - 1:
sumber
Python 2, ...
317307298311 byteJelas golf. Saya benar-benar benci bagaimana string tidak memiliki tugas item dan daftar tidak memiliki
find
. Saya akan mencari cara yang lebih baik daripada perbaikan cepat yang saya miliki sekarang.Metode saya adalah mengonversi input ke angka desimal, lalu ke basis output, lalu mengonversinya ke basis bijective.
Sunting : Ditemukan bahwa program saya tidak berfungsi saat mengonversi ke Unary. Biayanya 13 byte untuk diperbaiki
e=F(o)<2
, dll.Coba di sini
sumber
.index()
metode .. Mengapa tidak menggunakannya daripada mencari? Selain itu, alih-alih menyimpanF(b)
danF(o)
ke variabel, Anda hanya menggunakannya sekali, jadi hanya subkan jika diperlukan. Akhirnya,'n'[2::5]
lebih pendek dari''.join(n)
(ganti apostrof untuk backticks).Python 2, 167 Bytes
Tidak ada trik khusus di sini, kecuali untuk
[2::5]
memotong untuk mendapatkan charset dengan jumlah byte yang lebih rendah.Tes:
sumber
CJam,
737069555148 byteVersi terbaru menggunakan operator konversi basis CJam untuk konversi dari basis sumber, yang saya tidak memikirkan sampai saya melihat solusi @ aditsu. Ini juga menerapkan tip terbaru oleh @Dennis untuk membuat string "digit" ( /codegolf//a/54348/32852 ), serta beberapa ide lain yang dibagikan dalam obrolan.
Format input adalah nilainya, diikuti oleh basis sumber dan tujuan, dengan masing-masingnya pada baris terpisah. Untuk string kosong, biarkan baris pertama kosong. Input contoh:
Cobalah online
Penjelasan:
sumber
Jelly , 22 byte
Cobalah online!
sumber