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: С недавним изменением правил, которое позволяет мне использовать любой строковый литерал для сообщения «поздравляю», я могу сохранить 15 байтов из моего исходного 159-байтового решения. Нет ничего особенно нового или интересного в новом вышеприведенном коде по сравнению со старым кодом (я только что избавился от 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(или замените тело pфункции наprint join$",@_,$/ на дополнительную плату в 5 байт).
Бонусные баллы:
- −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."!";
Ps. В качестве альтернативы, если использование простых слов вместо строк кажется вам слишком обманчивым, вот 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)