Najkrótszy kod, aby utworzyć grę Too-low - Too-high

20

Musisz stworzyć grę Zbyt niska --- Zbyt wysoka (TLTH) w najkrótszym kodzie (w bajtach)

Zasady gry:

  1. Komputer wybierze liczbę losową spoza zakresu liczb całkowitych (-32768..32767).
  2. Teraz wymyślisz liczbę i wprowadzisz ją.
  3. Komputer powie, czy Twój numer jest niższy ( TOO LOW) lub wyższy ( TOO HIGH) niż wybrany numer.
  4. Po odgadnięciu numeru komputer powinien zostać wyświetlony Congrats! You found the number!.

Reguły kodu:

  1. Nie używaj znaków T, O, L, W, H, Ii G(ani małe ani wielkie) w ciąg znaków lub literałów.
    Na przykład:

    tolower(T);  // Acceptable  
    cout<<"T";   // Unacceptable
    char ch='T'; // Unacceptable
    
  2. Usuń 300 bajtów, jeśli Twój kod może wyświetlać reguły gry przed jej uruchomieniem.

  3. Usuń 50 bajtów, jeśli Twój kod może zliczyć liczbę tur i wyświetlić liczbę tur wykonanych na końcu gry w następujący sposób:

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

    gdzie n jest liczbą wykonanych zwojów zamiast

    "Congrats! You found the number!"  
    
  4. Usuń 25 bajtów z wyniku, jeśli kod może powiedzieć użytkownikowi, że wprowadzona liczba jest poza zakresem liczb całkowitych.
    Na przykład:

    Enter the number: 40000  
    Sorry! This number is out of range
    Please Enter the number again:  
    
  5. Usuń 25 bajtów, jeśli kod pobiera liczbę losową nie z żadnej wbudowanej funkcji losowej.

  6. Usuń 10 bajtów, jeśli kod wyświetla kolor „gratulacje” (wybierz dowolny kolor oprócz domyślnego białego).

Zasady przesyłania:

  1. Dodaj nagłówek ze swoim językowym imieniem i wynikiem wraz ze wszystkimi obliczeniami nagród i ich wyjaśnieniem.

  2. Opublikuj swój kod do gry w golfa i bez golfa.

Zwycięzca

  1. Odpowiedź z najmniej bajtami wygrywa.
  2. W przypadku remisu wygrywa odpowiedź z większą liczbą głosów.
  3. Zwycięzca zostanie wybrany po 5 dniach.

EDYCJA : Pokaż wyniki swojego kodu.
EDYCJA-2 : Możesz zignorować Regułę-1 dla Reguł-2,3 i 4 w Regułach Kodowych

Powodzenia :]

Mukul Kumar
źródło
2
czy to jest prawidłowe wyjaśnienie zasad gry? WhileURong(USayNumbr;ISayBigrOrSmalr)
John Dvorak
1
Na podstawie opisu punktacji nie masz ani golfa kodowego, ani konkursu popularności. Jest to wyzwanie kodowe (z rozstrzygającym popularnością). Sprawdź wiki wiki. Zaproponowałem edycję, aby odpowiednio oznaczyć wyzwanie. ps - Jinx! @mniip
Jonathan Van Matre
1
@JathanathanVanMatre dla mnie to brzmienie brzmi jak code-golf , pomimo remisu.
mniip
21
Nie podoba mi się również zasada, by nie pomagać innym graczom w poprawianiu ich odpowiedzi. W nieśmiertelnych słowach Andre the Giant w The Princess Bride „To nie jest bardzo sportowe”.
Jonathan Van Matre
1
To pytanie brzmi tak. . . David H. Ahl
Michael Stern

Odpowiedzi:

2

JavaScript (-210 punktów ( 190bajty - 300 (dla reguł) - - 50 (dla liczby odgadnięć) - 25 (za nieużywanie żadnego wbudowanego źródła liczb losowych) - 25 (za informację, czy dane wejściowe są poza zakresem podpisanego 16-bit liczba całkowita) ):

Gra w golfa:

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==')))

Pełny kod (ładnie sformatowany):

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;
    }
}

