Kürzester Code für ein zu niedriges - zu hohes Spiel

20

Sie müssen ein Spiel zu niedrig machen --- zu hoch (TLTH) in kürzestem Code (in Bytes)

Spielregeln:

  1. Der Computer wählt eine Zufallszahl aus dem ganzzahligen Bereich (-32768..32767).
  2. Nun werden Sie sich eine Zahl überlegen und diese eingeben.
  3. Der Computer erkennt, ob Ihre Nummer niedriger ( TOO LOW) oder höher ( TOO HIGH) als die ausgewählte Nummer ist.
  4. Wenn Sie die Nummer erraten haben, sollte der Computer anzeigen Congrats! You found the number!.

Code-Regeln:

  1. Verwenden Sie die Zeichen nicht T, O, L, W, H, Iund G(weder Klein noch Großbuchstaben) in String oder Zeichenliterale.
    Zum Beispiel:

    tolower(T);  // Acceptable  
    cout<<"T";   // Unacceptable
    char ch='T'; // Unacceptable
    
  2. Entfernen Sie 300 Bytes, wenn Ihr Code die Spielregeln anzeigen kann, bevor Sie das Spiel starten.

  3. Entferne 50 Bytes, wenn dein Code die Anzahl der Runden zählen kann und die Anzahl der Runden am Ende des Spiels wie folgt anzeigt:

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

    Dabei ist n die Anzahl der durchgeführten Umdrehungen anstelle von

    "Congrats! You found the number!"  
    
  4. Entfernen Sie 25 Bytes aus Ihrer Punktzahl, wenn Ihr Code dem Benutzer mitteilen kann, dass die eingegebene Zahl außerhalb des ganzzahligen Bereichs liegt.
    Beispielsweise:

    Enter the number: 40000  
    Sorry! This number is out of range
    Please Enter the number again:  
    
  5. 25 Bytes entfernen Wenn Ihr Code die Zufallszahl nicht von einer eingebauten Zufallsfunktion übernimmt.

  6. 10 Bytes entfernen Wenn Ihr Code "Glückwunsch" in Farbe anzeigt (wählen Sie eine andere Farbe als die Standardfarbe Weiß).

Einreichungsregeln:

  1. Fügen Sie eine Überschrift mit Ihrem Sprachnamen hinzu und bewerten Sie alle Kopfgeldberechnungen und deren Erklärung.

  2. Veröffentlichen Sie Ihren Code mit und ohne Golf.

Gewinner

  1. Die Antwort mit den wenigsten Bytes gewinnt.
  2. Bei Stimmengleichheit gewinnt die Antwort mit den mehr Stimmen.
  3. Der Gewinner wird nach 5 Tagen ermittelt.

EDIT : Bitte zeigen Sie die Ausgabe Ihres Codes.
EDIT-2 : Sie können Regel-1 für Regeln-2,3 und 4 in Code Rules ignorieren

Viel Glück :]

Mukul Kumar
quelle
2
Ist dies eine gültige Erklärung der Spielregeln? WhileURong(USayNumbr;ISayBigrOrSmalr)
John Dvorak
1
Basierend auf Ihrer Beschreibung der Wertung haben Sie weder einen Codegolf- noch einen Beliebtheitswettbewerb. Es ist eine Code- Herausforderung (mit einem Popularitäts-Tiebreaker). Schauen Sie sich die Tag-Wikis an. Ich schlug eine Bearbeitung vor, um die Herausforderung entsprechend zu kennzeichnen. ps - Jinx! @mniip
Jonathan Van Matre
1
@JonathanVanMatre der Wortlaut klingt für mich wie Code-Golf , trotz des Unentschieden.
4.
21
Außerdem gefällt mir die Regel, anderen Spielern bei der Verbesserung ihrer Antwort zu helfen, nicht besonders. In den unsterblichen Worten von Andre dem Riesen in The Princess Bride: "Das ist nicht sehr sportlich".
Jonathan Van Matre
1
Diese Frage ist so. . . David H. Ahl
Michael Stern

Antworten:

2

