Çok düşük yapmak için en kısa kod - Çok yüksek bir oyun


20

Bir oyun yapmak zorundasın Çok düşük --- Çok yüksek (TLTH) en kısa kodda (bayt cinsinden)

Oyun kuralları:

  1. Bilgisayar tam sayı aralığından rastgele bir sayı seçecektir (-32768..32767).
  2. Şimdi bir sayı düşünecek ve gireceksiniz.
  3. Bilgisayar, numaranızın seçilen sayıdan TOO LOWdaha düşük ( ) veya daha yüksek ( TOO HIGH) olduğunu söyleyecektir .
  4. Numarayı tahmin ettiğinizde, bilgisayar görüntülenmelidir Congrats! You found the number!.

Kod Kuralları:

  1. Karakterleri kullanmayın T, O, L, W, H, Ive Gdize veya karakter değişmezlerinde (küçük ne de büyük harf ne).
    Örneğin:

    tolower(T);  // Acceptable  
    cout<<"T";   // Unacceptable
    char ch='T'; // Unacceptable
    
  2. Kodunuz oyuna başlamadan önce oyun kurallarını görüntüleyebiliyorsa 300 baytı kaldırın .

  3. Kodunuz tur sayısını ve oyunun sonunda alınan tur sayısını şu şekilde görüntüleyebiliyorsa 50 baytı kaldırın :

    "Congrats! You found the number in n turns!"
    

    burada n, alınan dönüş sayısıdır,

    "Congrats! You found the number!"  
    
  4. Kodunuz kullanıcıya girdiğiniz sayının tamsayı aralığının dışında olduğunu söyleyebiliyorsa puanınızdan 25 bayt çıkarın .
    Örneğin:

    Enter the number: 40000  
    Sorry! This number is out of range
    Please Enter the number again:  
    
  5. 25 bayt kaldırma Kodunuz herhangi bir yerleşik rasgele işlevden değil rasgele sayıyı alırsa.

  6. 10 bayt kaldırma Kodunuz renkli "tebrik" gösteriyorsa (varsayılan beyaz dışında herhangi bir renk seçin).

Gönderme Kuralları:

  1. Dil adınızla bir başlık ekleyin ve tüm ödül hesaplamaları ve açıklamalarıyla puanlayın.

  2. Golf ve golf edilmemiş kodunuzu gönderin.

kazanan

  1. En az bayt ile cevap kazanır.
  2. Beraberlik olursa, daha fazla oyu olan cevap kazanır.
  3. Kazanan 5 gün sonra seçilecektir.

DÜZENLEME : Lütfen kodunuzun çıktısını gösterin.
DÜZENLEME-2 : Kurallar-1, Kurallar-2, 3 ve 4 için Kural Kurallarını göz ardı edebilirsiniz

İyi şanslar :]


2
Bu oyun kurallarının geçerli bir açıklaması mı? WhileURong(USayNumbr;ISayBigrOrSmalr)
John Dvorak

1
Puanlama açıklamanıza dayanarak, ne bir kod golfü ne de bir popülerlik yarışması yoktur. Bu bir kod meydan okuma (popülerlik tiebreaker ile). Wikis etiketini kontrol edin. Meydan okumayı uygun şekilde etiketlemek için bir düzenleme önerdim. ps - Jinx! @mniip
Jonathan Van Matre

1
@JonathanVanMatre , kravat kırıcıya rağmen kod golf gibi geliyor .
Mart'ta mniip

21
Ayrıca, diğer oyunculara cevaplarını iyileştirmede yardımcı olma kuralını özellikle sevmiyorum. Prenses Gelinin Dev Andre'sinin ölümsüz sözleriyle, "Bu çok sporcu değil".
Jonathan Van Matre

1
Bu soru böyledir. . . David H. Ahl
Michael Stern

Yanıtlar:


2

JavaScript (-210 puan ( 190bayt - 300 (kurallar için)) - 50 (tahmin sayısı için) - 25 (herhangi bir yerleşik rasgele sayı kaynağı kullanmamanız için) - 25 (girişin işaretli bir aralığın dışında olup olmadığını söylemek için 16-bit tamsayı) ):

golfed:

alert('Guess number',n=(m=2<<15)/2-new Date%m);for(z=0;a=+prompt(++z);)alert(a>m|a<1-m?m+'-'+-~-m:a==n?'Great! You found the number in '+z+' turns':atob('VE9P\x47E'+(a>n?'hJR0g=':'xPVw==')))

Tam kod (güzel biçimlendirilmiş):

var max = 2 << 15;
var random = max/2 - new Date%max;
var counter = 0;

while (1) {
    var guess = +prompt();

    ++counter;

    if (guess > max | guess < -~-max) {
        alert(-~-max + '-' + max); // Shows that the range is between -32767 and 32768
    } else if (guess > random) {
        alert('TOO HIGH');
    } else if (guess < random) {
        alert('TOO LOW');
    } else if (guess == random) {
        alert('Congrats! You found the number in ' + counter + ' turns');
        break;
    }
}

