Resolución: ejercicio y números confuso.
Hace tiempo que conozco el blog Programancia101, un blog con “retos” de programación. Hace tiempo sacaron éste, como algún otro lo leÃ, pero pasó que estaba en una época de mi vida en la que me apetecÃa mucho programar, y me decidà a resolverlo. El problema, básicamente, consiste en, dadas una reglas de “confusión” y un número, averiguar las posibles confusiones, tanto al derecho, como al revés. Sé que parece lioso, por eso os remito al enunciado , otra vez. SerÃa interesante que fueseis viendo el código fuente al mismo tiempo y al menos haberlo pensado un par de veces (si no, no hay diversión).
Nota previa.
Aunque hable de número, internamente es más cómodo, en este caso, trabajar con cadenas. Por lo tanto, aunque diga número, el tipo es String.
Paso 1: Almacenamiento de las “confusiones”.
Para almacenar las confusiones opté por un hash que contenÃa otros dos: straight (para las confusiones al derecho) y reverse (para las confusiones si están dados la vuelta). En cada uno de ellos, a cada número se le asigna un array con las posibles confusiones (dadas en el enunciado). Es obvio, que en el hash straight deberán estar también contenidos los propios números. El hash se define desde la lÃnea 22 a la 48.
Paso 2: Redefiniendo la clase String para nuestros oscuros propósitos.
En la clase String, se necesitan dos nuevos métodos: little y reversible?. El primero devuelve toda la cadena excepto el primer carácter, para qué, en el siguiente paso. El método reversible? comprueba si todos los números son reversibles, es decir, el array de confusiones del hash CONFUSIONS[:reverse][numero.to_sym] es no vacÃo. Esto se hace de la lÃnea 4 a la 19.
Paso 3: La idea.
La idea de la resolución es muy sencilla. Dado un número, las posibles confusiones se corresponden con las confusiones del mismo número sin la unidad de mayor orden (por ejemplo, si el número es el 12345, el número sin la unidad de mayor orden es el 2345) combinadas con las posibles confusiones del primer número (en el caso anterior, el 1). Por lo tanto, aquà entra la recursión, y de ahà la necesidad del método little de la clase String (recordemos que los números, en este caso, los guardamos como cadenas). El método en cuestión recibe dos parámetros, el número y el hash de confusiones, que por defecto es CONFUSIONS[:straight]. Por supuesto, necesitamos de otra función. En ella, lo que hacemos es obtener el array de confusiones al derecho y mezclarlo con el de las confusiones al revés, si las hubiera. Una vez hecho esto, se eliminan duplicados y se ordena. Estas funciones se encuentran definidas desde la lÃnea 53 a la 75.
Paso 4: Los retoques.
Por último, añadir una comprobación de los parámetros (se ha de recibir un único parámetro que sea un número). Esto se realiza de la lÃnea 78 a la 82. Posteriormente se llama a la función (lÃnea 83) y se muestran los resultados (lÃnea 85).