JavaScript (-210 Punkte ( 190Bytes - 300 (für die Regeln) - 50 (für die Anzahl der Vermutungen) - 25 (für die Nichtverwendung einer eingebauten Zufallszahlenquelle) - 25 (um Ihnen mitzuteilen, ob die Eingabe außerhalb des Bereichs eines Vorzeichens liegt 16-bit Ganzzahl) ):

Golf gespielt:

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

Vollständiger Code (gut formatiert):

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

Ausgabe:

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)
Zahnbürste
quelle
@IlmariKaronen Entschuldigung, ich habe einen Fehler gemacht. Ich habe meine Antwort aktualisiert.
Zahnbürste
Danke, jetzt läuft es ... aber es scheint zu brechen, wenn ich denke 0. :-( Sollte in TOO LOW/ TOO HIGH? Auch kein Leerzeichen sein ?
Ilmari Karonen
19

Perl 5.10+: 159 144 Bytes - 350 = -206 Punkte

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

Bearbeiten 2: Mit der letzten Regeländerung, die es mir ermöglicht, ein beliebiges Zeichenfolgenliteral für die "Glückwunsch" -Nachricht zu verwenden, kann ich 15 Bytes von meiner ursprünglichen 159-Byte-Lösung einsparen. Der obige neue Code ist im Vergleich zum alten Code nicht besonders neuartig oder interessant (ich habe gerade die pFunktion entfernt und rufe saystattdessen direkt auf). Der Rest dieses Beitrags beschreibt daher den unten gezeigten Originalcode:

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

Ja, ich missbrauche die Hölle aus Regel 1. Wer braucht Saiten, wenn Sie Barewörter haben können ? ;-)

