Преобразовать целое число в основание 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