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. ใครต้องการเงื่อนไขเมื่อคุณมีbarewords ? ;-)
ทำงานด้วย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!
แก้ไข:โอ้ถูกต้องกฎบอกว่าฉันต้องโพสต์โค้ดที่ไม่ตีกอล์ฟเช่นกัน ในทางเทคนิคแล้วมันเป็น "de-golfed" เนื่องจากฉันมักจะเขียนโปรแกรมกอล์ฟของฉันในรูปแบบ golfed มากขึ้นหรือน้อยลงจากจุดเริ่มต้นและบางครั้งมันอาจเป็นเรื่องยากที่จะลบการเพิ่มประสิทธิภาพ "golfy" ทั้งหมดโดยไม่ต้องเปลี่ยนวิธีบางส่วน โปรแกรมทำงาน ยังฉันอย่างน้อยพยายามเพิ่มช่องว่างความคิดเห็นและชื่อฟังก์ชั่น / ตัวแปรที่มีความหมายมากขึ้น:
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 เป็นทางเลือกถ้าเพียงแค่ใช้ barewords แทนสายอักขระที่รู้สึกว่า cheaty เกินไปสำหรับคุณนี่เป็นโซลูชั่นขนาด 182 ไบต์ที่ไม่ใช้ตัวอักษรTOLWHIG แม้แต่ใน barewords (แต่ใช้ในตัวดำเนินการทับศัพท์) มันยังคงได้รับโบนัสเหมือนเดิมรวมคะแนน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)