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)
- Un número escrito en base
from_base(string), devolverlo escrito en baseto_base. Bases de 2 a 36, dígitos0-9A-Z. - Algo inválido (base fuera de rango, dígito que no existe en la base) →
"ERROR".
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
- El cero:
while valueno itera y devolverías"". Caso aparte. - Valida el dígito contra la base de origen:
"G"en base 16 es error aunque sea un dígito válido en base 36. - Salida en mayúsculas:
"FF", no"ff".