Código más corto para hacer un juego demasiado bajo - demasiado alto

20

Tienes que hacer un juego Demasiado bajo --- Demasiado alto (TLTH) en el código más corto (en bytes)

Reglas del juego:

  1. La computadora elegirá un número aleatorio fuera del rango entero (-32768..32767).
  2. Ahora pensará en un número y lo ingresará.
  3. La computadora le dirá si su número es menor ( TOO LOW) o mayor ( TOO HIGH) que el número elegido.
  4. Cuando adivina el número, la computadora debería mostrar Congrats! You found the number!.

Reglas de código:

  1. No utilice los caracteres T, O, L, W, H, Iy G(ni en minúsculas ni en mayúsculas) en caracteres o frases literales.
    Por ejemplo:

    tolower(T);  // Acceptable  
    cout<<"T";   // Unacceptable
    char ch='T'; // Unacceptable
    
  2. Elimine 300 bytes si su código puede mostrar las reglas del juego antes de comenzar el juego.

  3. Elimine 50 bytes si su código puede contar el número de turnos y mostrar el número de turnos tomados al final del juego de esta manera:

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

    donde n es el número de turnos realizados, en lugar de

    "Congrats! You found the number!"  
    
  4. Elimine 25 bytes de su puntaje si su código puede decirle al usuario que el número que ingresó está fuera del rango entero.
    Por ejemplo:

    Enter the number: 40000  
    Sorry! This number is out of range
    Please Enter the number again:  
    
  5. Elimine 25 bytes Si su código toma el número aleatorio no de ninguna función aleatoria incorporada.

  6. Elimine 10 bytes Si su código muestra "felicidades" en color (elija cualquier color excepto el blanco predeterminado).

Reglas de envío:

  1. Agregue un encabezado con su nombre de idioma y puntaje con todos los cálculos de recompensas y su explicación.

  2. Publique su código de golf y sin golf.

Ganador

  1. La respuesta con menos bytes gana.
  2. Si hay un empate, la respuesta con más votos gana.
  3. El ganador será elegido después de 5 días.

EDITAR : muestra la salida de tu código.
EDITAR-2 : puede ignorar la Regla-1 para las Reglas-2,3 y 4 en las Reglas de Código

La mejor de las suertes :]

Mukul Kumar
fuente
2
¿Es esta una explicación válida de las reglas del juego? WhileURong(USayNumbr;ISayBigrOrSmalr)
John Dvorak
1
Según su descripción de la puntuación, no tiene un código de golf ni un concurso de popularidad. Es un desafío de código (con un desempate de popularidad). Mira la etiqueta wikis. Propuse una edición para etiquetar el desafío adecuadamente. ps - Jinx! @mniip
Jonathan Van Matre
1
@JonathanVanMatre para mí, la redacción suena como un código de golf , a pesar del desempate.
mniip
21
Además, no me gusta particularmente la regla contra ayudar a otros jugadores a mejorar su respuesta. En las palabras inmortales de Andre the Giant en The Princess Bride, "Eso no es muy deportivo".
Jonathan Van Matre
1
Esta pregunta es así. . . David H. Ahl
Michael Stern

Respuestas:

2

JavaScript (-210 puntos ( 190bytes - 300 (para las reglas) - 50 (para el número de conjeturas) - 25 (para no usar ninguna fuente de números aleatorios incorporada) - 25 (para decirle si la entrada está fuera del rango de un signo 16-bit entero) ):

Golfizado:

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

Código completo (muy bien formateado):

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

Salida:

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)
Cepillo de dientes
fuente
@IlmariKaronen Lo siento, cometí un error. He actualizado mi respuesta.
Cepillo de dientes
Gracias, ahora funciona ... pero parece que se rompe si supongo 0. :-( Además, ¿no debería haber un espacio en TOO LOW/ TOO HIGH?
Ilmari Karonen
19

Perl 5.10+: 159 144 bytes - 350 = -206 puntos

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

Edición 2: con el reciente cambio de reglas que me permite usar cualquier cadena literal para el mensaje "felicidades", puedo guardar 15 bytes de mi solución original de 159 bytes. No hay nada particularmente novedoso o interesante sobre el nuevo código anterior en comparación con el código anterior (acabo de deshacerme de la pfunción y llamo saydirectamente en su lugar), por lo que el resto de esta publicación describirá el código original, que se muestra a continuación:

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

Sí, estoy abusando de la regla 1. ¿Quién necesita cadenas, cuando puedes tener palabras vacías ? ;-)

