excelの列表現を再現する
概要
- Excelの列は
A, B, ..., Z, AA, AB, ...
のような文字の組み合わせで表現される - 通常のN進数の表現とは異なり、数字部分がなく、0が基数ではない
- N進数変換にちょっとした調整が必要
- 桁上りのときに基数に合わせる操作を入れる
- N進数変換にちょっとした調整が必要
具体例
数値->Excelの列表現
from string import ascii_uppercase
m = {}
for i in range(len(ascii_uppercase)):
m[i] = ascii_uppercase[i]
def decimal_to_base_str(x: int, base: int) -> list:
to_str = lambda a: m[a]
if x//base != 0:
# -1することで調整している
return decimal_to_base_str(x//base-1, base) + [to_str(x%base)]
return [to_str(x%base)]
assert decimal_to_base_str(0, 26) == ["A"]
assert decimal_to_base_str(25, 26) == ["Z"]
assert decimal_to_base_str(26, 26) == ["A", "A"]
assert decimal_to_base_str(27, 26) == ["A", "B"]
assert decimal_to_base_str(28, 26) == ["A", "C"]
Excelの列表現->数値
from typing import *
from string import ascii_uppercase
m = {}
for i in range(len(ascii_uppercase)):
m[ascii_uppercase[i]] = i+1
def anybase_to_decimal(x: "List[str]", k: int):
'''
x: n進数数字
k: 変換元とする進数
'''
dec = 0
for idx, ch in enumerate(reversed(x)):
dec += m[ch] * (k**idx)
return dec
assert(anybase_to_decimal(list("A"), 26) == 1)
assert(anybase_to_decimal(list("B"), 26) == 2)
assert(anybase_to_decimal(list("AA"), 26) == 27)
assert(anybase_to_decimal(list("ZY"), 26) == 701)