Perl 5.10+: 159 144 Bytes - 350 = -206 Punkte
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!"
Bearbeiten 2: Mit der letzten Regeländerung, die es mir ermöglicht, ein beliebiges Zeichenfolgenliteral für die "Glückwunsch" -Nachricht zu verwenden, kann ich 15 Bytes von meiner ursprünglichen 159-Byte-Lösung einsparen. Der obige neue Code ist im Vergleich zum alten Code nicht besonders neuartig oder interessant (ich habe gerade die pFunktion entfernt und rufe saystattdessen direkt auf). Der Rest dieses Beitrags beschreibt daher den unten gezeigten Originalcode:
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."!"
Ja, ich missbrauche die Hölle aus Regel 1. Wer braucht Saiten, wenn Sie Barewörter haben können ? ;-)
Führen Sie mit aus perl -M5.010, um die Perl 5.10+ say-Funktion zu aktivieren (oder ersetzen Sie den pFunktionskörper print join$",@_,$/gegen einen Aufpreis von 5 Byte).
Bonuspunkte:
- −300 Punkte: "Spielregeln vor Spielbeginn anzeigen"
- −50 Punkte: "Anzahl der Runden am Ende des Spiels anzeigen"
Der Code enthält streng genommen keine String-Literale. Ich würde also sagen, dass Regel 1 technisch gesehen nicht verletzt wird. Der Trick ist, dass in Perl use strictjeder Bezeichner, der keinem bekannten Sprachschlüsselwort oder Unterprogramm entspricht, einfach zu seinem eigenen Namen ausgewertet wird. Die Funktion nimmt pdann einfach eine Liste von Wörtern und druckt sie durch Leerzeichen getrennt aus.
Beispiel für ein Durchspielen:
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!
Bearbeiten: Oh, richtig, die Regeln besagen, dass ich auch eine nicht-Golf-Version des Codes posten muss, also geht es los. Technisch gesehen ist es "de-golfed", da ich meine Code-Golfprogramme in der Regel von Anfang an in mehr oder weniger vollständiger Form zusammenstelle. Manchmal kann es schwierig sein, alle "golfy" -Optimierungen zu entfernen, ohne dabei grundlegend zu ändern, wie einige Teile der Software funktionieren Programm arbeiten. Trotzdem habe ich zumindest versucht, Leerzeichen, Kommentare und aussagekräftigere Funktions- / Variablennamen hinzuzufügen:
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. Als Alternative, wenn Sie nur Barewords anstelle von Strings verwenden, ist dies eine 182-Byte-Lösung, bei der die Buchstaben nicht TOLWHIG einmal in Barewords verwendet werden (sondern in einem Transliterationsoperator). Es erhält immer noch die gleichen Boni für eine Gesamtpunktzahl von 182 - 350 = −168 Punkte :
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!"
Die Ausgabe sieht genauso aus wie oben. Gemäß den (Original-) Regeln verwende ich die Buchstaben tund idrucke die Regeln, da dies erlaubt ist. Das Eliminieren dieser Verwendungen würde jedoch nur zwei zusätzliche Bytes kosten. Wenn ich dagegen die gesamte Ausgabe in Großbuchstaben schreibe (was nach den obigen Kommentaren zulässig zu sein scheint), kann ich drei Bytes einsparen.
WhileURong(USayNumbr;ISayBigrOrSmalr)