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 seperti convert input with canonical form for given base; convert to base 10; convert to target base; convert back to specified character set with string replacement
?