Perl 5.10+: 159 144 bajtów - 350 = −206 punktów
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!"
Edycja 2: Wraz z ostatnią zmianą reguł, która pozwala mi używać dowolnego literału łańcuchowego dla komunikatu „gratulacje”, mogę zapisać 15 bajtów z mojego oryginalnego 159-bajtowego rozwiązania. Nie ma nic szczególnie nowego ani interesującego w powyższym nowym kodzie w porównaniu ze starym kodem (właśnie pozbyłem się pfunkcji i sayzamiast tego wywołałem bezpośrednio), więc pozostała część tego postu opisuje oryginalny kod, pokazany poniżej:
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."!"
Tak, nadużywam piekła poza regułą 1. Kto potrzebuje sznurków, kiedy możesz mieć słowa bez słów ? ;-)
Uruchom za pomocą, perl -M5.010aby włączyć funkcję Perl 5.10+ say(lub zastąp korpus pfunkcji print join$",@_,$/za dodatkową opłatą 5 bajtów).
Wyniki bonusowe:
- −300 punktów: „wyświetl zasady gry przed rozpoczęciem gry”
- −50 punktów: „wyświetl liczbę tur wykonanych na koniec gry”
Kod nie zawiera literałów łańcuchowych w ścisłym tego słowa znaczeniu, więc powiedziałbym, że zasada 1 nie jest technicznie naruszona. Sztuczka polega na tym, że w Perlu bez use strictidentyfikatora, który nie odpowiada słowu kluczowemu lub podprogramowi znanego języka, będzie można łatwo ocenić jego własną nazwę. Następnie funkcja ppo prostu pobiera listę słów i drukuje je, oddzielając je spacjami.
Przykładowy przebieg gry:
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!
Edycja: Och, racja, zasady mówią, że muszę również opublikować wersję kodu bez gry w golfa, więc proszę bardzo. Technicznie rzecz biorąc, jest to „gra w golfa”, ponieważ zwykle od początku komponuję swoje programy do gry w golfa w mniej lub bardziej w pełni golfowej formie, a czasem może być trudne usunięcie wszystkich optymalizacji gry w golfa bez zasadniczej zmiany tego, jak niektóre części program pracy. Mimo to przynajmniej próbowałem dodać spacje, komentarze i bardziej znaczące nazwy funkcji / zmiennych:
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. Alternatywnie, jeśli korzystanie ze słów kluczowych zamiast ciągów znaków jest dla ciebie zbyt trudne, oto 182-bajtowe rozwiązanie, które nie używa liter TOLWHIG nawet w słowach kluczowych (ale używa ich w operatorze transliteracji). Nadal dostaje te same bonusy, za łączny wynik 182 - 350 = −168 punktów :
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!"
Wyjście wygląda dokładnie tak samo jak powyżej. Zgodnie z (oryginalnymi) regułami używam liter ti idrukuję reguły, ponieważ jest to dozwolone; wyeliminowanie nawet tych zastosowań kosztowałoby tylko dwa dodatkowe bajty. I odwrotnie, utworzenie całej wielkiej litery wyjściowej (co wydaje się dozwolone na podstawie powyższych komentarzy) pozwoliłoby mi zaoszczędzić trzy bajty.
WhileURong(USayNumbr;ISayBigrOrSmalr)