Вступ
У нас в минулому було декілька базових проблем перетворення, але не так багато було розроблено для вирішення довільних чисел довжини (тобто числа, достатньо довгі, щоб вони переповнювали цілий тип даних), і тих, які більшість відчували себе трохи складний. Мені цікаво, як можна змінити такий базовий код, як цей.
Виклик
Напишіть програму або функцію на обраній вами мові, яка може перетворити рядок однієї бази в рядок іншої бази. Вхідним елементом має бути число, яке потрібно перетворити (рядок), від-base (число базової-10), базове (число базового-10) та набір символів (рядок). На виході має бути перетворене число (рядок).
Деякі подальші деталі та правила такі:
- Число для перетворення буде невід'ємним цілим числом (так як
-
і.
може бути в наборі символів). Так буде і вихід. - Провідні нулі (перший символ у наборі символів) слід обрізати. Якщо результат дорівнює нулю, повинна залишитися одна нульова цифра.
- Мінімальний підтримуваний базовий діапазон становить від 2 до 95, що складається з друкованих символів ascii.
- Вхід для числа, яке потрібно перетворити, набору символів та виводу має бути типом даних рядка. Бази повинні мати цілочисельний тип даних базового 10 (або цілочисельні плавці).
- Довжина рядка вхідного числа може бути дуже великою. Важко підрахувати розумний мінімум, але сподівайтеся, що він зможе обробляти щонайменше 1000 символів та виконати 100 символів за менш ніж 10 секунд на пристойній машині (дуже щедрий для подібних проблем, але я не хочу швидкість бути фокусом).
- Ви не можете використовувати вбудовані функції зміни бази.
- Введення набору символів може бути в будь-якому розташуванні, а не тільки в типових 0-9a-z ... і т.д.
- Припустимо, що буде використовуватися лише дійсний ввід. Не турбуйтеся про помилки.
Переможець визначатиметься за найкоротшим кодом, який відповідає критеріям. Вони будуть відібрані щонайменше за 7 базових 10 днів, або якщо / коли було достатньо заявок. У разі вирівнювання, переможець стане кодом, який працює швидше. Якщо швидкість / продуктивність достатньо близька, відповідь, що прийшла раніше, перемагає.
Приклади
Ось кілька прикладів введення та виводу, з якими ваш код повинен вміти обробляти:
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
? Зокрема, чи можу я використовувати вбудований для перетворення входу на проміжну базу? Чи можу я потім використовувати вбудований для перетворення на цільову базу? Хоче щось 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
?