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 n
y l
.
Respuestas:
Perl, 85
91Ejecutar con
perl -nE '<code goes there>'
(n
contado en el tamaño del programa):Ese signo de exclamación final es muy costoso ...Ediciones sugeridas por IK:
-l
opción global, así como dos caracteres del programa: -3.$=
, restringida a ser un número entero: -4.(y todavía no cuadra y tengo demasiado sueño para averiguar por qué. Oh, bueno, el conteo final es correcto al menos)
fuente
$=
y usar una expresión regular para "BYE" reduce esto a 84 + 1:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 Personajes
¿Alguna pista para mejorar?
fuente
s=''
, reordena sus declaraciones en su ciclo while y coloca todo el ciclo while en una línea: gist.github.com/3787809 Si realmente estuviera decidido, podría guardar 2 caracteres usando python 3 (raw_input () -> input (), pero print -> print ())131 caracteres en PowerShell:
W / espacio en blanco:
Exprimió 18 personajes de la sugerencia de Joey.
Por cierto, 'Learn to Program' fue el primer libro de programación que leí de principio a fin.
fuente
if...
en la verificación condicional de lafor()
misma manera:for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
también, la especificación dice 1930-1950.C # - 234 caracteres
Más legible:
fuente
Befunge - 27x6 = 162 caracteres
EDITAR: Perdí por completo la parte "BYE". Nueva versión próximamente.
EDIT 2: En realidad, eso lo hace un poco demasiado complejo para mis escasas habilidades Befunge. Podría intentarlo más tarde, pero no puedo pensar en ninguna forma simple de implementarlo en este momento.
fuente
C # - 194 CHARS
Con espacios en blanco:
Con un poco de inspiración de Nellius y fR0DDY.
Avíseme si se puede mejorar.
fuente
Main()
). Además, creo que quieres que los parens en la?:
expresión obtengan los!
dos. Agregué una respuesta con esto y EOL (pero aún tiene fugas).Main();
solución ... ninguna persona en su sano juicio usaría este programa el tiempo suficiente para que sea un problema.D: 246 caracteres
Más legible:
fuente
JavaScript, 142 caracteres, 29 de ellos realizan año aleatorio
fuente
Awk: 97 caracteres
fuente
Windows PowerShell,
121117Debido a la naturaleza de la tarea, esto parece bastante idéntico a la solución de Ty Auvil , aunque fue escrito de forma independiente:
Gracias a SpellingD por la sugerencia,
fuente
if
lugar como este:for(;($j=read-host)-cne'BYE'){if($j-cmatch'[a-z]'){'Huh?! Speak up, sonny!'}else{"No, not since 19$(30..50|random)"}}
Haskell (189)
Lo extraño es que el código Haskell suele ser mucho más corto que el código C comparable al escribir un programa 'serio'.
fuente
Char
utilizandoany(`elem`['a'..'z'])s
para probar letras minúsculas.APL (76)
fuente
C # - 345 caracteres
Maldito lenguaje detallado ... :-)
fuente
P
. Y esto no detecta mayúsculas correctamente. Puedo gritarle y todavía no puede oírme. Puede acortar el método principal awhile(t(Console.ReadLine()));
. Se puede utilizarusing C=System.Console;
en el inicio de acortar el acceso aReadLine()
yWriteLine()
aC.ReadLine()
eC.WriteLine()
.C # - 196 caracteres (pero con fugas)
using System;class P{static void Main(){var s=Console.ReadLine();if(s!="BYE"){Console.Write((s==s.ToUpper()?"No, not since 19"+new Random().Next(30, 51):"Huh?! Speak up, sonny")+"!\n");Main();}}}
Esa es la respuesta (con fugas) de @ Richard con dos parens (ver más abajo) y \ n agregada allí para obtener la EOL en ambos casos. De lo contrario,
" + "
solo se desperdicia espacio.Formateado
ACTUALIZACIÓN: para aclarar mi comentario sobre la necesidad de los padres, esto es lo que obtengo sin los padres (es decir, con la solución original de @ Richard):
Y con los padres:
Sin
\n
embargo, ninguno de estos usa mi adicional .fuente
Bash:
136128 caracteresAlternativa limitada:
132123 caracteresPuede hablar con un sordo infinitamente, pero la conversación con este código posterior está limitada por la pila de llamadas. (En mi prueba, termina después de 4989 llamadas).
fuente
Javascript -
133131130128127121 caracteresversión de golf de la solución www0z0ks
Editar: salvó otros seis caracteres con este gran consejo
fuente
g=/[a-z]/.test(i)?'Huh?!...':'No...'
y ahorras 2 caracteres.Math.ceil()
es más corto queMath.floor()
. Sólo cambia el año base para mantener sin cambios el intervalo:Math.ceil(Math.random()*21+1929)
.Clojure -
160154 CaracteresTrabajando en jugar al golf un poco más. Sugerencias bienvenidas.
Ejecutar a través de REPL
fuente
Q, 115
uso
fuente