Ejecute con perl -M5.010para habilitar la saycaracterística Perl 5.10+ (o reemplace el cuerpo de la pfunción con print join$",@_,$/un costo adicional de 5 bytes).

Puntajes de bonificación:

  • −300 puntos: "muestra las reglas del juego antes de comenzar el juego"
  • −50 puntos: "muestra el número de turnos realizados al final del juego"

El código no contiene literales de cadena en sentido estricto, por lo que diría que, técnicamente, la regla 1 no se infringe. El truco es que, en Perl, sin use strict, cualquier identificador que no corresponda a una palabra clave o subrutina de lenguaje conocido simplemente se evaluará con su propio nombre. La función psimplemente toma una lista de palabras y las imprime, separadas por espacios.

Ejemplo de juego:

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!

Editar: Oh, claro, las reglas dicen que también necesito publicar una versión no codificada del código, así que aquí va. Técnicamente, es "des-golf", ya que generalmente compongo mis programas de golf de código en forma más o menos completa desde el principio, y a veces puede ser difícil eliminar todas las optimizaciones "golf" sin cambiar fundamentalmente cómo algunas partes del programa de trabajo. Aún así, al menos he intentado agregar espacios en blanco, comentarios y nombres de funciones / variables más significativos:

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

PD. Como alternativa, si solo usar palabras vacías en lugar de cadenas se siente demasiado engañoso para usted, aquí hay una solución de 182 bytes que no usa las letras TOLWHIG incluso en palabras vacías (pero las usa en un operador de transliteración). Todavía recibe los mismos bonos, para un puntaje total de 182 - 350 = −168 puntos :

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

La salida se ve exactamente igual a la anterior. Según las reglas (originales), uso las letras ty ial imprimir las reglas, ya que está permitido; Sin embargo, eliminar incluso esos usos solo costaría dos bytes adicionales. Por el contrario, poner todo el resultado en mayúscula (que, según los comentarios anteriores, parece estar permitido) me permitiría guardar tres bytes.

Ilmari Karonen
fuente
¡Esa es una respuesta agradable e inteligente! +1 de mi parte
Mukul Kumar
Ahora que veo esto, me pregunto si podría vencerlo con Ruby 1.8 si acepta la penalización def method_missing *args;args.join' ';end.
Kaya
¡Te gané con el viejo JavaScript!
Cepillo de dientes
14

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

La puntuación es de 270 caracteres, menos 300 por mostrar las instrucciones, menos 50 por mostrar el número de conjeturas en las "felicidades". cadena, para un total de 80 puntos negativos.

Versión sin bucle del bucle, con cadenas sin escape:

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

La cmpfunción incorporada devuelve 0 si los valores son iguales, -1 si el primero es más pequeño y 1 si el primero es más grande. Utilizo el valor para indexar una tupla de cadenas, y luego nuevamente como la condición de salida del bucle. La indexación de una secuencia con un índice negativo (como -1) cuenta desde el final de la secuencia, en lugar de desde el principio.

Estuve muy tentado a omitir las importaciones y solo usarlas 4como mi número aleatorio, según XKCD 221 (¿eso calificaría para el bono de -25 caracteres?).

Ejemplo de ejecución (completa con un error, donde no puedo hacer cálculos negativos):

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
fuente
Muestre la salida de muestra de su código.
Mukul Kumar
2
¿No es este código de ruptura la regla 1? WhileURong (USayNumbr; ISayBigrOrSmalr) contiene uno o más Os, Ls, Ws, Hs, Is y Gs.
Fors
@Cruncher: No estoy seguro de lo que quieres decir, ya que el programa termina. Después de obtener el valor correcto ges cero y el whileciclo termina.
Blckknght
@Blckknght oops, lectura rápida
Cruncher
@ForsYou can ignore Rule-1 for Rules-2,3 & 4 in Code Rules
Cruncher
13

JavaScript 293, -300 (reglas) - 50 (pantalla de vueltas) - 25 (advertencia de rango) - 25 (sin función aleatoria) = -107 (nueva puntuación)

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

Yo diría que, según las convenciones RGB, que el negro es un color, pero eso sería un poco trampa ...

Ah, y podría agregar, ¡tampoco romper la regla # 1!

Salida en una serie de alertas y avisos

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!

Código sin golf:

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
fuente
has leído las reglas cuidadosamente? bueno, tienes que publicar código no protegido con una salida
Mukul Kumar
@MukulKumar ordenado ...
WallyWest
Puede guardar 4 prefijando su respuesta con A=alert;y reemplazando todo alertcon A. Y uno más si mueve la alerta A(0>(x...después del punto y coma prompt())!=r;)n++1.
DocMax
puede cambiar feedback if too high/lowcuál usa 84 caracteres actualmente i give feedback(lo que solo requeriría \151 \147\151ve feedbacko 24 caracteres para guardar 60 caracteres .)
corsiKa
1
Puede que me equivoque, pero creo que puedes mover el n++bucle for al x=prompt(n++)para evitar tener que hacerlo + ++n+en la alerta final. Ahorraría 3.
DocMax
7

Javascript, 324 bytes, puntaje -76

[Actualizado debido a cambios en las reglas]

  • 324 bytes
  • -300 por mostrar las reglas
  • -50 para mostrar los turnos cuando el usuario gana
  • -25 por decirle al usuario cuando ingresa un número fuera del rango
  • -25 por no usar aleatorio incorporado (actualizado)

Puntuación total: -76

Golfizado:

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

Vamos a deshacer este desastre.

Primero, correctamente ideado (pero esto todavía no es muy bueno con el código ofuscado):

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

Segundo, renombrar identificadores:

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

Entonces, la función desencriptar obtiene todos los caracteres entre ASCII 33 ( !) y ASCII 58 ( :) y agrega 32, convirtiéndolos en caracteres en el rango A-Z.

Vamos a descifrar más el código al descifrar todas las cadenas:

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

Y finalmente, vamos a mover algunas instrucciones a otros lugares, reemplazar la larga cadena ternaria con ifs y elses, unir cadenas de concatenación y simplificar las matemáticas para aumentar la legibilidad:

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

Muestra:

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
fuente
1
Realmente me gusta :)
Wolle Vanillebär Lutz
Muestre la salida de muestra de su código.
Mukul Kumar
@MukulKumar. Listo, salida agregada
Victor Stafusa
7

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

  • -300 para mostrar las reglas;
  • -50 por decirle al jugador el número de turnos;
  • -25 por no usar una biblioteca RNG estándar.

