python: перевод системы из N-ричной без нуля в десятиричную с нулём (нашу родную)

уже несколько раз требовалось решить данную задачу, каждый раз ее делаю с муками и каждый раз потом забываю :)

есть система счисления со словарём (т.е. буквы, а не цифры) и отсутствие нуля, т.е.

A, B, ..., Z, AA, AB, ..., ZZ. AAA, ...

подскажите как вообще называются эти системы счисления?!!! а то когда начинаю искать, то нахожу их лишь на третьи сутки

даже алгоритм перевода не прошу, хотя бы название :) (но можно и с алгоритмом, чтоб силы сэкономить)

по сути это порядковый номер комбинации из 1..M цифр из словаря из N цифр (комбинация которая itertools.product)


Ответы (4 шт):

Автор решения: Fox Fox

Я ещё не разобрался, что делает этот скрипт (его автор не я). Может быть, Вас это устроит:

def convert_to_decimal(number, base):
    # Создаем словарь для соответствия символов цифрам
    digits = {chr(65 + i): i + 1 for i in range(base - 1)}
    
    # Переводим число в строку и инициализируем переменную для результата
    number_str = str(number)
    decimal_value = 0
    
    # Проходим по каждой цифре числа
    for i, digit in enumerate(reversed(number_str)):
        # Получаем значение цифры из словаря и умножаем на основание в степени позиции
        decimal_value += digits[digit] * (base ** i)
    
    return decimal_value

# Пример использования
number = "ABC"  # Число в N-ричной системе без нуля
base = 13  # Основание системы счисления
decimal_value = convert_to_decimal(number, base)
print(f"Десятичное значение числа {number} в системе с основанием {base} равно {decimal_value}")
→ Ссылка
Автор решения: dofi4ka

Не вижу проблемы использовать схему d*b^i, просто нужно чуть-чуть поиграться со входными данными

Вот пример функции перевода итерируемых объектов с переводом элементов

def to_decimal(values: Iterable, base: int, translation: dict[Any, int]) -> int:
    result = 0
    for v in values:
        result *= base
        result += translation.get(v, v)
    return result

Дальше делаем словарик для перевода, но для первой буквы указываем не 0, а 1

tr = {
    "A": 1,
    "B": 2,
    "C": 3
}

И, наконец, переводим, но используя в качестве основания не привычное максимальное число плюс один, а просто максимальное число, т.е. 3

print(to_decimal("A", 3, tr))  #  "A"  -> 1  == 1
print(to_decimal("B", 3, tr))  #  "B"  -> 2  == 2
print(to_decimal("C", 3, tr))  #  "C"  -> 3  == 3
print(to_decimal("AA", 3, tr))  # "AA" -> 11 == 4

Словарик для перевода всех заглавных букв английского алфавита можно сгенерировать вот так:

from string import ascii_uppercase
tr = {ch: n for n, ch in enumerate(ascii_uppercase, 1)}

Причем вместо string.ascii_uppercase можно использовать любую последовательность уникальных символов, а для основания просто использовать длину этого словарика

print(to_decimal("494265", len(tr), tr))  # 494265

Названия таких систем не подскажу потому что сам такое впервые вижу :)

→ Ссылка
Автор решения: MBo

Число в нумерацию столбца Excel и назад (отсюда зашитый размер алфавита 26, старт с единицы)

def NumToExcel(N):
    res = ""
    N -= 1
    while N >= 0:
        res = chr(ord('A') + N % 26) + res
        N  = N // 26 - 1
    return res

def ExcelToNum(ExStr):
    res = 0
    t = 1
    for c in reversed(ExStr):
        res += t * (1 + ord(c) - ord('A'))
        t *= 26
    return res

for i in range(1, 18282):
    e = NumToExcel(i)
    j = ExcelToNum(e)
    print(i, e, j)
→ Ссылка
Автор решения: puffleeck

подскажите как вообще называются эти системы счисления?!!!

если верить встроенному в браузер CSS модулю, то это: либо system: alphabetic; либо list-style: upper-latin || upper-alpha; в зависимости от того что интересует(тип или локализация)

т.е. алфавитная/буквенная нумерация.

#x{
  display: grid;
  grid-template-columns: repeat(9, 1fr);
  grid-auto-rows: 1fr;
}

#x>*{
  display: list-item;
  color: darkblue;
  list-style-position: inside !important;
  height: 100%;
  width: 100%;
  text-align: center;
}

@counter-style a{
  system: numeric;
  symbols: A B C D E;
}
@counter-style b{
  system: alphabetic; /*!!!!!!!*/
  symbols: A B C D E;
}

#x>*:nth-child(5n){color:red}

#a:checked~#x>*{list-style: a;}
#b:checked~#x>*{list-style: b;} /*!!!*/
#c:checked~#x>*{list-style: upper-latin;}/* ||upper-alpha*/
<input type='radio' id='a' name='counter'>
<input type='radio' id='b' name='counter'>
<input type='radio' id='c' name='counter'>
<div id='x'>
<hr><hr><hr><hr><hr> <hr><hr><hr><hr><hr>
<hr><hr><hr><hr><hr> <hr><hr><hr><hr><hr>

<hr><hr><hr><hr><hr> <hr><hr><hr><hr><hr>
<hr><hr><hr><hr><hr> <hr><hr><hr><hr><hr>

<hr><hr><hr><hr><hr> <hr><hr><hr><hr><hr>
<hr><hr><hr><hr><hr> <hr><hr><hr><hr><hr>
</div>

более полный список есть

→ Ссылка