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。当您可以使用裸字时,谁需要字符串?;-)
运行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."!";
附言 作为替代方案,如果仅使用裸字而不是字符串对您来说太作弊,那么这是一种182字节的解决方案,TOLWHIG 即使在裸字中也不使用字母(而是在音译运算符中使用字母)。它仍然获得相同的奖金,总分为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打印规则。但是,即使消除这些使用也只会花费两个额外的字节。相反,将所有输出大写(根据上面的评论,这似乎是允许的)将使我节省三个字节。
WhileURong(USayNumbr;ISayBigrOrSmalr)