Perl 5.10+: 159 144 octets - 350 = −206 points
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: Avec la récente modification des règles qui me permet d'utiliser n'importe quel littéral de chaîne pour le message "félicitations", je peux enregistrer 15 octets à partir de ma solution originale de 159 octets. Il n'y a rien de particulièrement nouveau ou intéressant dans le nouveau code ci-dessus par rapport à l'ancien code (je viens de me débarrasser de la pfonction et d'appeler saydirectement à la place), donc le reste de cet article décrira le code original, illustré ci-dessous:
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."!"
Ouais, j'abuse l'enfer de la règle 1. Qui a besoin de chaînes, quand vous pouvez avoir des mots nus ? ;-)
Exécutez avec perl -M5.010pour activer la fonction Perl 5.10+ say(ou remplacez le corps de la pfonction par print join$",@_,$/un coût supplémentaire de 5 octets).
Scores bonus:
- −300 points: "afficher les règles du jeu avant de commencer le jeu"
- −50 points: "afficher le nombre de tours effectués en fin de partie"
Le code ne contient aucun littéral de chaîne au sens strict, donc je dirais que la règle 1 n'est, techniquement, pas violée. L'astuce est que, en Perl, sans use strict, tout identifiant qui ne correspond pas à un mot-clé ou un sous-programme de langue connu sera simplement évalué à son propre nom. La fonction pprend alors simplement une liste de mots et les imprime, séparés par des espaces.
Exemple de lecture:
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: Oh, c'est vrai, les règles disent que je dois aussi publier une version non golfée du code, alors voilà. Techniquement, c'est "dé-golfé", car je compose habituellement mes programmes de golf de code sous une forme plus ou moins complète depuis le début, et il peut parfois être difficile de supprimer toutes les optimisations "golfiques" sans changer fondamentalement la façon dont certaines parties du programme de travail. Pourtant, j'ai au moins essayé d'ajouter des espaces, des commentaires et des noms de fonction / variable plus significatifs:
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. Comme alternative, si le simple fait d'utiliser des mots nus au lieu de chaînes vous semble trop trompeur, voici une solution de 182 octets qui n'utilise pas les lettres TOLWHIG même dans les mots nus (mais les utilise dans un opérateur de translittération). Il obtient toujours les mêmes bonus, pour un score total de 182 à 350 = −168 points :
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 sortie est exactement la même que ci-dessus. Selon les règles (originales), j'utilise les lettres tet ipour imprimer les règles, car c'est autorisé; cependant, l'élimination de ces utilisations ne coûterait que deux octets supplémentaires. Inversement, rendre toutes les sorties en majuscules (qui, sur la base des commentaires ci-dessus, semble être autorisé) me permettrait d'économiser trois octets.
WhileURong(USayNumbr;ISayBigrOrSmalr)