Форум сайта python.su
Вводятся некоторые символы из
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '*']
Отредактировано ssid (Дек. 27, 2013 19:13:43)
Офлайн
исходные adbd это в системе с основанием 63 ?
“а” вместо нуля ? или система с основанием 64 ?
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '*'] def ff(number): res = 0 for i,x in enumerate(number[::-1]): res += arr.index(x)*(len(arr)*i+1) return int(res) def unff(number): res = "" while number > 0: y = arr[number % len(arr)] res = y + res number = int(number / len(arr)) return res
Отредактировано Singularity (Дек. 27, 2013 18:35:59)
Офлайн
Singularity, спасибо, но ваш вариант работает как-то неправильно:
>>> ff('0') 61 >>> unff(61) '0' # ok
>>> unff(1443) 'w6' >>> ff('w6') 1465 #?!
>>> unff(611) 'jS' >>> ff('jS') 620 #?!!
Отредактировано ssid (Дек. 27, 2013 19:51:09)
Офлайн
Я новичок в Питоне и поэтому программы мои не претендуют на лаконичность, зато дают функционал
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '*'] """ Список со знаками системы счисления в порядке возрастания. """ BASE_OF_ARR_DIGIT = len(arr) """ Основание arr-системы счисления. """ # print "Base of our digit system is ", BASE_OF_ARR_DIGIT """ Алгоритм решения: создаём первую функцию decimal_into_arr() для перевода десятичного числа в arr-число по схеме - оцениваем разрядность десятичного числа - переводим его в строковую величину и считаем количество символов, замечая, что BASE_OF_ARR_DIGIT ** 5 примерно равно 10 ** 10, таким образом на каждые два разряда десятичного числа будет приходится 1 разряд arr-числа. """ some_arr_string = "" some_decimal = 0 def decimal_into_arr(some_decimal_number): global some_arr_string some_arr_string = "" if some_decimal_number == 0: some_arr_string = "a" else: decimal_quantaty_digit = len(str(some_decimal_number)) # разрядность десятичного числа # print decimal_quantaty_digit # контрольная печать arr_quantaty_digit = int(decimal_quantaty_digit / 2) + 1 # проектная разрядность arr-числа с запасом for arr_digit in range(arr_quantaty_digit, -1, -1): # цикл построения arr-числа quasi_digit = some_decimal_number // (BASE_OF_ARR_DIGIT ** arr_digit) some_decimal_number = some_decimal_number % (BASE_OF_ARR_DIGIT ** arr_digit) quasi_digit_symbol = arr[quasi_digit] some_arr_string = some_arr_string + quasi_digit_symbol """ Так как в arr-системе символ 'a' это 0 (логический), то надо 'пооткусывать' для экономии незначащие первые символы 'a'. """ some_arr_string = some_arr_string.lstrip("a") # print some_arr_string return some_arr_string def arr_into_decimal(some_arr_number): global some_decimal some_decimal = 0 if some_arr_number == "a": some_decimal = 0 else: some_arr_number = some_arr_number.lstrip("a") arr_quantaty_digit = len(some_arr_number) - 1 for arr_digit in range(arr_quantaty_digit, -1, -1): quasi_digit = some_arr_number[arr_digit] some_decimal = some_decimal + (arr.index(quasi_digit)) * (BASE_OF_ARR_DIGIT ** arr_digit) # print some_decimal return some_decimal k = arr_into_decimal("bb") print k k = k + 1 print k m = decimal_into_arr(k) print m
Отредактировано Kustodiev_17 (Дек. 28, 2013 07:41:41)
Офлайн
Спасибо, но оба варианта “откусывают” вполне себе значащий 0.
(Он обозначает пустоту, но всё-таки нужен! Как вначале, так и в конце)
При проверке обоих:
63 != 1, ba, error!
т.е. с точки зрения функции любое a = 0, что неверно.
поэтому (ba) = 1 + 0 = 1, а не 63, как должно быть.
Офлайн
Точно, ошибка, недостаточно тестировал. Ну, ‘откусывание’ по определению слева, а то, что в моём коде было - собственно это и давало такой выхлоп.
Новая версия для второй функции (первую я достаточно тестировал, там должно всё работать, но всякое бывает):
def arr_into_decimal(some_arr_number): global some_decimal some_decimal = 0 if some_arr_number == "a": some_decimal = 0 else: some_arr_number = some_arr_number.lstrip("a") arr_quantaty_digit = len(some_arr_number) for arr_digit in range(1, arr_quantaty_digit + 1): quasi_digit = some_arr_number[(-1) * arr_digit] some_decimal = some_decimal + (arr.index(quasi_digit)) * (BASE_OF_ARR_DIGIT ** (arr_digit - 1)) # print some_decimal return some_decimal k = arr_into_decimal("ba") print k k = k + 1 print k m = decimal_into_arr(k) print m
k = arr_into_decimal("baa") print k k = k + 1 print k m = decimal_into_arr(k) print m
Офлайн