Soy mentor en RubyLearning y uno de los ejercicios que damos a nuestros estudiantes es el ejercicio "Abuela sorda" del libro " Aprender a programar " de Chris Pine . Aquí está la descripción:
Escribe un programa de abuela sorda. Lo que le digas a la abuela (lo que escribas), ella debería responder con: "¡¿Huh? ¡Habla, hijo!", A menos que lo grites (escribe todas las mayúsculas). Si gritas, ella puede oírte (o al menos así lo cree) y te responde: "¡No, no desde 1938!"
Para que su programa sea realmente creíble, haga que la abuela grite un año diferente cada vez; tal vez cualquier año al azar entre 1930 y 1950. (Esta parte es opcional, y sería mucho más fácil si leyeras la sección sobre el generador de números aleatorios de Ruby al final del capítulo de métodos). No puedes dejar de hablar con la abuela hasta que grita "BYE".
Después de varias iteraciones del curso, traté de ver cuán pequeño puedo obtener esto y ahora lo reduzco a 112 caracteres:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Tengo curiosidad por ver en qué pocos caracteres se puede lograr esto en el idioma que elija, porque creo que a Ruby ya le está yendo muy bien aquí.
Editar: La solución Perl publicada a continuación condujo a
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
que tiene 92 caracteres para la expresión + 2 más para las opciones ny l.

