Perl 5.10+: 159 144 byte - 350 = −206 điểm
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!"
Chỉnh sửa 2: Với sự thay đổi quy tắc gần đây cho phép tôi sử dụng bất kỳ chuỗi ký tự nào cho thông báo "chúc mừng", tôi có thể lưu 15 byte từ giải pháp 159 byte ban đầu của mình. Không có gì đặc biệt hoặc thú vị về mã mới ở trên so với mã cũ (tôi vừa thoát khỏi pchức năng và gọi saytrực tiếp thay thế), vì vậy phần còn lại của bài đăng này sẽ mô tả mã gốc, được hiển thị bên dưới:
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."!"
Vâng, tôi đang lạm dụng địa ngục ngoài quy tắc 1. Ai cần dây, khi bạn có thể có barewords ? ;-)
Chạy với perl -M5.010để bật saytính năng Perl 5.10+ (hoặc thay thế phần thân của phàm với print join$",@_,$/chi phí thêm 5 byte).
Điểm thưởng:
- −300 điểm: "hiển thị các quy tắc trò chơi trước khi bắt đầu trò chơi"
- 50 điểm: "hiển thị số lượt được thực hiện khi kết thúc trò chơi"
Mã không chứa chuỗi ký tự theo nghĩa nghiêm ngặt, vì vậy tôi nói rằng quy tắc 1 về mặt kỹ thuật không bị vi phạm. Bí quyết là, trong Perl, không có use strictbất kỳ định danh nào không tương ứng với một từ khóa hoặc chương trình con ngôn ngữ đã biết sẽ đơn giản đánh giá tên của chính nó. Chức năngp sau đó chỉ cần lấy một danh sách các từ và in chúng ra, cách nhau bởi khoảng trắng.
Ví dụ phát qua:
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!
Chỉnh sửa: Ồ, đúng rồi, các quy tắc nói rằng tôi cũng cần đăng một phiên bản chưa được mã hóa của mã, vì vậy nó sẽ đi. Về mặt kỹ thuật, đó là "không chơi gôn", vì tôi thường soạn các chương trình golf mã của mình ở dạng golf ít nhiều đầy đủ ngay từ đầu, và đôi khi có thể khó để loại bỏ tất cả các tối ưu hóa "golf" mà không thay đổi căn bản một số phần của chương trình làm việc. Tuy nhiên, ít nhất tôi đã cố gắng thêm khoảng trắng, nhận xét và tên hàm / biến có ý nghĩa hơn:
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."!";
Thi thiên Thay vào đó, nếu chỉ sử dụng barewords thay vì chuỗi cảm thấy quá gian lận đối với bạn, thì đây là một giải pháp 182 byte không sử dụng các chữ cái TOLWHIG ngay cả trong barewords (nhưng sử dụng chúng trong toán tử chuyển ngữ). Nó vẫn nhận được cùng số tiền thưởng, với tổng số điểm là 182 - 350 = −168 điểm :
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!"
Đầu ra trông giống hệt như trên. Theo các quy tắc (bản gốc), tôi sử dụng các chữ cái tvà iin các quy tắc, vì nó được cho phép; loại bỏ ngay cả những sử dụng sẽ chỉ tốn hai byte thêm. Ngược lại, làm cho tất cả chữ hoa đầu ra (mà dựa trên các nhận xét ở trên dường như được cho phép) sẽ cho phép tôi lưu ba byte.
WhileURong(USayNumbr;ISayBigrOrSmalr)