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: З недавньою зміною правил, яка дозволяє мені використовувати будь-який літеральний рядок для повідомлення "congrats", я можу зберегти 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."!";
Пс. Як альтернатива, якщо просто використання баревок замість рядків для вас здається занадто шахрайським, ось 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)