Perl 5.10+: 159 144 bayt - 350 = -206 puan
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!"
Edit 2: "Tebrikler" mesajı için herhangi bir dize değişmezi kullanmama izin veren son kural değişikliği ile, orijinal 159 baytlık çözümümden 15 bayt kaydedebilirim. Eski kod ile karşılaştırıldığında yukarıdaki yeni kod hakkında özellikle yeni veya ilginç bir şey yok (sadece p
fonksiyondan kurtuldum ve say
bunun yerine doğrudan çağırdım), bu nedenle bu yazının geri kalan kısmı aşağıda gösterilen orijinal kodu açıklayacaktır:
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."!"
Evet, kural 1'in cehennemini kötüye kullanıyorum. Bareword'ların olabileceği zaman kimin iplere ihtiyacı var ? ;-)
perl -M5.010
Perl 5.10+ say
özelliğini etkinleştirmek için ile çalıştırın (veya p
işlevin gövdesini print join$",@_,$/
5 baytlık ek bir maliyetle değiştirin).
Bonus puanları:
- Points300 puan: "oyuna başlamadan önce oyun kurallarını göster"
- −50 puan: "oyun sonunda alınan dönüş sayısını göster"
Kod katı anlamda hiçbir dize değişmezleri içerir , bu nedenle kural 1'in teknik olarak ihlal edilmediğini söyleyebilirim. İşin püf noktası, Perl'de, use strict
bilinen bir dil anahtar sözcüğüne veya altyordamına karşılık gelmeyen herhangi bir tanımlayıcının kendi adına göre basit bir şekilde değerlendireceğidir. İşlev p
daha sonra sözcüklerin listesini alır ve boşluklarla ayırarak yazdırır.
Örnek oynatma:
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!
Düzenleme: Oh, doğru, kurallar ben de kodun golf-olmayan bir sürümünü göndermek gerekir diyor, bu yüzden işte gidiyor. Teknik olarak, "de-golfed", çünkü genellikle kod golf programlarımı az ya da çok tamamen golf biçiminde oluşturduğumdan ve bazen bazı "golfy" optimizasyonlarını temelden değiştirmeden bazen zor olabilir program çalışması. Yine de, en azından boşluk, yorum ve daha anlamlı işlev / değişken adları eklemeye çalıştım:
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. Alternatif olarak, sadece dizeler yerine barewords kullanmak sizin için çok ucuz geliyorsa, burada harfleri TOLWHIG
barewordlarda bile kullanmayan (ancak bunları bir harf çevirisi işlecinde kullanan) 182 baytlık bir çözüm . Toplamda 182 - 350 = −168 puan için aynı bonusları kazanıyor :
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!"
Çıktı yukarıdakiyle tamamen aynı görünüyor. (Orijinal) kurallara göre, izin verdiği için harfleri t
ve i
kuralları yazdırırken kullanıyorum ; ancak bu kullanımların bile ortadan kaldırılması yalnızca iki bayt daha pahalıya mal olur. Tersine, tüm çıktıları büyük harf yapmak (yukarıdaki yorumlara dayanarak izin verilmiş gibi görünüyor) üç bayt kaydetmeme izin verecek.
WhileURong(USayNumbr;ISayBigrOrSmalr)