Je suis un mentor chez RubyLearning et l'un des exercices que nous donnons à nos élèves est l'exercice «Sourde grand-mère» du livre de Chris Pine « Apprendre à programmer ». Voici la description:
Écrivez un programme sur la grand-mère sourde. Quoi que vous disiez à grand-mère (quoi que vous tapiez), elle devrait répondre par: "Hein?! Parlez, mon fils!", À moins que vous ne le criiez (tapez toutes les capitales). Si vous criez, elle peut vous entendre (ou du moins elle le pense) et crie: "Non, pas depuis 1938!"
Pour rendre votre programme vraiment crédible, demandez à grand-mère de crier une année différente à chaque fois; peut-être n'importe quelle année au hasard entre 1930 et 1950. (Cette partie est facultative, et serait beaucoup plus facile si vous lisez la section sur le générateur de nombres aléatoires de Ruby à la fin du chapitre sur les méthodes.) Vous ne pouvez pas arrêter de parler à grand-mère jusqu'à ce que vous criez "BYE".
Après plusieurs itérations de cours, j'ai essayé de voir à quel point je pouvais obtenir cela et maintenant le réduire à 112 caractères:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Je suis curieux de voir combien de personnages cela peut être réalisé dans la langue de votre choix, car je pense que Ruby se débrouille déjà très bien ici.
Edit: La solution Perl publiée ci-dessous a conduit à
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
qui est de 92 caractères pour l'expression + 2 autres pour les options n
et l
.
Réponses:
Perl, 85
91Exécuter avec
perl -nE '<code goes there>'
(n
compté dans la taille du programme):Ce point d'exclamation final est très cher ...Modifications suggérées par IK:
-l
option globale ainsi que deux caractères de programme: -3.$=
, contrainte d'être un entier: -4.(et ça ne s'additionne toujours pas et j'ai trop sommeil pour savoir pourquoi. Oh bien, le décompte final est juste au moins)
la source
$=
et utiliser une expression rationnelle pour "BYE" leperl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 caractères
Des conseils pour améliorer?
la source
s=''
, réorganisez vos instructions dans votre boucle while et placez la boucle while entière sur une seule ligne: gist.github.com/3787809 Si vous étiez vraiment déterminé, vous pourriez enregistrer 2 caractères en utilisant python 3 (raw_input () -> input (), mais print -> print ())131 caractères dans PowerShell:
W / espace blanc:
Resserré 18 caractères de la suggestion de Joey.
BTW, «Learn to Program» a été le premier livre de programmation que j'ai lu de bout en bout.
la source
if...
dans le contrôle conditionnel du mêmefor()
type:for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
En outre, la spécification dit 1930-1950.C # - 234 caractères
Plus lisible:
la source
Befunge - 27x6 = 162 caractères
EDIT: complètement raté la partie "BYE". Nouvelle version bientôt disponible.
EDIT 2: En fait, cela rend un peu trop complexe pour mes maigres compétences Befunge. Je pourrais réessayer plus tard, mais je ne pense pas à un moyen simple de le mettre en œuvre pour le moment.
la source
C # - 194 CHARS
Avec des espaces blancs:
Avec une certaine inspiration de Nellius et fR0DDY.
Veuillez me faire savoir si cela peut être amélioré.
la source
Main()
). De plus, je pense que vous voulez des parens dans l'?:
expression pour obtenir les!
deux. J'ai ajouté une réponse avec ceci et EOL (mais fuit toujours).Main();
solution ... aucune personne sensée n'utiliserait ce programme assez longtemps pour que ce soit un problème.D: 246 caractères
Plus lisiblement:
la source
javascript, 142 caractères, 29 d'entre eux effectuent une année au hasard
la source
Awk: 97 caractères
la source
Windows PowerShell,
121117En raison de la nature de la tâche, cela semble à peu près identique à la solution de Ty Auvil , bien qu'elle ait été écrite indépendamment:
Merci à SpellingD pour la suggestion,
la source
if
place comme ceci: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 ans)
La chose étrange est que le code Haskell est généralement beaucoup plus court que le code C comparable lors de l'écriture d'un programme «sérieux».
la source
Char
en utilisantany(`elem`['a'..'z'])s
pour tester les lettres minuscules.APL (76)
la source
C # - 345 caractères
Merde verbeuse ... :-)
la source
P
. Et cela ne détecte pas correctement les majuscules. Je peux lui crier dessus et il ne m'entend toujours pas. Vous pouvez raccourcir la méthode principale enwhile(t(Console.ReadLine()));
. Vous pouvez utiliserusing C=System.Console;
au début pour raccourcir l'accès àReadLine()
etWriteLine()
àC.ReadLine()
etC.WriteLine()
.C # - 196 caractères (mais qui fuient)
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();}}}
C'est la réponse de @ Richard (qui fuit) avec deux parens (voir ci-dessous) et un \ n ajouté pour obtenir la fin de vie dans les deux cas. Sinon, l'
" + "
espace est juste gaspillé.Formaté
MISE À JOUR: pour clarifier mon commentaire sur les parens nécessaires, voici ce que j'obtiens sans les parens (c'est-à-dire avec la solution originale de @ Richard):
Et avec les parens:
Aucun de ceux-ci n'utilise cependant mon supplément
\n
.la source
Bash:
136128caractèresAlternative limitée:
132123 caractèresVous pouvez parler à un sourd à l'infini, mais la conversation avec ce code ultérieur est limitée par la pile d'appels. (Dans mon test, il se termine après 4989 appels.)
la source
Javascript -
133131130128127121 caractèresversion golfée de la solution www0z0ks
Edit: enregistré six autres caractères avec ce bon conseil
la source
g=/[a-z]/.test(i)?'Huh?!...':'No...'
et vous épargnez 2 caractères.Math.ceil()
est plus court queMath.floor()
. Il suffit de changer l'année de base pour maintenir l'intervalle inchangé:Math.ceil(Math.random()*21+1929)
.Clojure -
160154 caractèresTravailler sur le golf un peu plus. Suggestions bienvenues.
Parcourez REPL
la source
Q, 115
usage
la source