Wynik:

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)
Szczoteczka do zębów
źródło
@IlmariKaronen Przepraszamy, popełniłem błąd. Zaktualizowałem swoją odpowiedź.
Szczoteczka do zębów
Dzięki, teraz działa ... ale wydaje mi się, że się psuje, jeśli tak sądzę 0. :-( Ponadto, czy nie powinno być spacji w TOO LOW/ TOO HIGH?
Ilmari Karonen
19

Perl 5.10+: 159 144 bajtów - 350 = −206 punktów

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!"

Edycja 2: Wraz z ostatnią zmianą reguł, która pozwala mi używać dowolnego literału łańcuchowego dla komunikatu „gratulacje”, mogę zapisać 15 bajtów z mojego oryginalnego 159-bajtowego rozwiązania. Nie ma nic szczególnie nowego ani interesującego w powyższym nowym kodzie w porównaniu ze starym kodem (właśnie pozbyłem się pfunkcji i sayzamiast tego wywołałem bezpośrednio), więc pozostała część tego postu opisuje oryginalny kod, pokazany poniżej:

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."!"

Tak, nadużywam piekła poza regułą 1. Kto potrzebuje sznurków, kiedy możesz mieć słowa bez słów ? ;-)

Uruchom za pomocą, perl -M5.010aby włączyć funkcję Perl 5.10+ say(lub zastąp korpus pfunkcji print join$",@_,$/za dodatkową opłatą 5 bajtów).

Wyniki bonusowe:

  • −300 punktów: „wyświetl zasady gry przed rozpoczęciem gry”
  • −50 punktów: „wyświetl liczbę tur wykonanych na koniec gry”

Kod nie zawiera literałów łańcuchowych w ścisłym tego słowa znaczeniu, więc powiedziałbym, że zasada 1 nie jest technicznie naruszona. Sztuczka polega na tym, że w Perlu bez use strictidentyfikatora, który nie odpowiada słowu kluczowemu lub podprogramowi znanego języka, będzie można łatwo ocenić jego własną nazwę. Następnie funkcja ppo prostu pobiera listę słów i drukuje je, oddzielając je spacjami.

Przykładowy przebieg gry:

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!

Edycja: Och, racja, zasady mówią, że muszę również opublikować wersję kodu bez gry w golfa, więc proszę bardzo. Technicznie rzecz biorąc, jest to „gra w golfa”, ponieważ zwykle od początku komponuję swoje programy do gry w golfa w mniej lub bardziej w pełni golfowej formie, a czasem może być trudne usunięcie wszystkich optymalizacji gry w golfa bez zasadniczej zmiany tego, jak niektóre części program pracy. Mimo to przynajmniej próbowałem dodać spacje, komentarze i bardziej znaczące nazwy funkcji / zmiennych:

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. Alternatywnie, jeśli korzystanie ze słów kluczowych zamiast ciągów znaków jest dla ciebie zbyt trudne, oto 182-bajtowe rozwiązanie, które nie używa liter TOLWHIG nawet w słowach kluczowych (ale używa ich w operatorze transliteracji). Nadal dostaje te same bonusy, za łączny wynik 182 - 350 = −168 punktów :

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!"

Wyjście wygląda dokładnie tak samo jak powyżej. Zgodnie z (oryginalnymi) regułami używam liter ti idrukuję reguły, ponieważ jest to dozwolone; wyeliminowanie nawet tych zastosowań kosztowałoby tylko dwa dodatkowe bajty. I odwrotnie, utworzenie całej wielkiej litery wyjściowej (co wydaje się dozwolone na podstawie powyższych komentarzy) pozwoliłoby mi zaoszczędzić trzy bajty.

Ilmari Karonen
źródło
To miła i sprytna odpowiedź! +1 ode mnie
Mukul Kumar
Teraz, gdy to widzę, zastanawiam się, czy można go pokonać Ruby 1.8, jeśli weźmiesz karę def method_missing *args;args.join' ';end.
Kaya
Pokonałem cię starym, dobrym JavaScriptem!
Szczoteczka do zębów
14

Python 2: -80 punktów (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

Wynik to 270 znaków, minus 300 za pokazanie instrukcji, minus 50 za pokazanie liczby zgadnięć w „gratulacjach!” string, w sumie ujemne 80 punktów.

Wersja pętli bez golfa, z nieskalowanymi ciągami:

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

Wbudowana cmpfunkcja zwraca 0, jeśli wartości są równe, -1, jeśli pierwsza jest mniejsza, a 1, jeśli pierwsza jest większa. Używam tej wartości do indeksowania krotki ciągów, a następnie ponownie jako warunek wyjścia pętli. Indeksowanie sekwencji z indeksem ujemnym (jak -1) liczy się od końca sekwencji, a nie od początku.

Kusiło mnie, aby pominąć importowanie i po prostu użyć 4jako mojej losowej liczby, zgodnie z XKCD 221 (czy to kwalifikuje się do bonusu -25 znaków?).

Przykład uruchomienia (z błędem, w którym nie mogę wykonać obliczeń ujemnych):

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!
Blckknght
źródło
Pokaż przykładowe wyniki swojego kodu.
Mukul Kumar
2
Czy to nie jest zasada łamania kodu 1? ChociażURong (USayNumbr; ISayBigrOrSmalr) zawiera jeden lub więcej Os, Ls, Ws, Hs, Is i Gs.
Fors
@Cruncher: Nie jestem pewien, co masz na myśli, ponieważ program się kończy. Po uzyskaniu prawidłowej wartości gzero i whilepętla się kończy.
Blckknght
@Blckknght oops, szybki odczyt
Cruncher
@ForsYou can ignore Rule-1 for Rules-2,3 & 4 in Code Rules
Cruncher
13

JavaScript 293, -300 (reguły) - 50 (wyświetlanie zakrętów) - 25 (ostrzeżenie o zasięgu) - 25 (brak losowej funkcji) = -107 (nowy wynik)

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!")

Twierdziłbym, że zgodnie z konwencjami RGB czarny jest kolorem, ale to byłoby trochę oszustwo ...

Aha, i mogę dodać, bez łamania zasady nr 1!

Dane wyjściowe w serii alertów i podpowiedzi

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!

Nieskluczony 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
WallyWest
źródło
dokładnie przeczytałeś zasady? cóż, musisz opublikować nieoznakowany kod z jednym wyjściem
Mukul Kumar
@MukulKumar posortowane ...
WallyWest
Można zapisać 4 poprzedzając odpowiedź z A=alert;i zastępując wszystkie z alertz A. I jeszcze jedno, jeśli przesuniesz alert A(0>(x...po średniku prompt())!=r;)n++1.
DocMax
możesz zmienić, feedback if too high/lowktóry używa obecnie 84 znaków i give feedback(co wymagałoby tylko \151 \147\151ve feedback24 znaków do zapisania 60 znaków .
corsiKa
1
Mogę się mylić, ale myślę, że możesz przesunąć n++pętlę for do opcji, x=prompt(n++)aby zaoszczędzić czasu + ++n+na ostatnim ostrzeżeniu. Zaoszczędziłby 3.
DocMax
7

JavaScript, 324 bajty, wynik -76

[Zaktualizowano z powodu zmian reguł]

  • 324 bajty
  • -300 za pokazanie reguł
  • -50 za pokazanie tur, gdy użytkownik wygrywa
  • -25 za poinformowanie użytkownika, kiedy wprowadzi liczbę spoza zakresu
  • -25 za nieużywanie wbudowanego losowego (zaktualizowane)

Łączny wynik: -76

Gra w golfa:

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!")

Pozwala oderwać się od tego bałaganu.

Po pierwsze, poprawnie zidentyfikowane (ale nadal nie jest to zbyt dobre w przypadku zaciemnionego kodu):

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!")

Po drugie, zmiana nazw identyfikatorów:

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!")

Tak więc funkcja odblokowania pobiera wszystkie znaki między ASCII 33 ( !) a ASCII 58 ( :) i dodaje 32, konwertując je na znaki z zakresu A-Z.

Pozwala odblokować kod więcej, odszyfrowując wszystkie ciągi:

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!")

Na koniec przenieśmy niektóre instrukcje w inne miejsca, zamień długi łańcuch trójskładnikowy na ifs i else, połącz łańcuchy konkatenacyjne i uprość matematykę, aby zwiększyć czytelność:

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!");
  }
}

Próba:

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!"
Victor Stafusa
źródło
1
Naprawdę mi się podoba :)
Wolle Vanillebär Lutz
Pokaż przykładowe wyniki swojego kodu.
Mukul Kumar
@MukulKumar. Gotowe, dodano wynik
Victor Stafusa,
7

