py_number_base_converter

Código comentado línea a línea y paso a paso:

Entregas: py_number_base_converter.py con number_base_converter(number, from_base, to_base). Rank 03 · nivel 3.

Qué pide (en palabras normales)

Subject (enunciado original)
Write a function that converts a number from one base to another.
Support bases from 2 to 36 inclusive.
Use digits 0-9 and letters A-Z for values 10-35.
Return "ERROR" for invalid inputs.

Expected file: py_number_base_converter.py
Function signature:
def number_base_converter(number: str, from_base: int, to_base: int) -> str:

Examples:
number_base_converter("1010", 2, 10)
=> "10"
number_base_converter("FF", 16, 10)
=> "255"
number_base_converter("255", 10, 16)
=> "FF"
number_base_converter("123", 10, 2)
=> "1111011"
number_base_converter("Z", 36, 10)
=> "35"
number_base_converter("35", 10, 36)
=> "Z"
number_base_converter("123", 1, 10)
=> "ERROR"
number_base_converter("G", 16, 10)
=> "ERROR"

Dos pasos por el entero

No conviertas de base a base directamente. Pasa a entero y del entero a la base destino. Cada mitad es un bucle de tres líneas.

value = 0
for ch in number.upper():
    digit = DIGITS.find(ch)
    if digit < 0 or digit >= from_base:
        return "ERROR"
    value = value * from_base + digit
out = ""
while value:
    out = DIGITS[value % to_base] + out
    value //= to_base

Un solo string DIGITS sirve para los dos sentidos: find para leer, índice para escribir.

¿Y int(number, from_base)?

Funciona y no es import. Pero acepta cosas que el subject llama inválidas: "0x1F", " 12 ", "1_000", "-5". Hacerlo a mano son cinco líneas y controlas exactamente qué es error.

Trampas