Sou mentor do RubyLearning e um dos exercícios que damos aos nossos alunos é o exercício "Deaf Grandma" do livro de Chris Pine, " Learn to Program ". Aqui está a descrição:
Escreva um programa para a avó surda. O que você disser à avó (o que você digitar), ela deverá responder com: "Hein ?! Fala, filho!", A menos que você grite (digite todas as maiúsculas). Se você gritar, ela poderá ouvi-lo (ou pelo menos ela pensa assim) e gritar de volta: "Não, não desde 1938!"
Para tornar seu programa realmente crível, peça à avó que grite um ano diferente a cada vez; talvez qualquer ano aleatoriamente entre 1930 e 1950. (Esta parte é opcional e seria muito mais fácil se você ler a seção sobre o gerador de números aleatórios do Ruby no final do capítulo de métodos.) Você não pode parar de falar com a avó até que gritar "tchau".
Depois de várias iterações do curso, tentei ver o quão pequeno posso conseguir isso e agora tenho 112 caracteres:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Estou curioso para ver em quantos caracteres isso pode ser alcançado no idioma de sua escolha, porque acho que Ruby já está indo muito bem aqui.
Edit: A solução Perl postada abaixo levou a
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
que são 92 caracteres para a expressão + mais 2 para as opções n
e l
.
Respostas:
Perl, 85
91Execute com
perl -nE '<code goes there>'
(n
contado no tamanho do programa):Esse ponto de exclamação à direita é muito caro ...Edições sugeridas por IK:
-l
opção global e também dois caracteres do programa: -3.$=
restrita a ser um número inteiro: -4.(e isso ainda não acontece e estou com muito sono para descobrir o porquê. Oh, bem, a contagem final está certa, pelo menos)
fonte
$=
e usar um regexp para "BYE" reduz esse número para 84 + 1:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 caracteres
Alguma dica para melhorar?
fonte
s=''
, reordenar as suas declarações em seu loop while, e colocar todo o loop while em uma linha: gist.github.com/3787809 Se você estava realmente determinado, você poderia salvar 2 caracteres usando python 3 (raw_input () -> input (), mas de impressão -> print ())131 caracteres no PowerShell:
Com espaço em branco:
Espremeu 18 caracteres da sugestão de Joey.
BTW, 'Learn to Program' foi o primeiro livro de programação que eu li de capa a capa.
fonte
if...
na verificação condicional dofor()
mesmo modo:for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
Além disso, a especificação diz 1930-1950.C # - 234 caracteres
Mais legível:
fonte
Befunge - 27x6 = 162 caracteres
EDIT: Perdeu completamente a parte "BYE". Nova versão em breve.
EDIT 2: Na verdade, isso torna um pouco complexo demais para minhas poucas habilidades no Befunge. Posso tentar novamente mais tarde, mas não consigo pensar em nenhuma maneira simples de implementá-lo no momento.
fonte
C # - 194 CHARS
Com espaços em branco:
Com alguma inspiração de Nellius e fR0DDY.
Por favor, deixe-me saber se pode ser melhorado.
fonte
Main()
). Além disso, acho que você deseja parens na?:
expressão para obter os!
dois. Eu adicionei uma resposta com isso e EOL (mas ainda vaza).Main();
solução ... nenhuma pessoa sã usaria este programa por tempo suficiente para que ele fosse um problema.D: 246 caracteres
Mais legivelmente:
fonte
javascript, 142 caracteres, 29 deles executam ano aleatório
fonte
Awk: 97 caracteres
fonte
Windows PowerShell,
121117Devido à natureza da tarefa, isso parece praticamente idêntico à solução de Ty Auvil , embora tenha sido escrita de forma independente:
Graças a SpellingD pela sugestão,
fonte
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)
O estranho é que o código Haskell geralmente é muito menor que o código C comparável ao escrever um programa 'sério'.
fonte
Char
usandoany(`elem`['a'..'z'])s
para testar letras minúsculas.APL (76)
fonte
C # - 345 caracteres
Maldita linguagem detalhada ... :-)
fonte
P
. E isso não detecta maiúsculas corretamente. Eu posso gritar e ele ainda não pode me ouvir. Você pode encurtar o método principal parawhile(t(Console.ReadLine()));
. Você pode usarusing C=System.Console;
no início de encurtar o acesso aReadLine()
eWriteLine()
aC.ReadLine()
eC.WriteLine()
.C # - 196 caracteres (mas com vazamento)
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();}}}
Essa é a resposta de @ Richard (com vazamento) com dois parênteses (veja abaixo) e um \ n adicionado lá para obter a EOL nos dois casos. Caso contrário, o
" + "
espaço é apenas desperdiçado.Formatado
UPDATE: para esclarecer meu comentário sobre as parênteses sendo necessárias, eis o que recebo sem as parênteses (ou seja, com a solução original do @ Richard):
E com os parênteses:
Nenhum destes usa meu adicional
\n
embora.fonte
Bash:
136128 caracteresAlternativa limitada:
132123 caracteresVocê pode conversar com um surdo infinitamente, mas a conversa com esse código posterior é limitada pela pilha de chamadas. (No meu teste, ele é finalizado após 4989 chamadas.)
fonte
Javascript -
133131130128127121 caracteresversão golfed da solução www0z0ks
Edit: salvou outros seis caracteres com esta ótima dica
fonte
g=/[a-z]/.test(i)?'Huh?!...':'No...'
e você poupa 2 caracteres.Math.ceil()
é menor queMath.floor()
. Basta alterar o ano base para manter o inalterada intervalo:Math.ceil(Math.random()*21+1929)
.Clojure -
160154 caracteresTrabalhando no golfe um pouco mais. Sugestões são bem-vindas.
Execute o REPL
fonte
Q, 115
uso
fonte