C - 272 znaków - 300-50 - 25 = -103

  • -300 za wyświetlanie reguł;
  • -50 za poinformowanie gracza o liczbie tur;
  • -25 za nieużywanie standardowej biblioteki RNG.

Kod do gry w golfa:

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);}}

Nie golfowany:

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);
    }
}

Wynik:

Wynik

Oberon
źródło
Gdzie jest wyjście?
Mukul Kumar
@IlmariKaronen, EDIT2. Nie tylko biorę epokę.
Oberon
@Oberon proszę również opublikować dane wyjściowe
Mukul Kumar
@MukulKumar, wysłane.
Oberon
5

C: 237 - 300 - 50 - 25 - 25 - 10: -173 punktów

-300 za reguły, -50 za pokazanie liczby zgadnięć, -25 za brak użycia wbudowanego generatora liczb losowych, -25 za komunikat o przekroczeniu zakresu i -10 za pokolorowanie komunikatu gratulacyjnego.

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);}

Nie golfowany:

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);
}

Przykładowy przebieg:

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!

Ostatnia linia pokazuje się na czerwono.

Fors
źródło
Brawo! Trafiłeś wszystkie nagrody !!!
Mukul Kumar
4

bash, -137

Wynik

273 (bajty) - 300 (reguły) - 50 (liczba prób) - 25 (ostrzeżenie OOF) - 25 (niestandardowe PRNG) - 10 (kolor)