Führen Sie mit aus perl -M5.010, um die Perl 5.10+ say-Funktion zu aktivieren (oder ersetzen Sie den pFunktionskörper print join$",@_,$/gegen einen Aufpreis von 5 Byte).

Bonuspunkte:

  • −300 Punkte: "Spielregeln vor Spielbeginn anzeigen"
  • −50 Punkte: "Anzahl der Runden am Ende des Spiels anzeigen"

Der Code enthält streng genommen keine String-Literale. Ich würde also sagen, dass Regel 1 technisch gesehen nicht verletzt wird. Der Trick ist, dass in Perl use strictjeder Bezeichner, der keinem bekannten Sprachschlüsselwort oder Unterprogramm entspricht, einfach zu seinem eigenen Namen ausgewertet wird. Die Funktion nimmt pdann einfach eine Liste von Wörtern und druckt sie durch Leerzeichen getrennt aus.

Beispiel für ein Durchspielen:

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!

Bearbeiten: Oh, richtig, die Regeln besagen, dass ich auch eine nicht-Golf-Version des Codes posten muss, also geht es los. Technisch gesehen ist es "de-golfed", da ich meine Code-Golfprogramme in der Regel von Anfang an in mehr oder weniger vollständiger Form zusammenstelle. Manchmal kann es schwierig sein, alle "golfy" -Optimierungen zu entfernen, ohne dabei grundlegend zu ändern, wie einige Teile der Software funktionieren Programm arbeiten. Trotzdem habe ich zumindest versucht, Leerzeichen, Kommentare und aussagekräftigere Funktions- / Variablennamen hinzuzufügen:

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. Als Alternative, wenn Sie nur Barewords anstelle von Strings verwenden, ist dies eine 182-Byte-Lösung, bei der die Buchstaben nicht TOLWHIG einmal in Barewords verwendet werden (sondern in einem Transliterationsoperator). Es erhält immer noch die gleichen Boni für eine Gesamtpunktzahl von 182 - 350 = −168 Punkte :

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

Die Ausgabe sieht genauso aus wie oben. Gemäß den (Original-) Regeln verwende ich die Buchstaben tund idrucke die Regeln, da dies erlaubt ist. Das Eliminieren dieser Verwendungen würde jedoch nur zwei zusätzliche Bytes kosten. Wenn ich dagegen die gesamte Ausgabe in Großbuchstaben schreibe (was nach den obigen Kommentaren zulässig zu sein scheint), kann ich drei Bytes einsparen.

Ilmari Karonen
quelle
Das ist eine schöne und kluge Antwort! +1 von mir
Mukul Kumar
Jetzt, da ich das sehe, frage ich mich, ob es mit Ruby 1.8 besser werden könnte, wenn Sie die Strafe dafür in Kauf nehmen def method_missing *args;args.join' ';end.
Kaya
Ich habe dich mit gutem alten JavaScript besiegt!
Zahnbürste
14

Python 2: -80 Punkte (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

Die Punktzahl beträgt 270 Zeichen, minus 300 für das Anzeigen der Anweisungen, minus 50 für das Anzeigen der Anzahl der Vermutungen in den "Glückwünschen!" Zeichenfolge für insgesamt negative 80 Punkte.

Ungolfed-Version des Loops mit ungeschliffenen Saiten:

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

Die integrierte cmpFunktion gibt 0 zurück, wenn die Werte gleich sind, -1, wenn der erste kleiner und 1, wenn der erste größer ist. Ich benutze den Wert, um ein Tupel von Strings zu indizieren und dann wieder als Ausgangsbedingung der Schleife. Die Indizierung einer Sequenz mit einem negativen Index (wie -1) beginnt am Ende der Sequenz und nicht am Anfang.

Ich war sehr versucht, die Importe zu überspringen und nur 4meine Zufallszahl gemäß XKCD 221 zu verwenden (würde sich das für den Bonus von -25 Zeichen qualifizieren?).

Beispiellauf (komplett mit einem Fehler, bei dem ich keine negativen Berechnungen durchführen kann):

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
quelle
Bitte zeigen Sie die Beispielausgabe Ihres Codes.
Mukul Kumar
2
Ist das nicht ein Verstoß gegen Regel 1? WhileURong (USayNumbr; ISayBigrOrSmalr) enthält ein oder mehrere Os, Ls, Ws, Hs, Is und Gs.
Fors
@ Cruncher: Ich bin nicht sicher, was Sie meinen, da das Programm beendet wird. Nachdem Sie den Wert richtig eingestellt haben, gist er Null und die whileSchleife endet.
Blckknght
@Blckknght oops, schnell gelesen
Cruncher
@ForsYou can ignore Rule-1 for Rules-2,3 & 4 in Code Rules
Cruncher
13

JavaScript 293, -300 (Regeln) - 50 (Abbiegeanzeige) - 25 (Bereichswarnung) - 25 (keine Zufallsfunktion) = -107 (neue Punktzahl)

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

Ich würde behaupten, dass nach RGB-Konventionen Schwarz eine Farbe ist, aber das wäre ein bisschen Betrug ...

Oh, und darf ich hinzufügen, auch keine Regel # 1 zu brechen!

Ausgabe in einer Reihe von Warnungen und Eingabeaufforderungen

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!

Ungolfed-Code:

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
quelle
Hast du die Regeln sorgfältig gelesen? Nun, Sie müssen ungolfed Code mit einem Ausgang posten
Mukul Kumar
@ MukulKumar sortiert ...
WallyWest
Sie können mit 4 durch das Vorsetzen Ihre Antwort speichern A=alert;und alle die Ersetzung alertmit A. Und noch eine, wenn Sie den Alarm A(0>(x...nach dem Semikolon verschieben prompt())!=r;)n++1.
DocMax
Sie können ändern, feedback if too high/lowdie derzeit 84 Zeichen verwendet i give feedback(was nur \151 \147\151ve feedback24 Zeichen erfordern würde , um 60 Zeichen zu speichern .
CorsiKa
1
Ich kann mich irren, aber ich denke, Sie können n++die for-Schleife in die for-Schleife verschieben x=prompt(n++), um zu sparen, was Sie + ++n+in der letzten Warnung tun müssen . Es würde 3 sparen.
DocMax
7

Javascript, 324 Bytes, Score -76

[Aufgrund von Regeländerungen aktualisiert]

  • 324 Bytes
  • -300 zum Anzeigen der Regeln
  • -50 für die Anzeige der Spielzüge, wenn der Benutzer gewinnt
  • -25, um dem Benutzer mitzuteilen, wenn er eine Zahl außerhalb des Bereichs eingibt
  • -25 für die Nichtverwendung von eingebautem Zufall (aktualisiert)

Gesamtpunktzahl: -76

Golf gespielt:

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

Lass uns dieses Chaos ungolf machen.

Erstens, richtig identifiziert (aber das ist mit verschleiertem Code immer noch nicht sehr gut):

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

Zweitens Umbenennen von Bezeichnern:

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

Die Funktion zum Entschlüsseln ruft alle Zeichen zwischen ASCII 33 ( !) und ASCII 58 ( :) ab und addiert 32, wobei sie in Zeichen im Bereich konvertiert werden A-Z.

Lässt den Code durch Entschlüsseln aller Zeichenfolgen weiter entschlüsseln:

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

Und schließlich können Sie einige Anweisungen an andere Stellen verschieben, die lange ternäre Kette durch ifs und elses ersetzen, verkettete Zeichenfolgen verbinden und die Mathematik vereinfachen, um die Lesbarkeit zu verbessern:

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

Probe:

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
quelle
1
Ich mag es wirklich :)
Wolle Vanillebär Lutz
Bitte zeigen Sie die Beispielausgabe Ihres Codes.
Mukul Kumar
@ MukulKumar. Fertig, Ausgabe hinzugefügt
Victor Stafusa
7

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

  • -300 zum Anzeigen der Regeln;
  • -50, um dem Spieler die Anzahl der Züge mitzuteilen;
  • -25, wenn keine Standard-RNG-Bibliothek verwendet wird.

Golf Code:

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

Ausgabe:

Ausgabe

Oberon
quelle
Wo wird ausgegeben?
Mukul Kumar
@IlmariKaronen, EDIT2. Auch nehme ich nicht nur die Epoche.
Oberon
@Oberon bitte die Ausgabe auch posten
Mukul Kumar
@ MukulKumar, gebucht.
Oberon
5

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

-300 für die Regeln, -50 für die Anzeige der Anzahl der Vermutungen, -25 für die Nichtverwendung eines eingebauten Zufallszahlengenerators, -25 für die Außer-Reichweite-Nachricht und -10 für das Ausmalen der Glückwunsch-Nachricht.

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

Beispiellauf:

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!

Die letzte Zeile wird rot angezeigt.

Fors
quelle
Bravo! Du hast alle Kopfgelder getroffen !!!
Mukul Kumar
4

Bash, -137

Ergebnis

273 (Bytes) - 300 (Regeln) - 50 (Zählversuche) - 25 (OOF-Warnung) - 25 (benutzerdefiniertes PRNG) - 10 (Farbe)

Golf Version

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.

Beachten Sie, dass die letzte Zeile ein Kommentar ist und daher keine Zeichenfolgen- oder Zeichenliterale enthält.

Ungolfed-Version

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

Beispielausgabe

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

Die letzte Zeile wird grün gedruckt.

Dennis
quelle
3

C #: -30 Punkte

  • 345 Bytes
  • -300 zum Anzeigen der Regeln
  • -50 für die Anzeige der Spielzüge, wenn der Benutzer gewinnt
  • -25, um dem Benutzer mitzuteilen, wenn er eine Zahl außerhalb des Bereichs eingibt

Golf gespielt :

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

Um es auszuführen, setzen Sie es in einer Datei (code.cs) und mit laufen scriptcs auf der Kommandozeile: scriptcs code.cs.

Ungolfed : Variablennamen wurden zu leicht verständlichen Buchstaben erweitert und Hexadezimalbuchstaben in echte Buchstaben umgewandelt.

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

Beispielausgabe hier verfügbar .

Yaakov Ellis
quelle
3
Sorry für diese erzählen, aber die Regel besagt , dass „ Sie die Zeichen nicht verwenden T, O, L, W, H, Iund G(weder Klein noch Großbuchstaben) in String oder Zeichenliterale.
Victor Stafusa
Also einfach ersetzen T, O, L... mit \x54, \x4F, \x4C... und du bist in Ordnung.
Faultier
Vielen Dank. Ich habe gerade Hex-Codierungen für die zutreffenden Zeichen in String-Literalen in der Golf-Version eingegeben und die Wertung entsprechend geändert.
Yaakov Ellis
Bitte zeigen Sie die Beispielausgabe Ihres Codes.
Mukul Kumar
@ MukulKumar siehe hier für die Ausgabe. Ich habe auch nur ein paar kleine Änderungen an der Logik vorgenommen und ein Problem behoben.
Yaakov Ellis
2

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

-300: Anweisungen
-50: Anzahl der Umdrehungen
anzeigen -25: Keine Zufallsfunktion verwenden
-25: Benutzer wird vor Eingaben außerhalb des zulässigen Bereichs gewarnt

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

AUSGABE

Mukul Kumar
quelle
Persönlich konnte ich mich nicht aufhalten .. :)
Mukul Kumar
2

C 183-300-25 = -142

183 Bytes -300 für die Regeln -25 für die Nichtverwendung einer zufälligen Bibliothek

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 version:

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

Probelauf:

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
quelle
"TOO HIGH"und "TOO LOW"beide enthalten unzulässige Zeichen TOLWHIGtolwhig.
Oberon
Wie auch "Herzlichen Glückwunsch! Sie haben die Nummer gefunden!" und "WhileURong (USayNumbr; ISayBigrOrSmalr)".
Fors
@Für aber die sind erlaubt (siehe EDIT2 ).
Oberon
In der Tat sind sie! Aus irgendeinem Grund habe ich diese Bearbeitung verpasst.
Fors
@Oberon Also ist auch EDIT 2TOO LOW erlaubt ?
Zahnbürste
2

J - 190 Zeichen -300 -50 = -160 Punkte

'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

Erklärung (daran erinnern, dass J von rechts nach links gelesen wird):

  • 'WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2 - Drucken Sie die Regeln.
  • 32767-?2^16[- Werfen Sie den Rückgabewert und generieren Sie eine Zufallszahl zwischen 0 und einschließlich 2 ^ 16-1. Stellen Sie es dann auf den Bereich -32768..32767 ein, indem Sie es von 32767 subtrahieren.
  • 1>:@]^:(...)^:_~- Das x u^:v^:_ yMuster ähnelt einer while-Schleife. xbleibt konstant und ywird bei jeder Ausführung von mutiert u. Dies wird fortgesetzt, bis entweder x v y0 zurückgegeben wird oder x u ykeine Änderung an erfolgt y. Das ~vertauscht die beiden Argumente, so dass xdies die Zufallszahl ist und ybei 1 beginnt. Unser uIst >:@], das diese 1 inkrementiert und sie zurückgibt, fungiert also als Zähler und dasx u y Beendigungsbedingung niemals auftreten kann.
  • [:".1!:1@1:- Nehmen Sie den Zähler und ignorieren Sie seinen Wert, indem Sie stattdessen die Zahl 1 verwenden ( 1:). Lesen Sie eine Eingabezeile ( 1!:1) von der Tastatur ein (Dateizugriff 1) und führen Sie sie aus ( ".). Dadurch kann J, dessen negatives Vorzeichen normalerweise _ist, Zahlen in der Form annehmen -n(wird als auf die Zahl angewendete Negation ausgewertet)n ).
  • ]`(...)@.*@-- Nimm den Unterschied zwischen der Zufallszahl von vorher und der Vermutung ( -). Nun wählen wir die nächste Aktion aus, abhängig davon, ob diese Differenz Null ist ( @.*). Wenn dies der Fall ist, geben Sie ( ]`) 0 als Ergebnis für zurück x v y, sodass die Ausführung beendet wird und die gesamte while-Schleife den Zähler zurückgibt. Sonst...
  • 71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>- Geben Sie das Array zurück, 5 8 16wenn die Zahl negativ und 1 2 0 1positiv ist. Dann voranstellen 13 8 8 _39und 71 zu allem addieren, so dass wir entweder 84 79 79 32 76 79 87oder haben 84 79 79 32 72 73 71 72.
  • 1[2:1!:2~a.{~- Wandeln Sie diese Zahlen in ASCII-Zeichen um, indem Sie das Alphabet damit indizieren a.. Dann drucken Sie sie mit 1!:2(mit dem Dateizugriffspunkt 2) aus und geben 1 als Ergebnis von zurück x v y.
  • 'Congrats, you found the number in ',' turns!',~":- Wenn die Schleife beendet ist, wird der Zähler zurückgegeben. Konvertiere es in einen String mit ":und setze es zwischen die Strings 'Congrats, you found the number in 'und ' turns!'.

Beispielausgabe:

   '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!
algorithmshark
quelle
2

JavaScript -40

335 - 300 (Regeln) - 50 (Zählrunden) - 25 (außerhalb des Bereichs)

Ich werde nicht gewinnen, aber es macht Spaß, an die Buchstaben zu kommen, denke ich.

Golf gespielt

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

Beispielausgabe

(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
quelle
1

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

(Ja, diese zählen als Byte, der APL-Zeichensatz passt in ein Byte.)

Ich habe behauptet, "Spielregeln anzeigen" und "Anzahl der Runden zählen".

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

Beispiellauf:

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

Wenn die Zahl 10 ist:

Nummer?

5

Niedrig

8

Niedrig

12

Hoch

10

Yay 4 Umdrehungen


Die Zeichenanzahl basiert auf dem Code, bei dem alle Leerzeichen entfernt wurden.

Beachten Sie, dass Pogo keine gefälschte Sprache ist. Ich habe es erstellt und hier einen Compiler und eine IDE dafür geschrieben: https://github.com/nrubin29/Pogo

nrubin29
quelle
Lesen Sie meine EDIT und EDIT - 2
Mukul Kumar
Aktualisiert gemäß den Änderungen.
Nrubin29