python: перевод системы из N-ричной без нуля в десятиричную с нулём (нашу родную)
уже несколько раз требовалось решить данную задачу, каждый раз ее делаю с муками и каждый раз потом забываю :)
есть система счисления со словарём (т.е. буквы, а не цифры) и отсутствие нуля, т.е.
A, B, ..., Z, AA, AB, ..., ZZ. AAA, ...
подскажите как вообще называются эти системы счисления?!!! а то когда начинаю искать, то нахожу их лишь на третьи сутки
даже алгоритм перевода не прошу, хотя бы название :) (но можно и с алгоритмом, чтоб силы сэкономить)
по сути это порядковый номер комбинации из 1..M цифр из словаря из N цифр (комбинация которая itertools.product)
Ответы (4 шт):
Я ещё не разобрался, что делает этот скрипт (его автор не я). Может быть, Вас это устроит:
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}")
Не вижу проблемы использовать схему 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
Названия таких систем не подскажу потому что сам такое впервые вижу :)
Число в нумерацию столбца 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)
подскажите как вообще называются эти системы счисления?!!!
если верить встроенному в браузер 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>
более полный список есть