Perl 5.10+: 159 144 bytes - 350 = −206 pontos
say"Guess 16 bit signed number";$==32767-rand 65536;say(TOO.$",$_<0?LOW:HIGH)while++$i,$_=<>-$=;say"Congrats! You found the number in $i turns!"
Edit 2: Com a recente mudança de regras que me permite usar qualquer string literal para a mensagem "parabéns", posso salvar 15 bytes da minha solução original de 159 bytes. Não há nada particularmente novo ou interessante sobre o novo código acima em comparação com o código antigo (acabei de me livrar da pfunção e chamo saydiretamente), portanto, o restante deste post descreverá o código original, mostrado abaixo:
sub p{say join$",@_}p Guess,16,bit,signed,number;$==32767-rand 65536;p(TOO,$_<0?LOW:HIGH)while++$i,$_=<>-$=;p Congrats."!",You,found,the,number,in,$i,turns."!"
Sim, estou abusando da regra 1. Quem precisa de cordas, quando você pode ter palavras de baralho ? ;-)
Execute com perl -M5.010para ativar o sayrecurso Perl 5.10+ (ou substitua o corpo da pfunção print join$",@_,$/por um custo extra de 5 bytes).
Pontuações bônus:
- −300 pontos: "exibe as regras do jogo antes de iniciar o jogo"
- -50 pontos: "exibe o número de turnos realizados no final do jogo"
O código não contém literais de string em sentido estrito; portanto, diria que a regra 1 não é tecnicamente violada. O truque é que, no Perl, sem use strict, qualquer identificador que não corresponda a uma palavra-chave ou sub-rotina de idioma conhecido será avaliado com base em seu próprio nome. A funçãop simplesmente pega uma lista de palavras e as imprime, separadas por espaços.
Exemplo de reprodução:
Guess 16 bit signed number
0
TOO HIGH
-10000
TOO LOW
-5000
TOO HIGH
-7500
TOO LOW
-6250
TOO HIGH
-6875
TOO LOW
-6553
TOO HIGH
-6700
TOO HIGH
-6790
TOO LOW
-6745
TOO HIGH
-6767
TOO LOW
-6756
TOO HIGH
-6761
Congrats! You found the number in 13 turns!
Edit: Ah, certo, as regras dizem que eu preciso postar uma versão un-golfed do código também, então aqui vai. Tecnicamente, é "descolado", já que normalmente componho meus programas de código de golfe de forma mais ou menos completa desde o início, e às vezes pode ser complicado remover todas as otimizações de "golfe" sem alterar fundamentalmente como algumas partes do programa de trabalho. Ainda assim, pelo menos tentei adicionar espaços em branco, comentários e nomes de funções / variáveis mais significativos:
sub output {
# print all arguments separated by spaces, plus a newline:
# (in the golfed code, I use the special variable $" instead of " " for a space)
say join " ", @_;
}
# print the rules:
output Guess, 16, bit, signed, number;
# choose a random number between -32768 and 32767 inclusive:
# (in the golfed version, using the special variable $= allows
# the int() to be left out, since $= can only take integer values)
$number = int( 32767 - rand 65536 );
# loop until the input equals the chosen number, printing "TOO LOW / HIGH":
# (the loop ends when $diff == 0, since 0 is false in Perl)
output (TOO, $diff < 0 ? LOW : HIGH) while ++$count, $diff = (<> - $number);
# print congratulations, including the loop count:
output Congrats."!", You, found, the, number, in, $count, turns."!";
Ps. Como alternativa, se apenas o uso de palavras de barra em vez de strings parecer muito barato para você, aqui está uma solução de 182 bytes que não usa as letras TOLWHIG nem em palavras de barra (mas as usa em um operador de transliteração). Ele ainda recebe os mesmos bônus, para uma pontuação total de 182 - 350 = −168 pontos :
sub t{pop=~y/kpqvxyz/tolwhig/r}say"Guess 16 bit signed number";$==32767-rand 65536;say uc t"kpp ".($_<0?qpv:xyzx)while++$n,$_=<>-$=;say t"Cpnzraks! Ypu fpund kxe number yn $n kurns!"
A saída parece exatamente igual à acima. Pelas regras (originais), eu uso as letras te iimprimo as regras, uma vez que é permitido; eliminar esses usos custaria apenas dois bytes extras. Por outro lado, colocar toda a saída em maiúscula (que, com base nos comentários acima, parece ser permitida) me permitiria salvar três bytes.
WhileURong(USayNumbr;ISayBigrOrSmalr)