Wersja golfowa

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.

Zauważ, że ostatni wiersz jest komentarzem, więc nie zawiera literałów ani znaków.

Wersja bez golfa

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!"

Próbka wyjściowa

$ ./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!

Ostatnia linia jest wydrukowana na zielono.

Dennis
źródło
3

C #: -30 punktów

  • 345 bajtów
  • -300 za pokazanie reguł
  • -50 za pokazanie tur, gdy użytkownik wygrywa
  • -25 za poinformowanie użytkownika, kiedy wprowadzi liczbę spoza zakresu

Gra w golfa :

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);}

Aby go uruchomić, umieścić go w pliku (code.cs) i uruchomić z scriptcs w linii poleceń: scriptcs code.cs.

Ungolfed : Rozszerzyłem nazwy zmiennych na coś łatwiejszego do zrozumienia i zamieniłem litery szesnastkowe na prawdziwe.

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
    );
}

Przykładowe dane wyjściowe dostępne tutaj .

Yaakov Ellis
źródło
3
Niestety za mówienie tego, ale zasada stwierdza, że „ nie wolno używać znaków T, O, L, W, H, Ii G(ani małymi literami ani litera) w ciąg znaków lub literałów.
Victor Stafusa
Więc po prostu wymienić T, O, L... z \x54, \x4F, \x4C... a ty jesteś w porządku.
lenistwo
Dzięki. Właśnie wstawiłem kodowanie szesnastkowe dla odpowiednich znaków w literałach łańcuchowych w wersji golfowej i odpowiednio zmodyfikowałem punktację.
Yaakov Ellis
Pokaż przykładowe wyniki swojego kodu.
Mukul Kumar
@MukulKumar patrz tutaj dla danych wyjściowych. Właśnie wprowadziłem kilka drobnych zmian w logice, naprawiłem problem.
Yaakov Ellis
2

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

-300: Instrukcje
-50: Pokazuje liczbę zwojów
-25: Nie używa losowej funkcji
-25: ostrzega użytkownika o wejściu poza zasięg

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;
}  

WYNIK

Mukul Kumar
źródło
Osobiście nie mogłem się powstrzymać .. :)
Mukul Kumar
2

C 183–300–25 = -142

183 bajtów -300 dla reguł -25 za nieużywanie losowej biblioteki

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!");}

wersja bez golfa:

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!");
}

