Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 27, 2013 17:57:47

ssid
Зарегистрирован: 2013-12-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с системами счисления

Вводятся некоторые символы из

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', '*']
Эти символы - некоторое число в системе счисления, все символы которой описаны в arr (их 63, кстати).
Задача - перевести в десятичную систему счисления, прибавить 1 и перевести обратно.

Пример:
На входе: abdb; на выходе: abdc
На входе: abd*; на выходе: abea
Промежуточный (-е) результаты не важны и нигде не отображаются.

Туплю, не знаю, как сделать.
UPD: Singularity, “а” вместо нуля, да

Отредактировано ssid (Дек. 27, 2013 19:13:43)

Офлайн

#2 Дек. 27, 2013 18:15:59

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Работа с системами счисления

исходные 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)

Офлайн

#3 Дек. 27, 2013 19:32:09

ssid
Зарегистрирован: 2013-12-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с системами счисления

Singularity, спасибо, но ваш вариант работает как-то неправильно:

>>> ff('0')
61
>>> unff(61)
'0' # ok
>>> unff(1443)
'w6'
>>> ff('w6')
1465 #?!
>>> unff(611)
'jS'
>>> ff('jS')
620 #?!!

Ошибки начинаются с числа 63, кстати.

Отредактировано ssid (Дек. 27, 2013 19:51:09)

Офлайн

#4 Дек. 28, 2013 07:36:50

Kustodiev_17
Зарегистрирован: 2013-12-25
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с системами счисления

Я новичок в Питоне и поэтому программы мои не претендуют на лаконичность, зато дают функционал

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

Должно работать.

Обновление поста: Да! Кстати, запись arr-числа в виде, например, aAx имеет мало смысла, так как ‘a’ - это “по-нашему” “0”, вместо этого правильно Ax.

Отредактировано Kustodiev_17 (Дек. 28, 2013 07:41:41)

Офлайн

#5 Дек. 28, 2013 11:27:48

ssid
Зарегистрирован: 2013-12-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с системами счисления

Спасибо, но оба варианта “откусывают” вполне себе значащий 0.
(Он обозначает пустоту, но всё-таки нужен! Как вначале, так и в конце)

При проверке обоих:
63 != 1, ba, error!
т.е. с точки зрения функции любое a = 0, что неверно.
поэтому (ba) = 1 + 0 = 1, а не 63, как должно быть.

Офлайн

#6 Дек. 28, 2013 20:08:20

Kustodiev_17
Зарегистрирован: 2013-12-25
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с системами счисления

Точно, ошибка, недостаточно тестировал. Ну, ‘откусывание’ по определению слева, а то, что в моём коде было - собственно это и давало такой выхлоп.

Новая версия для второй функции (первую я достаточно тестировал, там должно всё работать, но всякое бывает):

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

>>>
63
64
bb
>>>
————–
k = arr_into_decimal("baa")
print k
k = k + 1
print k
m = decimal_into_arr(k)
print m
>>>
3969
3970
bab
>>>

В первом приближении работает, надо качественно протестить

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version