Te has unido a LinkLine, una empresa líder en el sector de las comunicaciones que trabaja para garantizar conexiones fiables para todo el mundo. El equipo se enfrenta a un gran reto: los usuarios envían números de teléfono en todo tipo de formatos, como guiones, espacios, puntos, paréntesis e incluso prefijos. Algunos números son válidos, mientras que otros son imposibles de usar.
Tu misión es poner orden en este caos. Limpiarás los números válidos y les darás el formato adecuado para usarlos en el sistema. Al mismo tiempo, identificarás y filtrarás las entradas no válidas.
El éxito de las operaciones de LinkLine depende de tu capacidad para separar lo útil de lo inservible. ¿Estás preparado para aceptar el reto y mantener las conexiones funcionando sin problemas?
Limpia números de teléfono para poder enviarles mensajes SMS.
El Plan de Numeración de América del Norte (NANP) es un sistema de numeración telefónica que utilizan muchos países de Norteamérica, como Estados Unidos, Canadá o Bermudas.
Todos los países del NANP comparten el mismo código de país internacional: 1.
Los números del NANP son números de diez dígitos que constan de un código de área del Plan de Numeración, de tres dígitos, conocido comúnmente como código de área, seguido de un número local de siete dígitos. Los tres primeros dígitos del número local representan el código de central, seguido del número único de cuatro dígitos, que es el número de abonado.
El formato suele representarse como
NXX NXX-XXXX
donde N es cualquier dígito del 2 al 9 y X es cualquier dígito del 0 al 9.
En ocasiones también llevan antepuesto el código de país (representado como 1 o +1).
Tu tarea consiste en limpiar números de teléfono con formatos distintos eliminando la puntuación y el código de país, si está presente.
Por ejemplo, las entradas
+1 (613)-995-0253613-995-02531 613 995 0253613.995.0253deberían producir todas la salida
6139950253
Nota: Como este ejercicio solo trata números de teléfono usados en países del NANP, solo el 1 se considera un código de país válido.
A veces es necesario lanzar una excepción. Cuando lo hagas, deberías incluir siempre un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho a la hora de depurar. Cuando sepas que el origen del error va a ser de un tipo concreto, puedes optar por lanzar uno de los tipos de error integrados, pero aun así deberías incluir un mensaje significativo.
Este ejercicio en concreto requiere que uses la instrucción raise para «lanzar» varios ValueErrors si al constructor de la clase PhoneNumber() se le pasa un número que no sea un número de teléfono válido. Esto incluye errores para cuando el código de área o el código de central no son válidos, cuando el número tiene demasiados (o muy pocos) dígitos, y para cuando se introduce puntuación o letras como entrada. Las pruebas solo pasarán si lanzas la exception con raise y además incluyes un mensaje con ella.
Para lanzar un ValueError con un mensaje, escribe el mensaje como argumento del tipo exception:
# if a phone number has less than 10 digits.
raise ValueError("must not be fewer than 10 digits")
# if a phone number has more than 11 digits.
raise ValueError("must not be greater than 11 digits")
# if a phone number has 11 digits, but starts with a number other than 1.
raise ValueError("11 digits must start with 1")
# if a phone number has an exchange code that starts with 0.
raise ValueError("exchange code cannot start with zero")
# if a phone number has an exchange code that starts with 1.
raise ValueError("exchange code cannot start with one")
# if a phone number has an area code that starts with 0.
raise ValueError("area code cannot start with zero")
# if a phone number has an area code that starts with 1.
raise ValueError("area code cannot start with one")
# if a phone number has punctuation in place of some digits.
raise ValueError("punctuations not permitted")
# if a phone number has letters in place of some digits.
raise ValueError("letters not permitted")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.