El caso práctico viene a colación de un comentario en una de las listas de correo a las que estoy suscrito (Mono-hispano).
El planteamiento es el siguiente. Queremos ganar al ahorcado. Suele estar instalado en todos los Linux (hangman, es para consola) o bien contra alguien en internet. Para ello queremos desarrollar un programa en (nuestro lenguaje favorito) que tenga una base de datos de palabras grande (creo que había un script para bajarse la RAE completa), y busque todas las que cumplan con el perfil:
-u-ea donde - representa una letra desconocid y sabemos que no tiene r
Para ello seleccionaré todas las que coincidan con con 5 letras, miraré si la segunda letra es la 'u', si la cuarta es la 'e', la quinta es la 'r' y por último eliminar todas las que tengan una 'r' por ahí.
Antes de seguir leyendo, sería interesante que todo lector con espíritu de programador, no hiciese el programa pero pensase como lo haría: el lenguaje utilizado, las extructuras de control, los bucles, las excepciones... que luego hacemos la encuesta y no quiero trampas.
Doy
un
poco
más
de
tiempo,
para
que
penseis
una
respuesta
...
Lo cierto y verdad es que no hace falta programar ni una sola línea de código. Tenemos todos los elementos disponibles al alcance de la mano:
- en /usr/share/dict/words hay una lista de las palabras del diccionario del sistema ordenadas alfabéticamente
- la instrucción grep nos permite filtrar lineas de un fichero si siguen un patrón.
El conocimiento de estos datos y la relación de las ideas nos lleva a una solución elegante:
grep ^[^uear]u[^uear]ea$ /usr/share/dict/words
En general, ser «un poco hacker» simplifica la vida.
La idea no fue mía. Ahora eso sí, yo le he hecho un front-end en perl que me calcula las frecuencias de las letras que no están para saber cual es la más probable. ¿Alguien se hecha una partida de ahorcado conmigo?