Perl 5.10+: 159 144 byte - 350 = −206 poin
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!"
Sunting 2: Dengan perubahan aturan terbaru yang memungkinkan saya untuk menggunakan string literal apa pun untuk pesan "congrats", saya dapat menyimpan 15 byte dari solusi 159-byte asli saya. Tidak ada yang khusus atau menarik tentang kode baru di atas dibandingkan dengan kode lama (saya baru saja menghilangkan pfungsi, dan saylangsung menelepon saja), jadi sisa tulisan ini akan menjelaskan kode asli, yang ditunjukkan di bawah ini:
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."!"
Ya, saya menyalahgunakan aturan 1. Siapa yang butuh string, ketika Anda dapat memiliki kata kunci ? ;-)
Jalankan dengan perl -M5.010untuk mengaktifkan fitur Perl 5.10+ say(atau ganti badan pfungsi dengan dengan print join$",@_,$/biaya tambahan 5 byte).
Skor bonus:
- −300 poin: "tampilkan aturan permainan sebelum memulai permainan"
- −50 poin: "tampilkan jumlah putaran yang dilakukan di akhir pertandingan"
Kode tidak mengandung string literal dalam arti yang ketat, jadi saya akan mengatakan bahwa aturan 1 secara teknis tidak dilanggar. Kuncinya adalah, di Perl, tanpa use strict, pengenal apa pun yang tidak sesuai dengan kata kunci atau subrutin bahasa yang dikenal akan dengan mudah mengevaluasi ke namanya sendiri. Fungsinyap kemudian hanya mengambil daftar kata dan mencetaknya, dipisahkan oleh spasi.
Contoh play-through:
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!
Sunting: Oh, benar, aturannya mengatakan saya perlu memposting versi yang tidak golf juga, jadi begini saja. Secara teknis, ini "de-golfed", karena saya biasanya menyusun program golf kode saya dalam bentuk golf yang kurang lebih sepenuhnya dari awal, dan kadang-kadang bisa sulit untuk menghapus semua optimasi "golfy" tanpa secara mendasar mengubah cara beberapa bagian dari pekerjaan program. Namun, saya setidaknya sudah mencoba menambahkan spasi putih, komentar, dan nama fungsi / variabel yang lebih bermakna:
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. Sebagai alternatif, jika hanya menggunakan kata kunci bukan string terasa terlalu curang untuk Anda, inilah solusi 182-byte yang tidak menggunakan huruf-huruf TOLWHIG bahkan dalam kata kunci (tetapi menggunakannya dalam operator transliterasi). Masih mendapat bonus yang sama, dengan skor total 182 - 350 = −168 poin :
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!"
Outputnya terlihat persis sama seperti di atas. Sesuai aturan (asli), saya menggunakan surat tdan imencetak aturan, karena diizinkan; menghilangkan bahkan penggunaan itu hanya membutuhkan dua byte tambahan. Sebaliknya, membuat semua huruf besar keluaran (yang, berdasarkan komentar di atas, tampaknya diizinkan) akan membuat saya menghemat tiga byte.
WhileURong(USayNumbr;ISayBigrOrSmalr)