pengantar
Kami memiliki beberapa tantangan konversi basis di sini di masa lalu, tetapi tidak banyak yang dirancang untuk menangani angka panjang yang sewenang-wenang (yaitu, angka yang cukup panjang sehingga meluap datatype integer), dan dari mereka, yang paling terasa sedikit rumit. Saya ingin tahu bagaimana bisa mendapatkan perubahan kode dasar seperti ini.
Tantangan
Tulis program atau fungsi dalam bahasa pilihan Anda yang dapat mengubah string dari satu basis ke string dari basis lain. Input harus berupa angka yang akan dikonversi (string), dari-base (nomor basis-10), ke-base (nomor basis-10), dan set karakter (string). Output harus berupa angka yang dikonversi (string).
Beberapa perincian dan aturan lebih lanjut adalah sebagai berikut:
- Angka yang akan dikonversi akan berupa bilangan bulat non-negatif (karena
-
dan.
mungkin ada dalam rangkaian karakter). Demikian juga dengan hasilnya. - Memimpin nol (karakter pertama dalam rangkaian karakter) harus dipangkas. Jika hasilnya nol, satu digit nol harus tetap.
- Kisaran dasar minimum yang didukung adalah 2 hingga 95, terdiri dari karakter ascii yang dapat dicetak.
- Input untuk nomor yang akan dikonversi, set karakter, dan output semua harus dari tipe data string. Basis harus dari datatype integer basis-10 (atau integer float).
- Panjang string nomor input bisa sangat besar. Sulit untuk mengukur minimum yang masuk akal, tetapi mengharapkannya mampu menangani setidaknya 1000 karakter, dan menyelesaikan input 100 karakter dalam waktu kurang dari 10 detik pada mesin yang layak (sangat murah hati untuk masalah seperti ini, tapi saya tidak ingin kecepatan menjadi fokus).
- Anda tidak dapat menggunakan built-in fungsi perubahan basis.
- Input set karakter dapat dalam pengaturan apa pun, bukan hanya khas 0-9a-z ... dll.
- Asumsikan bahwa hanya input yang valid yang akan digunakan. Jangan khawatir tentang penanganan kesalahan.
Pemenang akan ditentukan oleh kode terpendek yang memenuhi kriteria. Mereka akan dipilih setidaknya dalam 7 basis-10 hari, atau jika / ketika ada cukup kiriman. Jika terjadi seri, kode yang berjalan lebih cepat akan menjadi pemenang. Jika cukup dekat dalam kecepatan / kinerja, jawaban yang datang sebelumnya menang.
Contohnya
Berikut adalah beberapa contoh input dan output yang harus dapat ditangani kode Anda:
F("1010101", 2, 10, "0123456789")
> 85
F("0001010101", 2, 10, "0123456789")
> 85
F("85", 10, 2, "0123456789")
> 1010101
F("1010101", 10, 2, "0123456789")
> 11110110100110110101
F("bababab", 2, 10, "abcdefghij")
> if
F("10", 3, 2, "0123456789")
> 11
F("<('.'<)(v'.'v)(>'.'>)(^'.'^)", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> !!~~~~~~~!!!~!~~!!!!!!!!!~~!!~!!!!!!~~!~!~!!!~!~!~!!~~!!!~!~~!!~!!~~!~!!~~!!~!~!!!~~~~!!!!!!!!!!!!~!!~!~!~~~~!~~~~!~~~~~!~~!!~~~!~!~!!!~!~~
F("~~~~~~~~~~", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> ~
F("9876543210123456789", 10, 36, "0123456789abcdefghijklmnopqrstuvwxyz")
> 231ceddo6msr9
F("ALLYOURBASEAREBELONGTOUS", 62, 10, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
> 6173180047113843154028210391227718305282902
F("howmuchwoodcouldawoodchuckchuckifawoodchuckcouldchuckwood", 36, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> o3K9e(r_lgal0$;?w0[`<$n~</SUk(r#9W@."0&}_2?[n
F("1100111100011010101010101011001111011010101101001111101000000001010010100101111110000010001001111100000001011000000001001101110101", 2, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> this is much shorter
You cannot use built in change-of-base functions to convert the entire input string/number at once
? Secara khusus, dapatkah saya menggunakan built-in untuk mengkonversi input ke basis perantara? Bisakah saya menggunakan built-in untuk mengonversi ke basis target? Akankah sesuatu seperticonvert input with canonical form for given base; convert to base 10; convert to target base; convert back to specified character set with string replacement
?Jawaban:
CJam, 34 byte
Format input
input_N alphabet input_B output_B
masing - masing pada baris yang terpisah.Jalankan semua test case.
Penjelasan
Ini berfungsi untuk jumlah byte yang sama:
Satu-satunya perbedaan adalah bahwa kami membuat string alih-alih mengumpulkan semua yang ada di tumpukan dan membalikkannya.
sumber
Python 2 ,
11511410610594 byteSaran golf diterima. Cobalah online!
Sunting: -9 bytes berkat mbomb007. -2 byte berkat FlipTack.
Tidak Terkumpul:
sumber
while z:s=d[z%t]+s;z/=t
menghemat 9 byte.z=0
dans=''
dalam deklarasi fungsi untuk menyimpan byte.print
bukannyareturn
yang diizinkan secara default .Serius, 50 byte
Hex Dump:
Saya bangga dengan yang satu ini meskipun panjangnya. Mengapa? Karena itu bekerja dengan sempurna pada percobaan kedua. Saya menulisnya dan mendebatnya dalam 10 menit. Biasanya debugging suatu program Serius adalah satu jam kerja.
Penjelasan:
sumber
C (fungsi) dengan perpustakaan GMP , 260
Ini ternyata lebih lama dari yang saya harapkan, tapi ini dia.
mpz_*
Barang - barang benar-benar memakan banyak byte. Saya mencoba#define M(x) mpz_##x
, tetapi itu memberikan keuntungan bersih 10 byte.Fungsi
F()
adalah titik masuk. Ia mengubah string input menjadimpz_t
perkalian secara beruntun denganfrom
-base dan penambahan indeks dari digit yang diberikan dalam daftar digit.Fungsi
O()
ini adalah fungsi keluaran rekursif. Setiap rekursi divmodsmpz_t
olehto
-base. Karena ini menghasilkan digit output dalam urutan terbalik, rekursi secara efektif memungkinkan digit disimpan di tumpukan dan output dalam urutan yang benar.Tes driver:
Baris baru dan indentasi ditambahkan agar mudah dibaca.
sumber
JavaScript (ES6), 140 byte
Tidak seperti kode @ Mwr247 (yang menggunakan basis-f aritmatika untuk membagi s dengan t setiap kali, mengumpulkan setiap sisa saat ia berjalan) Saya menggunakan aritmatika basis-t untuk melipatgandakan jawaban dengan f setiap kali, menambahkan setiap digit s saat aku pergi.
Tidak Terkumpul:
sumber
Ruby,
11311210598979587 byteSaya semacam memposting ganda jawaban Python saya (entah bagaimana), jadi inilah jawaban Ruby. Tujuh byte lagi berkat manatwork , satu byte lagi terima kasih kepada Martin Büttner , dan 8 byte lagi berkat cia_rana .
Tidak Terkumpul:
sumber
s=d[z%t]+s;z/=t
bukanz,m=z.divmod t;s=d[m]+s
?APL, 10 byte
Ini adalah operator APL. Di APL,
⍵
dan⍺
digunakan untuk meneruskan nilai, sementara⍵⍵
dan⍺⍺
biasanya digunakan untuk melewati fungsi. Saya menyalahgunakan ini di sini untuk memiliki 3 argumen.⍺⍺
adalah argumen kiri,⍵⍵
adalah argumen kanan "dalam", dan⍵
merupakan argumen kanan "luar".Pada dasarnya:
⍺(⍺⍺{...}⍵⍵)⍵
Maka semua yang diperlukan adalah
⍳
menemukan posisi string input dalam tabel "dari", dan kemudian gunakan[]
untuk mengindeks ke tabel "ke" dengan posisi ini.Contoh:
sumber
JavaScript (ES6), 175 byte
Saya pikir sudah cukup lama sekarang saya bisa mengirimkan yang saya buat untuk membuat contoh. Saya mungkin mencoba dan menurunkannya sedikit lebih baik nanti.
sumber
Japt, 9 byte
Cobalah
sumber