Boletín 210. Ejercicios variados
En este boletín realizaremos algunos ejercicios donde se tengan que utilizar todos los conocimientos adquiridos durante esta unidad.
Ejercicios
- Para cada función, lanza las excepciones que sean necesarias.
- Para cada función, realiza su documentación utilizando DocString.
- Captura todas las excepciones que puedan ocurrir durante el transcurso del script.
- Cuando se muestra un menú, cada opción tendrá asociada una letra. Según la letra introducida por el usuario, se realiza una operación u otra. Si se selecciona una letra que no esté en el menú deberá mostrarse por pantalla un error al usuario.
- No debes implantar las anotaciones de tipos de las funciones. Tan solo se indica en los enunciados para documentar las funciones.
Ejercicio 1. En 1994, Clifford A. Pickover puso de manifiesto la existencia de los números vampiro. Estos están ocultos entre el resto de nuestro sistema numérico, conservando los genes de sus padres tras multiplicarse. Así, por ejemplo, el número 2187 es un número vampiro, al tener los mismos dígitos que sus dos progenitores: 27 y 81 (27 · 81 = 2.187).
Los números vampiro verdaderos cumplen cuatro condiciones:
- Tienen un número par de dígitos.
- Se obtienen al multiplicar dos números, llamados colmillos, que tienen la mitad de dígitos que el original.
- Tienen los mismos dígitos que los colmillos, y en la misma cantidad (aunque en cualquier orden).
- Los colmillos no acaban al mismo tiempo en 0.
Crea una función es_vampiro(numero: int) -> bool que indique si un número es vampiro o no.
Necesitarás además una función (puedes utilizar recursión) que calcule las permutaciones posibles de números de una cierta longitud de dígitos a partir de los dígitos de un número.
Ejercicio 2. Las matrículas están compuestas por dos partes. La primera consiste en un número decimal de 4 dígitos que se va incrementando de uno en uno. Cuando se llega al último valor 9999, se reinicia la cuenta en 0000 y se incrementa la segunda parte, que contiene letras.
La segunda parte consiste en 3 letras consecutivas, excluyendo las vocales y la letra Ñ. Cuando, tras recorrer todos los números, se incrementa la letra, se pasa a la siguiente del alfabeto en la letra situada más a la derecha, saltándose las vocales y la letra Ñ. Si se acaba el abecedario, se vuelve al principio B e incrementa la letra anterior con este mismo procedimiento.
Crea una función siguiente_matricula(matricula: str) -> str que devuelva la siguiente matrícula a la que se pasa por valor. El formato de la matrícula es el siguiente: 0000BBB. Si se recibe la última matrícula se devuelve el valor None.
Ejercicio 3. ¡Pasa la calculadora! es un juego para dos personas en el que se comienza con una calculadora y cada jugador, de manera alterna, suma un número nuevo, de un solo dígito, al valor acumulado hasta el momento, comenzando en 0. El jugador que, tras sumar su número, llegue a un resultado mayor o igual a 31 pierde.
Además, en cada turno un jugador solo puede utilizar los números situados en la misma fila o columna que el dígito marcado por su oponente en el turno anterior, pero no puede repetir el número. Evidentemente, el número 0 no se puede utilizar nunca.
Por ejemplo, imagina que, durante una partida, un jugador recibe la calculadora mostrándole el número 28, y el oponente acaba de introducir el número 9. A partir de la disposición de los números de la calculadora, sabemos que en este turno únicamente podrá jugar los números 3, 6, 7 y 8:
Implementa este juego.
Ejercicio 4. Los números 17, 341 y 62 tienen en común que la suma de sus dígitos da el mismo valor, 8. Hay muchos otros números así; de todos ellos, el 17 es el más pequeño.
Implementa un programa que recibirá por teclado un número entre 1 y 1000 y a continuación se muestre el número decimal más pequeño cuyas cifras sumen la misma cantidad que la suma de las cifras del número introducido por teclado.
Por ejemplo, si el usuario introduce el número 92, deberá imprimirse el número 29.