Código de golf:

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

Sin golf:

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

Salida:

Salida

Oberon
fuente
¿Dónde está la salida?
Mukul Kumar
@IlmariKaronen, EDIT2. Además, no solo tomo la época.
Oberon
@Oberon, por favor publique la salida también
Mukul Kumar
@MukulKumar, publicado.
Oberon
5

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

-300 para las reglas, -50 para mostrar el número de conjeturas, -25 para no usar ningún generador de números aleatorios incorporado, -25 para el mensaje de fuera de rango y -10 para colorear el mensaje de felicitaciones.

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

Sin golf:

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

Ejemplo de ejecución:

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!

La última línea aparece como roja.

Fors
fuente
¡Bravo! ¡Golpeaste todas las recompensas!
Mukul Kumar
4

bash, -137

Puntuación

273 (bytes) - 300 (reglas) - 50 (intentos de conteo) - 25 (advertencia OOF) - 25 (PRNG personalizado) - 10 (color)

Versión de golf

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.

Tenga en cuenta que la última línea es un comentario, por lo que no contiene cadenas o literales de caracteres.

Versión sin golf

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

Salida de muestra

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

La última línea está impresa en verde.

Dennis
fuente
3

C #: -30 puntos

  • 345 bytes
  • -300 por mostrar las reglas
  • -50 para mostrar los turnos cuando el usuario gana
  • -25 por decirle al usuario cuando ingresa un número fuera del rango

Golfizado :

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

Para ejecutarlo, póngalo en un archivo (code.cs) y ejecútelo con scriptcs en la línea de comando:scriptcs code.cs .

Ungolfed : expandió los nombres de las variables en algo más fácil de entender y cambió las letras hexadecimales a letras reales.

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

Salida de muestra disponible aquí .

Yaakov Ellis
fuente
3
Lo siento por decir esto, pero la norma establece que " No utilice los caracteres T, O, L, W, H, Iy G(ni en minúsculas ni en mayúsculas) en caracteres o frases literales. "
Victor Stafusa
Así que basta con sustituir T, O, L... con \x54, \x4F, \x4C... y ya está bien.
pereza
Gracias. Acabo de poner codificaciones hexadecimales para los caracteres aplicables en literales de cadena en la versión de golf, y modifiqué la puntuación en consecuencia.
Yaakov Ellis
Muestre la salida de muestra de su código.
Mukul Kumar
@MukulKumar ver aquí para la salida. También realicé algunos pequeños cambios en la lógica, solucioné un problema.
Yaakov Ellis
2

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