Çıktı:

ALERT:  Guess number
PROMPT: 5
ALERT:  TOO LOW
PROMPT: 20000
ALERT:  TOO LOW
PROMPT: 30000
ALERT:  TOO HIGH
PROMPT: 25000
ALERT:  TOO HIGH
PROMPT: 22500
ALERT:  TOO HIGH
PROMPT: 21000
ALERT:  TOO HIGH
PROMPT: 20500
ALERT:  TOO HIGH
PROMPT: 20200
ALERT:  TOO LOW
PROMPT: 20400
ALERT:  TOO LOW
PROMPT: 20450
ALERT:  TOO LOW
PROMPT: 20475
ALERT:  TOO HIGH
PROMPT: 20460
ALERT:  TOO LOW
PROMPT: 20468
ALERT:  TOO HIGH
PROMPT: 20464
ALERT:  TOO LOW
PROMPT: 20466
ALERT:  TOO LOW
PROMPT: 34000
ALERT:  -32767-32768
PROMPT: 20467
ALERT:  Great! You found the number in 17 turns!
PROMPT: (nothing)

@IlmariKaronen Üzgünüm, bir hata yaptım. Cevabımı güncelledim.
Diş fırçası

Teşekkürler, şimdi çalışıyor ... ama sanırım kırılıyor gibi görünüyor 0. :-( Ayrıca, TOO LOW/ TOO HIGH? De boşluk olmamalı
Ilmari Karonen

19

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 pfonksiyondan kurtuldum ve saybunun 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.010Perl 5.10+ sayözelliğini etkinleştirmek için ile çalıştırın (veya piş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 strictbilinen 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 pdaha 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 tve ikuralları 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.


Bu güzel ve akıllı bir cevap! Benden +1
Mukul Kumar

Şimdi bunu gördüğüme göre, cezayı alırsanız Ruby 1.8 ile yenilebileceğini merak ediyorum def method_missing *args;args.join' ';end.
Kaya

Seni eski JavaScript ile yendim!
Diş Fırçası

14

Python 2: -80 puan (270-300-50)

print"WhileURong(USayNumbr;ISayBigrOrSmalr)"
import random
r=random.randint(-32768,32767)
g=i=1
while g:g=cmp(input(),r);print("C\x6fn\x67ra\x74s! Y\x6fu f\x6fund \x74\x68e number \x69n %d \x74urns!"%i,"\x54\x4f\x4f \x48\x49\x47\x48","\x54\x4f\x4f \x4c\x4f\x57")[g];i+=1

Puan 270 karakterdir, eksi 300 yönergeleri gösterir, eksi 50 "tebrikler" deki tahmin sayısını gösterir. dize, toplam negatif 80 puan.

Döngüsün, dizgesiz, dizesiz, dizgesiz sürümü:

while g:
    g=cmp(input(),r)
    print ("Congrats! You found the number in %d turns!"%i,
           "TOO HIGH",
           "TOO LOW")[g]
    i+=1

Yerleşik cmpişlev, değerler eşitse 0, birincisi daha küçükse -1, birincisi daha büyükse 1 değerini döndürür. Ben değer dizeleri bir dizi endekslemek için kullanın ve sonra tekrar döngü çıkış koşulu olarak. Bir diziyi negatif dizine (-1 gibi) endekslemek, dizinin başından ziyade dizinin sonundan itibaren sayılır.

Ben şiddetle ithalatı atlamak için cazip ve sadece kullanmak edildi 4gereğince, benim rasgele sayı olarak XKCD 221 (yani -25 karakter ikramiyeye hak kazanmaktadır ki?).

Örnek run (negatif matematik yapamıyorum bir hata ile tamamlandı):

WhileURong(USayNumbr;ISayBigrOrSmalr)
0
TOO HIGH
-16000
TOO LOW
-8000
TOO HIGH
-12000
TOO HIGH
-14000
TOO LOW
-13000
TOO HIGH
-13500
TOO HIGH
-13750
TOO LOW
-13625
TOO HIGH
-13712
TOO LOW
-13660
TOO HIGH
-13640
TOO HIGH
-13685
TOO HIGH
-13700
TOO LOW
-13695
TOO LOW
-13690
TOO LOW
-13687
Congrats! You found the number in 17 turns!

Lütfen kodunuzun örnek çıktısını gösterin.
Mukul Kumar

2
Bu kırılma kodu kural 1 değil mi? Süre (USayNumbr; ISayBigrOrSmalr) bir veya daha fazla Os, Ls, Ws, Hs, Is ve Gs içerir.
Fors

@Cruncher: Program sona erdiği için ne demek istediğinden emin değilim. Doğru değeri aldıktan sonra gsıfır olur ve whiledöngü sona erer.
Blckknght

@Blckknght ayy, hızlı okuma
Cruncher

@ForsYou can ignore Rule-1 for Rules-2,3 & 4 in Code Rules
Cruncher

13

JavaScript 293, -300 (kurallar) - 50 (dönüş ekranı) - 25 (aralık uyarısı) - 25 (rastgele işlev yok) = -107 (yeni puan)

r=new Date%65536+~(z=32767);n=x="";for((A=alert)("\107uess my number, \111 \147\151ve feedback");(x=prompt())!=r;A(0>(x-~z^x-z)?"\164\157\157 "+(x>r?"\150\151\147\150":"\154\157\167"):"Ran\147e: "+~z+" - "+z))n++;A("C\157n\147ra\164s! Y\157u f\157und \164\150e number \151n "+ ++n+"\164urns!")

RGB sözleşmeleriyle siyahın bir renk olduğunu iddia ediyorum, ama bu biraz hile olurdu ...

Oh, ve ekleyebilir miyim, 1 numaralı kural da yok!

Bir dizi uyarı ve istemde çıkış

ALERT: Guess my number, I give feedback
PROMPT: 0
ALERT: too low
PROMPT: 16000
ALERT: too low
PROMPT: 24000
ALERT: too low
PROMPT: 28000
ALERT: too high
PROMPT: 26000
ALERT: too high
PROMPT: 25000
ALERT: too low
PROMPT: 25500
ALERT: too high
PROMPT: 25250
ALERT: too low
PROMPT: 25375
ALERT: too high
PROMPT: 25310
ALERT: too low
PROMPT: 25342
ALERT: too low
PROMPT: 25358
ALERT: too low
PROMPT: 25366
ALERT: too high
PROMPT: 25362
ALERT: too high
PROMPT: 25360
ALERT: too high
PROMPT: 25359
ALERT: Congrats! You found the number in 16 turns!

Kod çözülmemiş kod:

r = (new Date)%65536+~(z=32767); //Generates random number in range based off date's milliseconds... I'd use epoch, but I need to conserve
n=x=""; // Sets count and input to blank, these change as time goes on
// The line below sets up a call for `alert`, provides the initial rules, and subsequent loops compares the prompt with the number, as well as sets up "too", "high",  "low" and "out of range" message strings, and provides the feedback
for((A=alert)("\107uess my number, \111 \147\151ve feedback");(x=prompt())!=r;A(0>(x-~z^x-z)?"\164\157\157 "+(x>r?"\150\151\147\150":"\154\157\167"):"Ran\147e: "+~z+" - "+z))
{
    n++; // adds one to count providing the number isn't guessed yet
}
alert("C\157n\147ra\164s! Y\157u f\157und \164\150e number \151n "+ ++n+" \164urns!") // Congratulates the player, and displays the correct number of turns taken

kuralları dikkatlice okudun mu? iyi bir çıktı ile ungolfed kodu göndermek zorunda
Mukul Kumar

@MukulKumar sıralanmış ...
WallyWest

Sen ile cevap adýnýnönüne 4 kaydedebilir A=alert;ve tüm değiştirilmesi alertile A. Ve A(0>(x...noktalı virgülden sonra uyarıyı taşırsanız bir tane daha prompt())!=r;)n++1.
DocMax

değiştirebileceğiniz feedback if too high/lowşu anda 84 karakter kullanan i give feedbacksadece ihtiyaç duyacak olan ( \151 \147\151ve feedbackkaydetmeye veya 24 karakter 60 karakter .
corsiKa

1
Yanılıyor olabilirim, ama son uyarıda yapmak zorunda kalmak için n++for döngüsünün içine taşıyabilirsiniz düşünüyorum . 3 kurtaracaktı.x=prompt(n++)+ ++n+
DocMax

7

Javascript, 324 bayt, skor -76

[Kural değişiklikleri nedeniyle güncellendi]

  • 324 bayt
  • -300 kuralları göstermek için
  • Kullanıcı kazandığında dönüşleri göstermek için -50
  • -25, aralığın dışında bir sayı girdiğinde kullanıcıya bildirdiği için
  • Dahili rastgele kullanmadığınız için -25 (güncellendi)

Toplam Puan: -76

golfed:

function q(y){return y.replace(/./g,function(x){h=x.charCodeAt(0);return String.fromCharCode(h>32&h<58?h+32:h)})}d=o=32768;alert("WhileURong(USayNumbr;ISayBigrOrSmalr)");for(a=1,n=new Date%(2*o)-o;d-n;a++)d=+prompt(a),alert(d>=o|d<-o?"BAD":d<n?q("4// ,/7"):d>n?q("4// ()'("):"Congrats! You found the number in "+a+" turns!")

Bu karmaşayı çözelim.

İlk olarak, düzgün bir şekilde tanımlanmış (ancak bu gizlenmiş kodla hala çok iyi değil):

function q(y) {
  return y.replace(/./g, function(x) {
    h = x.charCodeAt(0);
    return String.fromCharCode(h > 32 & h < 58 ? h + 32 : h)
  })
}

d = o = 32768;
alert("WhileURong(USayNumbr;ISayBigrOrSmalr)");

for (a = 1, n = new Date % (2 * o) - o; d - n; a++)
  d = +prompt(), alert(d >= o | d < -o ? "BAD" : d < n ? q("4// ,/7") : d > n ? q("4// ()'(") : "Congrats! You found the number in " + a + " turns!")

İkincisi, yeniden adlandırma tanımlayıcıları:

function unencrypt(encrypted) {
  return encrypted.replace(/./g, function(character) {
    charCode = character.charCodeAt(0);
    return String.fromCharCode(charCode > 32 & charCode < 58 ? charCode + 32 : charCode)
  })
}

guess = limit = 32768;
alert("WhileURong(USayNumbr;ISayBigrOrSmalr)");

for (tries = 1, randomNumber = new Date % (2 * o) - o; guess - randomNumber; tries++)
  guess = +prompt(),
  alert(guess >= limit | guess < -limit ? "BAD" : guess < randomNumber ? unencrypt("4// ,/7") : guess > randomNumber ? q("4// ()'(") : "Congrats! You found the number in " + tries + " turns!")

Böylece unencrypt işlevi ASCII 33 ( !) ve ASCII 58 ( :) arasındaki tüm karakterleri alır ve aralıktaki karakterlere dönüştürerek 32 ekler A-Z.

Tüm dizeleri şifrelemeden kodu daha fazla çözelim:

guess = limit = 32768;
alert("WhileURong(USayNumbr;ISayBigrOrSmalr)");

for (tries = 1, randomNumber = new Date % (2 * o) - o; guess - randomNumber; tries++)
  guess = +prompt(),
  alert(guess >= limit | guess < -limit ? "BAD" : guess < randomNumber ? "TOO LOW" : guess > randomNumber ? "TOO HIGH" : "Congrats! You found the number in " + tries + " turns!")

Ve son olarak bazı talimatları başka yerlere taşıyalım, uzun üçlü zinciri ifs ve elses ile değiştirelim, dizeleri birleştirerek ve okunabilirliği artırmak için matematiği basitleştirelim:

guess = 32768;
alert("WhileURong(USayNumbr;ISayBigrOrSmalr)");

randomNumber = new Date % 65536 - 32768;

for (tries = 1; guess - randomNumber; tries++) {
  guess = +prompt(); // The preceding + is a golfing trick to convert string to number.
  if (guess > 32767 | guess < -32768) {
    alert("BAD");
  } else if (guess < randomNumber) {
    alert("TOO LOW");
  } else if (guess > randomNumber) {
    alert("TOO HIGH");
  } else {
    alert("Congrats! You found the number in " + tries + " turns!");
  }
}

Örneklem:

ALERT:  WhileURong(USayNumbr;ISayBigrOrSmalr)
PROMPT: 5
ALERT:  TOO LOW
PROMPT: 20000
ALERT:  TOO LOW
PROMPT: 30000
ALERT:  TOO HIGH
PROMPT: 25000
ALERT:  TOO HIGH
PROMPT: 22500
ALERT:  TOO HIGH
PROMPT: 21000
ALERT:  TOO HIGH
PROMPT: 20500
ALERT:  TOO HIGH
PROMPT: 20200
ALERT:  TOO LOW
PROMPT: 20400
ALERT:  TOO LOW
PROMPT: 20450
ALERT:  TOO LOW
PROMPT: 20475
ALERT:  TOO HIGH
PROMPT: 20460
ALERT:  TOO LOW
PROMPT: 20468
ALERT:  TOO HIGH
PROMPT: 20464
ALERT:  TOO LOW
PROMPT: 20466
ALERT:  TOO LOW
PROMPT: 20467
ALERT:  Congrats! You found the number in 16 turns!"

1
Gerçekten beğendim :)
Wolle Vanillebär Lutz

Lütfen kodunuzun örnek çıktısını gösterin.
Mukul Kumar

@MukulKumar. Tamamlandı, çıktı eklendi
Victor Stafusa

7

C - 272 karakter - 300 - 50-25 = -103

  • Kuralları görüntülemek için -300;
  • Oyuncuya dönüş sayısını söylemek için -50;
  • -25 standart RNG kitaplığı kullanmadığı için.

Golf kodu:

main(i){short a,c=i=0,b=time(0);for(a=b;b--;a=(a*233)+4594);b=a;puts("WhileURong(USayNumbr;ISayBigrOrSmalr)");while(1){i++;scanf("%hi",&a);if(a==b){printf("Congrats! You found the number in %i turns!",i);break;}for(c=0;c^9;c++)putchar(c[a<b?"kff7cfn7!":"kff7_`^_!"]-23);}}

Ungolfed:

int main(int i) {
    short a,
          b = time(0),
          c = i = 0;

    for( a = b ; b-- ; a = (a * 233) + 4594);
    b = a;

    puts("WhileURong(USayNumbr;ISayBigrOrSmalr)");

    while(1) {
        i++;
        scanf("%hi", &a);
        if(a == b) {
            printf("Congrats! You found the number in %i turns!", i);
            break;
        }
        for( c = 0 ; c ^ 9 ; c++ )
            putchar(c[ a < b ? "kff7cfn7!" : "kff7_`^_!" ] - 23);
    }
}

Çıktı:

Çıktı


Çıktı nerede?
Mukul Kumar

@IlmariKaronen, EDIT2. Ayrıca, sadece çağı kabul etmiyorum.
Oberon

@Oberon lütfen çıktıyı da gönderin
Mukul Kumar

@MukulKumar, yayınladı.
Oberon

5

C: 237-300-50-25-25-10: -173 puan

Kurallar için -300, tahmin sayısını göstermek için -50, yerleşik rasgele sayı üreteci kullanmamak için -25, aralık dışı mesaj için -25 ve tebrikler mesajını renklendirmek için -10.

int s[3]={542068564},g,n;main(r){for(r=(short)&r,puts("WhileURong(USayNumbr;ISayBigrOrSmalr)");n++,scanf("%d",&g),s[1]=g<r?5721932:1212631368,g^r;puts(g^(short)g?"OOR":s));printf("\033[31mCongrats! You found the number in %d turns!",n);}

Ungolfed:

int s[3]={542068564},g,n;

main(r){
        for(
                r=(short)&r,
                puts("WhileURong(USayNumbr;ISayBigrOrSmalr)");

                n++,
                scanf("%d",&g),
                s[1]=g<r?5721932:1212631368,
                g^r;

                puts(g^(short)g?"OOR":s)
        );

        printf("\033[31mCongrats! You found the number in %d turns!",n);
}

Örnek çalışma:

WhileURong(USayNumbr;ISayBigrOrSmalr)
-32769
OOR
32768
OOR
0
TOO HIGH
-16384
TOO HIGH
-24576
TOO HIGH
-28672
TOO LOW
-26624
TOO LOW
-25600
TOO HIGH
-26112
TOO LOW
-25856
TOO LOW
-25728
TOO LOW
-25664
TOO HIGH
-25696
TOO HIGH
-25712
TOO LOW
-25704
Congrats! You found the number in 15 turns!

Son satır kırmızı olarak görünür.


Bravo! Tüm lütufları vuracaksın !!!
Mukul Kumar

4

bash, -137

Gol

273 (bayt) - 300 (kurallar) - 50 (sayım denemesi) - 25 (OOF uyarısı) - 25 (özel PRNG) - 10 (renkli)

Golf versiyonu

IFS=# a=(`<$0`)
c=65536
y=$[10#`date +%N`%c]
e(){ echo -e ${a[$1]/z/$z};}
e 7
while read x
do((z++,x+=c/2,i=3+(x>y),x==y))&&break
((x<0||x>c-1))&&i=6
e $i
done
e 5
#TOO LOW#TOO HIGH#\e[32mCongrats! You found the number in z turns!#OOR#Guess my number. I'll say HIGH or LOW.

Son satırın bir yorum olduğunu ve bu nedenle dize veya karakter değişmezi içermediğini unutmayın.

Ungolfed sürümü

MYNUMBER=$[10#$(date +%N) % 65536 - 32768]
echo "Guess my number. I'll say HIGH or LOW."

while true; do
    read YOURGUESS
    GUESSES=$((GUESSES + 1))

    if ((YOURGUESS == MYNUMBER)); then
        break
    elif ((YOURGUESS < -32768 || YOURGUESS > 32767)); then
        echo OOR
    elif ((YOURGUESS < MYNUMBER)); then
        echo "TOO LOW"
    else
        echo "TOO HIGH"
    fi
done

echo -e "\e[32mYou found the number in $GUESSES turns!"

Örnek çıktı

$ ./tlth
Guess my number. I'll say HIGH or LOW.
-32769
OOR
32768
OOR
0
TOO LOW
16384
TOO HIGH
8192
TOO HIGH
4096
TOO HIGH
2048
TOO HIGH
1024
TOO HIGH
512
TOO HIGH
256
TOO HIGH
128
TOO HIGH
64
TOO HIGH
32
TOO LOW
48
TOO HIGH
40
TOO LOW
44
TOO HIGH
42
Congrats! You found the number in 17 turns!

Son satır yeşil renkte yazdırılır.


3

C #: -30 puan

  • 345 bayt
  • -300 kuralları göstermek için
  • Kullanıcı kazandığında dönüşleri göstermek için -50
  • -25, aralığın dışında bir sayı girdiğinde kullanıcıya bildirdiği için

Golfçü :

int l=-32768,h=32767,n=new Random().Next(l,h),t=0,g=h+1;Console.Write("WhileURong(USayNumbr;ISayBigrOrSmalr)\n");while(n!=g){g=Convert.ToInt32(Console.ReadLine());Console.WriteLine(g==n?"C\x6fn\x67ra\x74s! Y\x6fu f\x6fund \x74\x68\x65 number in {0} \x74urns!":g<l||g>h?"BAD":g<n?"\x54\x4f\x4f \x4c\x4f\x57":"\x54\x4f\x4f \x48\x49\x47\x48",++t);}

Çalıştırmak için, (code.cs) bir dosyaya koydu ve çalıştırmak scriptcs komut satırında: scriptcs code.cs.

Ungolfed : Değişken adlarını anlaşılması daha kolay bir şeye genişletti ve onaltılık harfleri gerçek harflere dönüştürdü.

int low = -32768, 
    high = 32767, 
    number = new Random().Next(low, high), 
    turns = 0, 
    guess = h+1;
Console.Write("WhileURong(USayNumbr;ISayBigrOrSmalr)\n");  // instructions
while (number != guess)
{
    guess = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine(
      guess == number                                     // if you got it right 
        ? "Congrats! You found the number in {0} turns!"  // give the victory speech
        : guess < low || guess > high                     // if out of range
          ? "BAD"                                         // let them know
          : guess < number                                // if guess is low
            ? "TOO LOW"                                   // tell them low
            : "TOO HIGH"                                  // otherwise tell them high
      , ++turns                                           // preincrement turns, add to output
    );
}

Örnek çıktı burada bulunabilir .


3
Maalesef durumlarını anlatıyorsun, ama kural için bu " karakterlerini kullanmayın T, O, L, W, H, Ive Gdize veya karakter değişmezlerinde (ne küçük ne de büyük harf). "
Victor Stafusa

Dolayısıyla, sadece değiştirmek T, O, L... ile \x54, \x4F, \x4C... ve sen iyi.
tembellik

Teşekkürler. Ben sadece golfed sürümünde dize değişmezleri uygulanabilir karakterleri için onaltılık kodlamalar koymak ve puanlama buna göre değiştirdi.
Yaakov Ellis

Lütfen kodunuzun örnek çıktısını gösterin.
Mukul Kumar

@MukulKumar çıktı için buraya bakın . Ayrıca mantık üzerinde birkaç küçük değişiklik yaptım, bir sorunu düzelttim.
Yaakov Ellis

2

C ++ 505 + (-300-50-25-25) = 105

-300: Talimatlar
-50: Tur sayısını gösterme
-25: Rasgele işlev kullanmama
-25: Kullanıcı aralığın dışında girdi hakkında uyarı

golfed

#include<iostream>
#include<stdlib.h>
using namespace std;int main(){short int a,i=0,*r=new short int;int b=0;a=*r;char t[]={84,79,79,' ','\0'},l[]={76,79,87,'\n','\0'},h[]={72,73,71,72,'\n','\0'};cout<<"WhileURong(USayNumbr;ISayBigrOrSmalr)\n";while(a!=b){cin>>b;if(b<-32768||b>32767){cout<<"Sorry! the number is out of range please enter the number again\n";continue;}i++;if(b<a){cout<<'\n'<<t<<l;}if(b>a){cout<<'\n'<<t<<h;}if(a==b){cout<<"Congrats!You found the number in "<<i<<" turns!";}}return 0;}  

UNGOLFED

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    short int a,i=0,*r=new short int;
    int b=0;
    a=*r;
    char t[]={84,79,79,' ','\0'},l[]={76,79,87,'\n','\0'},h[]={72,73,71,72,'\n','\0'};
    cout<<"WhileURong(USayNumbr;ISayBigrOrSmalr)\n";
    while(a!=b)
    {
        cin>>b;
        if(b<-32768||b>32767)
        {
            cout<<"Sorry! the number is out of range please enter the number again\n";
            continue;
        }
        i++;
        if(b<a)
        {
            cout<<'\n'<<t<<l;
        }
        if(b>a)
        {
        cout<<'\n'<<t<<h;
        }
    if( a==b)
    {   

            cout<<"Congrats!You found the number in "<<i<<" turns!";
        }
    }
    return 0;
}  

ÇIKTI


Şahsen kendimi durduramadım .. :)
Mukul Kumar

2

C, 183-300-25 = -142

183 bayt -300 kurallar için -25 rasgele kitaplık kullanmama

main(){short g,n=time(0)*(time(0)&1?1:-1);puts("WhileURong(USayNumbr;ISayBigrOrSmalr)");while(g^n)scanf("%d",&g),puts(g>n?"TOO HIGH":g<n?"TOO LOW":"Congrats! You found the number!");}

ungolfed sürümü:

main(){
    short g,n=time(0)*(time(0)&1?:-1);
    puts("WhileURong(USayNumbr;ISayBigrOrSmalr)");
    while(g^n)
        scanf("%d",&g),
        puts(g>n?"TOO HIGH":g<n?"TOO LOW":"Congrats! You found the number!");
}

örnek çalışma:

WhileURong(USayNumbr;ISayBigrOrSmalr)
40
TOO HIGH
20
TOO HIGH
1
TOO HIGH
0
TOO HIGH
-20
TOO HIGH
-200
TOO HIGH
-2000
TOO HIGH
-20000
TOO LOW
-10000
TOO LOW
-5000
TOO LOW
-3000
TOO HIGH
-4000
TOO LOW
-3500
TOO HIGH
-3700
TOO HIGH
-3900
TOO HIGH
-3950
TOO HIGH
-3970
TOO LOW
-3960
Congrats! You found the number!

"TOO HIGH"ve "TOO LOW"her ikisi de geçersiz karakterler içeriyor TOLWHIGtolwhig.
Oberon

"Tebrikler! Numarayı buldun!" ve "WhileURong (USayNumbr; ISayBigrOrSmalr)".
Fors

@Fors ancak bunlara izin verilir (bakınız EDIT2 ).
Oberon

Gerçekten de öyle! Nedense bu düzenlemeyi kaçırdım.
Fors

@Oberon EDIT 2TOO LOW tarafından da izin veriliyor mu?
Diş fırçası

2

J - 190 karakter -300-50 = -160 puan

'Congrats, you found the number in ',' turns!',~":1>:@]^:(]`(1[2:1!:2~a.{~71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>)@.*@-[:".1!:1@1:)^:_~32767-?2^16['WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2

Açıklama (J'nin sağdan sola okunduğunu hatırlayın):

  • 'WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2 - Kuralları yazdırın.
  • 32767-?2^16[- Dönüş değerini atın ve ardından 0 ile 2 ^ 16-1 arasında rastgele bir sayı oluşturun. Ardından, 32767'den çıkararak -32768..32767 aralığına ayarlayın.
  • 1>:@]^:(...)^:_~- x u^:v^:_ yDesen bir süre döngüsü gibidir. xsabit kalır ve yher çalıştırıldığında mutasyona uğrar u. Bu x v y, 0 x u ydeğerini döndürene veya hiçbir değişikliğe neden olana kadar devam eder y. ~Takasları iki argüman, böylece xrasgele sayı olacak ve y1. Our başlayacak uolan >:@]bir sayaç ve görevi görür, böylece bu 1 ve getiri bunu artırır,x u y meydana asla sonlandırma koşulu.
  • [:".1!:1@1:- Sayacı alın ve onun yerine 1 sayısını kullanarak değerini dikkate almayın ( 1:). 1!:1Klavyeden bir giriş satırı ( ) okuyun (dosya tanıtıcısı 1) ve yürütün ( ".). Bu, negatif işareti normalde olan J'nin _formdaki sayıları almasına izin verir -n(sayıya uygulanan olumsuzlama olarak değerlendirilir n).
  • ]`(...)@.*@-- Rastgele sayının öncesinden ve tahmininden ( -) farkını alın . Şimdi, bu farkın sıfır ( @.*) olmasına bağlı olarak bir sonraki eylemi seçiyoruz . Öyleyse ]`, sonuç olarak 0 değerini ( ) x v ydöndürün, böylece yürütme sona erer ve while döngüsünün tamamı sayacı döndürür. Başka...
  • 71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>- 5 8 16Sayı negatifse ve 1 2 0 1pozitifse diziyi döndürün. Sonra 13 8 8 _39her şeyi 71 ekleyin ve ekleyin, ya ya 84 79 79 32 76 79 87ya 84 79 79 32 72 73 71 72.
  • 1[2:1!:2~a.{~- Alfabeyi a.onlarla dizine ekleyerek bu sayıları ASCII karakterlerine çevirin . Sonra bunları 1!:2(dosya tanıtıcısı 2'yi kullanarak) ile yazdırın ve sonuç olarak 1'e dönün x v y.
  • 'Congrats, you found the number in ',' turns!',~":- Döngü bittiğinde sayacı döndürür. İle bir dizeye dönüştürün ":ve dizeleri 'Congrats, you found the number in 'ile arasına koyun ' turns!'.

Örnek çıktı:

   'Congrats, you found the number in ',' turns!',~":1>:@]^:(]`(1[2:1!:2~a.{~71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>)@.*@-[:".1!:1@1:)^:_~32767-?2^16['WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2
WhileURong(USayNumbr;ISayBigrOrSmalr)
0
TOO HIGH
-20000
TOO LOW
-10000
TOO LOW
-5000
TOO HIGH
-7500
TOO HIGH
-8750
TOO HIGH
-9000
TOO HIGH
-9500
TOO LOW
-9250
TOO HIGH
-9375
TOO HIGH
-9450
TOO LOW
-9400
TOO HIGH
-9425
TOO HIGH
-9437
TOO LOW
-9431
TOO LOW
-9428
TOO HIGH
-9430
TOO LOW
-9429
Congrats, you found the number in 18 turns!

2

JavaScript -40

335 - 300 (kurallar) - 50 (sayım dönüşleri) - 25 (aralık dışında)

Kazanmayacak ama bence harfleri almanın eğlenceli bir yolu.

golfed

!function T(O,L,W,H,I,G){a=T.toString();c=L.floor(65536*L.random())+H;O(W+G+" between "+H+" & "+I);k=(f=a[9]+(d=a[11])+d+" ")+(e=a[17])+a[19]+a[21]+e;l=f+a[13]+d+a[15];for(m=1;(n=prompt(W+G))!=c;m++)n<H||n>I?O("Out of range"):n>c?O(l):O(k);O("Congrats! You found the"+G+" in "+m+" turns!")}(alert,Math,"Guess a",-32768,32767," number")

Ungolfed

!function T(O,L,W,H,I,G){
    fn = T.toString();
    random = L.floor(L.random() * 65536) + H;

    O(W + G + " between " + H + " & " + I);

    tooLow = (too = fn[9] + (o = fn[11]) + o + " ") + (h = fn[17]) + fn[19] + fn[21] + h;
    tooHigh = too + fn[13] + o + fn[15];

    for (n=1; (guess = prompt(W + G)) != random; n++) {
        if (guess < H || guess > I) {
            O("Out of range");  
        } else if (guess > random) {
            O(tooHigh);
        } else {
            O(tooLow);  
        }
    }

    O("Congrats! You found the" + G + " in " + n + " turns!");
}(alert, Math, "Guess a", -32768, 32767, " number")

Örnek çıktı

(ALERT) Guess a number between -32768 & 32767
(PROMPT) Guess a number
9999999
(ALERT) Out of range
(PROMPT) Guess a number
0
(ALERT) TOO LOW
(PROMPT) Guess a number
8008
(ALERT) Congrats! You found the number in 3 turns!

1

APL (Dyalog) (157-300-50 = -193)

(Evet, bunlar bayt olarak sayılır, APL karakter seti bir bayta sığar.)

"Oyun kurallarını göster" ve "dönüş sayısını say" ı iddia ettim.

G
n←32768-?65536
t←0
⎕←'Guess 16-bit signed number'
t+←1
→8/⍨n=g←⎕
⎕←⎕AV[(⌽⎕AV)⍳'×↑↑ ','○↑-' '∇⌊∘∇'⊃⍨1+n<g]
→4
⎕←'Congrats! You found the number in't'tries!'

Örnek çalışma:

      G
Guess 16-bit signed number
⎕:
      0
TOO HIGH
⎕:
      -10000
TOO LOW
⎕:
      -5000
TOO LOW
⎕:
      -2500
TOO LOW
⎕:
      -1250
TOO HIGH
⎕:
      -1750
TOO LOW
⎕:
      -1500
TOO LOW
⎕:
      -1375
TOO LOW
⎕:
      -1300
TOO LOW
⎕:
      -1275
TOO LOW
⎕:
      -1265
TOO HIGH
⎕:
      -1270
TOO HIGH
⎕:
      -1273
 Congrats! You found the number in  13  tries!

Ungolfed:

GuessNumber;num;tries;guess;decode;too;low;high
decode←{⎕AV[(⌽⎕AV)⍳⍵]} ⍝ invert the character code, char 1 becomes char 255 etc.
num←32768-?65536 ⍝ select a random number
tries←0

⍝ strings for low/high
too←decode '×↑↑ '
low←decode '○↑-'
high←decode '∇⌊∘∇'

⎕←'Guess 16-bit signed number'

try:
  tries +← 1
  guess ← ⎕
  →(guess=num)/found
  ⍝ still here: number was wrong
  ⎕←too, (1+num<guess)⊃low high  ⍝ output appropriate word
  →try ⍝ try again
found:
  ⎕←'Congrats! You found the number in' tries 'tries!'

1

Pogo: -95 (255-300-50)

method main:void
    print("Guess the number. You will be told if you are high or low.")
    declare(integer,n,0)
    declare(integer,i,0)
    declare(integer,j,0)
    random() i
    while j != i
        set(n+1) n
        print("Number?")
        getinput() j
        if j > i
            print("High")
        end
        else
            print("Low")
        end
    end
    print("Yay" n "turns")
end main

Sayı 10 ise:

Numara?

5

Düşük

8

Düşük

12

Yüksek

10

Yay 4 tur


Karakter sayısı, tüm boşlukların kaldırıldığı koda dayanır.

Pogo'nun sahte bir dil olmadığını unutmayın. Onu oluşturdum ve bunun için bir derleyici ve IDE yazdım: https://github.com/nrubin29/Pogo


Benim Oku EDIT ve 2 - EDIT
Mukul Kumar

Düzenlemelere göre güncellendi.
nrubin29
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.