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).