przykładowy przebieg:

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!
izabera
źródło
"TOO HIGH"i "TOO LOW"oba zawierają niedozwolone znaki TOLWHIGtolwhig.
Oberon
Podobnie jak „Gratulacje! Znalazłeś numer!” i „WhileURong (USayNumbr; ISayBigrOrSmalr)”.
Fors
@Dla, ale są dozwolone (patrz EDIT2 ).
Oberon
Rzeczywiście są! Z jakiegoś powodu przegapiłem tę edycję.
Fors
@Oberon Tak jest TOO LOW dozwolone przez EDIT 2 ?
Szczoteczka do zębów
2

J - 190 char -300 -50 = -160 pkt

'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

Objaśnienie (pamiętaj, że J jest czytany od prawej do lewej):

  • 'WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2 - Wydrukuj zasady.
  • 32767-?2^16[- Podrzuć wartość zwracaną, a następnie wygeneruj losową liczbę od 0 do 2 ^ 16-1 włącznie. Następnie dostosuj go do zakresu -32768..32767, odejmując go od 32767.
  • 1>:@]^:(...)^:_~- x u^:v^:_ yWzór jest trochę jak pętla while. xpozostaje stały iy mutuje się przy każdym wykonaniu u. Trwa to, dopóki nie x v yzwróci 0 lub x u ynie spowoduje zmiany na y. W ~swapy dwóch argumentów, tak że xbędzie liczba losowa i yrozpocznie się 1. Nasze ujest >:@], co to przyrosty 1 i zwraca go, więc działa jako licznik i x u ystan wypowiedzenia nie może nastąpić.
  • [:".1!:1@1:- Weź licznik i zignoruj ​​jego wartość, używając zamiast tego cyfry 1 ( 1:). Wczytaj wiersz wprowadzania ( 1!:1) z klawiatury (uchwyt pliku 1) i uruchom go ( ".). Pozwala to J, którego znakiem ujemnym jest zwykle _, przyjmowanie liczb w postaci -n(ocenia się jako negację zastosowaną do liczby n).
  • ]`(...)@.*@-- Weź różnicę liczby losowej z poprzedniej i zgadnij ( -). Teraz wybieramy następną akcję w zależności od tego, czy ta różnica wynosi zero ( @.*). Jeśli tak, to zwróć ( ]`), że 0 jako wynik x v y, aby wykonanie zakończyło się, a cała pętla while zwróci licznik. Jeszcze...
  • 71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>- Zwróć tablicę, 5 8 16jeśli liczba jest ujemna, a 1 2 0 1jeśli jest dodatnia. Następnie prepend 13 8 8 _39i dodać 71 do wszystkiego, więc mamy albo 84 79 79 32 76 79 87albo 84 79 79 32 72 73 71 72.
  • 1[2:1!:2~a.{~- Zamień te cyfry na znaki ASCII, indeksując je alfabetem a.. Następnie wydrukuj je za pomocą 1!:2(używając uchwytu pliku 2) i zwróć 1 w wyniku x v y.
  • 'Congrats, you found the number in ',' turns!',~":- Po zakończeniu pętli zwraca licznik. Konwertuj go na ciąg za pomocą": i umieść między ciągami znaków 'Congrats, you found the number in 'i ' turns!'.

Przykładowe dane wyjściowe:

   '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!
algorytmshark
źródło
2

JavaScript -40

335 - 300 (zasady) - 50 (liczba zwojów) - 25 (poza zasięgiem)

Myślę, że nie wygra, ale fajny sposób na zdobycie listów.

Grał w golfa

!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")

Nie golfił

!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")

Próbka wyjściowa

(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!
enoshixi
źródło
1

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

(Tak, liczą się one jako bajty, zestaw znaków APL mieści się w bajcie).

Twierdziłem, że „wyświetl zasady gry” i „policz liczbę tur”.

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!'

Przykładowy przebieg:

      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!

Nie golfowany:

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!'
marinus
źródło
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

Jeśli liczba wynosi 10:

Numer?

5

Niska

8

Niska

12

Wysoki

10

Yay 4 tury


Liczba znaków jest oparta na kodzie, z którego usunięto wszystkie białe znaki.

Pamiętaj, że Pogo nie jest fałszywym językiem. Stworzyłem go i napisałem dla niego kompilator i IDE: https://github.com/nrubin29/Pogo

nrubin29
źródło
Przeczytaj moje EDYTOWANIE i EDYCJA - 2
Mukul Kumar
Zaktualizowano zgodnie z edycjami.
nrubin29