"""
概要: 指定された基数を持つ数値を別の基数に変換するスクリプト。
詳細説明:
このスクリプトは、コマンドライン引数として以下の3つの値を必要とします。
1. val: 変換対象の文字列形式の数値。
2. base_source: 変換元の基数(整数)。
3. base_target: 変換先の基数(整数)。
スクリプトはまず、`val` を `base_source` から基数10に変換します。
次に、基数10に変換された数値を `base_target` に変換して出力します。
対応する文字は '0'-'9', 'A'-'Z' で、最大基数36まで対応しています。
関連リンク: :doc:`base_usage`
"""
import sys
base_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
max_base = len(base_chars)
[ドキュメント]
def value_base(char, b):
"""
概要: 指定された文字の基数10における値を返す。
詳細説明:
`base_chars` 文字列を使用して、与えられた文字(大文字・小文字を区別せず)が
どの数値に対応するかを特定し、その基数10での値を返します。
例えば、'A' は 10 に、'F' は 15 に対応します。
:param char: 基数変換する単一の文字(例: 'A', '5')。
:type char: str
:param b: 変換元の基数。この関数内では直接使用されませんが、インタフェースとして存在します。
:type b: int
:returns: 文字が表す基数10の値。
:rtype: int
"""
return list(base_chars).index(char.upper())
if __name__ == "__main__":
argv = sys.argv
narg = len(argv)
if narg <= 3:
print("")
print("Usage: python {} val base_source base_target".format(argv[0]))
print("")
exit()
else:
val = argv[1]
base_source = int(argv[2])
base_target = int(argv[3])
if base_source > max_base:
print("")
print("Error: base_source [{}] is too large.".format(base_source))
print("")
exit()
if base_target > max_base:
print("")
print("Error: base_target [{}] is too large.".format(base_target))
print("")
exit()
print("")
print(f"Convert {val} in base {base_source} to base 10")
nstr = len(val)
v10 = 0
for i in range(nstr):
idx = nstr - 1 - i
v = value_base(val[idx], base_source)
if v >= base_source:
print(f"Error: The value at the {i}-th digit {v} is not compatible with base {base_source}")
exit()
dv = v * base_source**i
v10 += dv
print(f"{i}-th digit = {v}_{base_source}: + {v}*{base_source}^{i} => + {dv:10}_10 => {v10:10}_10")
b10 = str(v10)
print("")
print(f"Convert {b10} in base 10 to base {base_target}")
vnext = v10
starget = ''
while 1:
n = int(vnext / base_target)
residue = vnext % base_target
starget = base_chars[residue] + starget
print("{:10} = {:10} * {:10} + {:2}:".format(vnext, n, base_target, residue), end = '')
print(" base_{} => {}".format(base_target, starget))
if n == 0:
break
vnext = n
print("")