Perl 5.10+: 159 144 byte - 350 = −206 punti
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!"
Modifica 2: Con la recente modifica delle regole che mi consente di utilizzare qualsiasi stringa letterale per il messaggio "complimenti", posso salvare 15 byte dalla mia soluzione originale a 159 byte. Non c'è nulla di particolarmente nuovo o interessante nel nuovo codice sopra rispetto al vecchio codice (mi sono appena liberato della pfunzione e ho chiamato saydirettamente invece), quindi il resto di questo post descriverà il codice originale, mostrato di seguito:
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ì, sto abusando della regola 1. Chi ha bisogno di stringhe, quando puoi avere delle password ? ;-)
Esegui con perl -M5.010per abilitare la sayfunzione Perl 5.10+ (o sostituire il corpo della pfunzione con print join$",@_,$/un costo aggiuntivo di 5 byte).
Punteggi bonus:
- −300 punti: "visualizza le regole del gioco prima di iniziare il gioco"
- −50 punti: "visualizza il numero di turni effettuati alla fine del gioco"
Il codice non contiene letterali stringa in senso stretto, quindi direi che la regola 1 non è tecnicamente violata. Il trucco è che, in Perl, senza use strict, nessun identificatore che non corrisponde a una parola chiave o subroutine di lingua nota valuterà semplicemente il proprio nome. La funzione pquindi prende semplicemente un elenco di parole e le stampa, separate da spazi.
Esempio di play-through:
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!
Modificare: Oh, giusto, le regole dicono che devo pubblicare anche una versione non giocata del codice, quindi eccola qui. Tecnicamente, è "de-golfed", poiché di solito compongo i miei programmi di golf di codice in forma più o meno completamente giocata a golf dall'inizio, e a volte può essere difficile rimuovere tutte le ottimizzazioni "golfy" senza cambiare radicalmente il modo in cui alcune parti del programma di lavoro. Tuttavia, ho almeno provato ad aggiungere spazi bianchi, commenti e nomi di funzioni / variabili più significativi:
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. In alternativa, se usare solo parole semplici invece di stringhe sembra troppo economico per te, ecco una soluzione da 182 byte che non usa le lettere TOLWHIG anche nelle parole nude (ma le usa in un operatore di traslitterazione). Ottiene ancora gli stessi bonus, per un punteggio totale di 182 - 350 = −168 punti :
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!"
L'output ha esattamente lo stesso aspetto di cui sopra. Per le regole (originali), io uso le lettere te inel stampare le regole, poiché è permesso; l'eliminazione anche di quegli usi costerebbe solo due byte extra. Al contrario, rendere tutto l'output in maiuscolo (che, sulla base dei commenti sopra, sembra essere consentito) mi consentirebbe di salvare tre byte.
WhileURong(USayNumbr;ISayBigrOrSmalr)