Perl 5.10以降:159 144バイト-350 = -206ポイント
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!"
編集2:最近のルールの変更により、「おめでとう」メッセージに任意の文字列リテラルを使用できるようになり、元の159バイトのソリューションから15バイトを節約できます。古いコードと比較して、上記の新しいコードについて特に目新しいものや興味深いものはありません(p関数を削除し、say代わりに直接呼び出します)。この投稿の残りの部分では、以下に示す元のコードについて説明します。
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."!"
うん、私は文字列を必要とするルール1の地獄を乱用しています、ときに持つことができます裸の単語?;-)
with perl -M5.010を実行して、Perl 5.10+ say機能を有効にします(または5バイトの追加コストでp関数の本体を置き換えprint join$",@_,$/ます)。
ボーナススコア:
- −300ポイント:「ゲームを開始する前にゲームのルールを表示する」
- −50ポイント:「ゲーム終了時に取られたターン数を表示する」
コードには厳密な意味で文字列リテラルが含まれていないため、厳密にはルール1は違反されていないと言えます。トリックは、Perlでは、なしuse strictで、既知の言語キーワードまたはサブルーチンに対応しない識別子は、それ自身の名前に単純に評価されるということです。関数pは、単語のリストを取得し、スペースで区切って出力します。
プレイスルーの例:
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!
編集:ああ、そうです、ルールは私がコードの非ゴルフバージョンも投稿する必要があると言っているので、ここに行きます。技術的には、「デゴルフ」です。通常、最初からコードゴルフプログラムを多かれ少なかれ完全にゴルフ形式で作成しているため、一部の部分を根本的に変更せずに「ゴルフ」最適化をすべて削除するのは難しい場合がありますプログラム作業。それでも、私は少なくとも空白、コメント、より意味のある関数/変数名を追加しようとしました:
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."!";
追伸 別の方法として、文字列の代わりにベアワードを使用するだけではカンニングに感じない場合は、ベアワードでTOLWHIG も文字を使用しない(ただし、音訳演算子で使用する)182バイトのソリューションがあります。合計スコアが182 − 350 = −168ポイントの場合、引き続き同じボーナスが得られます。
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!"
出力は上記とまったく同じに見えます。(元の)規則に従って、許可されているので、私は文字tを使用しi、規則を印刷します。ただし、これらの使用を排除しても、余分に2バイトしかかかりません。逆に、すべての出力を大文字にすると(上記のコメントに基づいて許可されているように見える)、3バイト節約できます。
WhileURong(USayNumbr;ISayBigrOrSmalr)