Perl 5.10+: 159 144 bytes - 350 = -206 puntos
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!"
Edición 2: con el reciente cambio de reglas que me permite usar cualquier cadena literal para el mensaje "felicidades", puedo guardar 15 bytes de mi solución original de 159 bytes. No hay nada particularmente novedoso o interesante sobre el nuevo código anterior en comparación con el código anterior (acabo de deshacerme de la pfunción y llamo saydirectamente en su lugar), por lo que el resto de esta publicación describirá el código original, que se muestra a continuación:
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."!"
Sí, estoy abusando de la regla 1. ¿Quién necesita cadenas, cuando puedes tener palabras vacías ? ;-)
Ejecute con perl -M5.010para habilitar la saycaracterística Perl 5.10+ (o reemplace el cuerpo de la pfunción con print join$",@_,$/un costo adicional de 5 bytes).
Puntajes de bonificación:
- −300 puntos: "muestra las reglas del juego antes de comenzar el juego"
- −50 puntos: "muestra el número de turnos realizados al final del juego"
El código no contiene literales de cadena en sentido estricto, por lo que diría que, técnicamente, la regla 1 no se infringe. El truco es que, en Perl, sin use strict, cualquier identificador que no corresponda a una palabra clave o subrutina de lenguaje conocido simplemente se evaluará con su propio nombre. La función psimplemente toma una lista de palabras y las imprime, separadas por espacios.
Ejemplo de juego:
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!
Editar: Oh, claro, las reglas dicen que también necesito publicar una versión no codificada del código, así que aquí va. Técnicamente, es "des-golf", ya que generalmente compongo mis programas de golf de código en forma más o menos completa desde el principio, y a veces puede ser difícil eliminar todas las optimizaciones "golf" sin cambiar fundamentalmente cómo algunas partes del programa de trabajo. Aún así, al menos he intentado agregar espacios en blanco, comentarios y nombres de funciones / variables más 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."!";
PD. Como alternativa, si solo usar palabras vacías en lugar de cadenas se siente demasiado engañoso para usted, aquí hay una solución de 182 bytes que no usa las letras TOLWHIG incluso en palabras vacías (pero las usa en un operador de transliteración). Todavía recibe los mismos bonos, para un puntaje total de 182 - 350 = −168 puntos :
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!"
La salida se ve exactamente igual a la anterior. Según las reglas (originales), uso las letras ty ial imprimir las reglas, ya que está permitido; Sin embargo, eliminar incluso esos usos solo costaría dos bytes adicionales. Por el contrario, poner todo el resultado en mayúscula (que, según los comentarios anteriores, parece estar permitido) me permitiría guardar tres bytes.
WhileURong(USayNumbr;ISayBigrOrSmalr)