Преобразовать целое число в основание 26, используя цифры от a до z

Мне нужно реализовать десятичный преобразователь в символы. У меня есть 26 доступных символов, так что речь идет о преобразовании целого числа в основную систему 26, а затем о замене каждого числа на его алфавитный аналог. Я не хочу использовать символы 0-9 в итоговой строке результата. я могу использовать to_s() метод, и вот как это происходит:

82.to_s(26)  #=> "34" / which gives me "de"
120.to_s(26)  #=> "4g" / which should give me "aep", but it's not

Рубин to_s() Метод возвращает значение в формате, который не является полезным. Число 82 преобразуется нормально, но преобразование 120 возвращает значение, я понятия не имею, как справиться.

Может ли кто-нибудь объяснить, как я могу сделать преобразование 120 (в качестве примера) возврата aep эквивалент? Другими словами, как конвертировать из десятичной базы в 26, но без использования чисел в выводе?

1 ответ

Решение

Руби Fixnum#to_s( base ) а также String#to_i( base ) предназначены для представления чисел в разных базах. Вы не можете использовать произвольные символы с ними, хотя, они разработаны, чтобы быть совместимыми с соглашениями для hex и base64 среди других вещей.

Если вы не конвертируете в другую базу, а просто кодируете десятичные цифры в виде букв и обратно, тогда вам понадобится простая замена:

46.to_s.tr( "0123456789", "abcdefghijk" )
=> "eg"

"eg".tr( "abcdefghijk", "0123456789" ).to_i
=> 46

Итак, если вы хотите сделать оба, и используйте az, чтобы представить свой номер в базе 26:

46.to_s(26).tr( "0123456789abcdefghijklmnopq", "abcdefghijklmnopqrstuvwxyz" )
=> "bu"

"bu".tr( "abcdefghijklmnopqrstuvwxyz", "0123456789abcdefghijklmnopq" ).to_i(26)
=> 46
Другие вопросы по тегам