-300: Instrucciones
-50: Muestra el número de vueltas
-25: No utiliza la función aleatoria
-25: advierte al usuario sobre la entrada fuera de rango

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

SIN GOLF

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

SALIDA

Mukul Kumar
fuente
Personalmente, no pude detenerme .. :)
Mukul Kumar
2

C, 183-300-25 = -142

183 bytes -300 para las reglas -25 para no usar una biblioteca aleatoria

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

versión sin golf:

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

muestra de ejecución:

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
fuente
"TOO HIGH"y "TOO LOW"ambos contienen caracteres ilegales TOLWHIGtolwhig.
Oberon
Al igual que "¡Felicidades! ¡Encontraste el número!" y "WhileURong (USayNumbr; ISayBigrOrSmalr)".
Fors
@Fors pero están permitidos (ver EDIT2 ).
Oberon
¡De hecho ellos son! Por alguna razón me perdí esa edición.
Fors
@Oberon ¿Entonces EDIT 2 también lo TOO LOWpermite ?
Cepillo de dientes
2

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

'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

Explicación (recuerde que J se lee de derecha a izquierda):

  • 'WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2 - Imprime las reglas.
  • 32767-?2^16[- Mezcle el valor de retorno y luego genere un número aleatorio entre 0 y 2 ^ 16-1 inclusive. Luego, ajústelo al rango -32768..32767 restándolo de 32767.
  • 1>:@]^:(...)^:_~- El x u^:v^:_ ypatrón es como un bucle while. xpermanece constante y yse muta con cada ejecución de u. Esto continúa hasta que x v ydevuelve 0 o no x u yproduce ningún cambio en y. Las ~permutas de los dos argumentos, de modo que xserá el número aleatorio y ycomenzarán a 1. Nuestro ues >:@], que incrementa este 1 y lo devuelve, por lo que actúa como un contador y elx u y condición de terminación no puede ocurrir.
  • [:".1!:1@1:- Tome el contador e ignore su valor, utilizando el número 1 en su lugar ( 1:). Lea en una línea de entrada ( 1!:1) desde el teclado (identificador de archivo 1) y ejecútelo ( ".). Esto permite que J, cuyo signo negativo es normalmente _, tome números en la forma -n(se evalúa como negación aplicada al número n).
  • ]`(...)@.*@-- Tome la diferencia del número aleatorio de antes y la conjetura ( -). Ahora, seleccionamos la siguiente acción dependiendo de si esta diferencia es cero ( @.*). Si es así, devuelve ( ]`) ese 0 como resultado para x v yque la ejecución finalice y todo el ciclo while devuelva el contador. Más...
  • 71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>- Devuelve la matriz 5 8 16si el número es negativo y 1 2 0 1si es positivo. Luego anteponga 13 8 8 _39y agregue 71 a todo, para que tengamos uno 84 79 79 32 76 79 87o 84 79 79 32 72 73 71 72.
  • 1[2:1!:2~a.{~- Convierta estos números en caracteres ASCII indexando el alfabeto a.con ellos. Luego imprímalos con 1!:2(usando el identificador de archivo 2) y devuelva 1 como resultado de x v y.
  • 'Congrats, you found the number in ',' turns!',~":- Cuando finaliza el bucle, devuelve el contador. Conviértalo en una cadena con ":y colóquelo entre las cadenas 'Congrats, you found the number in 'y ' turns!'.

Salida de muestra:

   '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!
Algoritmo de tiburón
fuente
2

JavaScript -40

335 - 300 (reglas) - 50 (conteo de turnos) - 25 (fuera de rango)

No voy a ganar, pero creo que es una forma divertida de obtener las cartas.

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

Sin golf

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

Salida de muestra

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

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

(Sí, estos cuentan como bytes, el juego de caracteres APL cabe en un byte).

He reclamado "mostrar las reglas del juego" y "contar el número de turnos".

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

Ejemplo de ejecución:

      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!

Sin golf:

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
fuente
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

Si el número es 10:

¿Número?

5 5

Bajo

8

Bajo

12

Alto

10

Yay 4 vueltas


El recuento de caracteres se basa en el código con todos los espacios en blanco eliminados.

Tenga en cuenta que el pogo no es un lenguaje falso. Lo creé y escribí un compilador e IDE para él aquí: https://github.com/nrubin29/Pogo

nrubin29
fuente
Lea mi EDITAR y EDITAR - 2
Mukul Kumar
Actualizado según las ediciones.
nrubin29