Código mais curto para criar um jogo Muito baixo - Muito alto

20

Você precisa criar um jogo Muito baixo --- Muito alto (TLTH) no código mais curto (em bytes)

Regras do jogo:

  1. O computador escolherá um número aleatório fora do intervalo inteiro (-32768..32767).
  2. Agora você vai pensar em um número e inseri-lo.
  3. O computador dirá se o seu número é menor ( TOO LOW) ou superior ( TOO HIGH) ao número escolhido.
  4. Quando você adivinha o número, o computador deve ser exibido Congrats! You found the number!.

Regras de código:

  1. Não use os personagens T, O, L, W, H, Ie G(nem minúsculas nem maiúsculas) em cordas ou caracteres literais.
    Por exemplo:

    tolower(T);  // Acceptable  
    cout<<"T";   // Unacceptable
    char ch='T'; // Unacceptable
    
  2. Remova 300 bytes se o seu código puder exibir as regras do jogo antes de iniciar o jogo.

  3. Remova 50 bytes se o seu código puder contar o número de turnos e exibir o número de turnos realizados no final do jogo, da seguinte maneira:

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

    onde n é o número de voltas realizadas, em vez de

    "Congrats! You found the number!"  
    
  4. Remova 25 bytes da sua pontuação se o seu código puder informar ao usuário que o número digitado está fora do intervalo inteiro.
    Por exemplo:

    Enter the number: 40000  
    Sorry! This number is out of range
    Please Enter the number again:  
    
  5. Remova 25 bytes Se o seu código não utiliza o número aleatório de nenhuma função aleatória interna.

  6. Remova 10 bytes Se o seu código exibir "parabéns" em cores (escolha qualquer cor, exceto o branco padrão).

Regras de envio:

  1. Adicione um cabeçalho com o nome do seu idioma e pontue com todo o cálculo de recompensa e sua explicação.

  2. Poste seu código com e sem golf.

Vencedora

  1. A resposta com menos bytes vence.
  2. Se houver empate, a resposta com mais votos vence.
  3. O vencedor será escolhido após 5 dias.

EDIT : Por favor, mostre a saída do seu código.
EDIT-2 : você pode ignorar a regra 1 para as regras 2,3 e 4 nas regras de código

Best Of Luck:]

Mukul Kumar
fonte
2
esta é uma explicação válida das regras do jogo? WhileURong(USayNumbr;ISayBigrOrSmalr)
John Dvorak
1
Com base na sua descrição da pontuação, você não tem um código de golfe nem um concurso de popularidade. É um desafio de código (com um desempatador de popularidade). Confira a tag wikis. Propus uma edição para marcar o desafio adequadamente. ps - Jinx! @mniip #
Jonathan Van Matre
1
@JonathanVanMatre, para mim, a redação soa como código-golfe , apesar do desempate.
Mniip
21
Além disso, não gosto particularmente da regra contra ajudar outros jogadores a melhorar sua resposta. Nas palavras imortais de André, o Gigante, em The Princess Bride, "Isso não é muito esportista".
Jonathan Van Matre
1
Esta questão é assim. . . David H. Ahl
Michael Stern

Respostas:

2

JavaScript (-210 pontos ( 190bytes - 300 (para as regras) - 50 (para o número de suposições)) - 25 (por não usar nenhuma fonte de números aleatórios) -25 (para informar se a entrada está fora do intervalo de um sinal) 16inteiro de bits) ):

Golfe:

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 (bem formatado):

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

Saída:

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)
Escova dental
fonte
@IlmariKaronen Desculpe, eu cometi um erro. Eu atualizei minha resposta.
Escova de dentes
Obrigado, agora corre ... mas parece que vai quebrar se eu acho 0. :-( Além disso, não deveria haver um espaço em TOO LOW/ TOO HIGH?
Ilmari Karonen 5/14/14
19

Perl 5.10+: 159 144 bytes - 350 = −206 pontos

say"Guess 16 bit signed number";$==32767-rand 65536;say(TOO.$",$_<0?LOW:HIGH)while++$i,$_=<>-$=;say"Congrats! You found the number in $i turns!"

Edit 2: Com a recente mudança de regras que me permite usar qualquer string literal para a mensagem "parabéns", posso salvar 15 bytes da minha solução original de 159 bytes. Não há nada particularmente novo ou interessante sobre o novo código acima em comparação com o código antigo (acabei de me livrar da pfunção e chamo saydiretamente), portanto, o restante deste post descreverá o código original, mostrado abaixo:

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

Sim, estou abusando da regra 1. Quem precisa de cordas, quando você pode ter palavras de baralho ? ;-)

Execute com perl -M5.010para ativar o sayrecurso Perl 5.10+ (ou substitua o corpo da pfunção print join$",@_,$/por um custo extra de 5 bytes).

Pontuações bônus:

  • −300 pontos: "exibe as regras do jogo antes de iniciar o jogo"
  • -50 pontos: "exibe o número de turnos realizados no final do jogo"

O código não contém literais de string em sentido estrito; portanto, diria que a regra 1 não é tecnicamente violada. O truque é que, no Perl, sem use strict, qualquer identificador que não corresponda a uma palavra-chave ou sub-rotina de idioma conhecido será avaliado com base em seu próprio nome. A funçãop simplesmente pega uma lista de palavras e as imprime, separadas por espaços.

Exemplo de reprodução:

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!

Edit: Ah, certo, as regras dizem que eu preciso postar uma versão un-golfed do código também, então aqui vai. Tecnicamente, é "descolado", já que normalmente componho meus programas de código de golfe de forma mais ou menos completa desde o início, e às vezes pode ser complicado remover todas as otimizações de "golfe" sem alterar fundamentalmente como algumas partes do programa de trabalho. Ainda assim, pelo menos tentei adicionar espaços em branco, comentários e nomes de funções / variáveis ​​mais 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."!";

Ps. Como alternativa, se apenas o uso de palavras de barra em vez de strings parecer muito barato para você, aqui está uma solução de 182 bytes que não usa as letras TOLWHIG nem em palavras de barra (mas as usa em um operador de transliteração). Ele ainda recebe os mesmos bônus, para uma pontuação total de 182 - 350 = −168 pontos :

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

A saída parece exatamente igual à acima. Pelas regras (originais), eu uso as letras te iimprimo as regras, uma vez que é permitido; eliminar esses usos custaria apenas dois bytes extras. Por outro lado, colocar toda a saída em maiúscula (que, com base nos comentários acima, parece ser permitida) me permitiria salvar três bytes.

Ilmari Karonen
fonte
Essa é uma resposta agradável e inteligente! +1 de mim
Mukul Kumar
Agora que vejo isso, me pergunto se poderia ser derrotado com o Ruby 1.8 se você cumprir a penalidade def method_missing *args;args.join' ';end.
Kaya
Eu venci você com o bom e velho JavaScript!
Escova de dentes
14

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

A pontuação é de 270 caracteres, menos 300 por mostrar as instruções, menos 50 por mostrar o número de suposições nos "parabéns!" string, para um total de 80 pontos negativos.

Versão ungolfed do loop, com seqüências de caracteres sem escape:

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

A cmpfunção interna retorna 0 se os valores forem iguais, -1 se o primeiro for menor e 1 se o primeiro for maior. Eu uso o valor para indexar uma tupla de seqüências de caracteres e, novamente, como a condição de saída do loop. A indexação de uma sequência com um índice negativo (como -1) conta a partir do final da sequência, e não desde o início.

Fiquei extremamente tentado a ignorar as importações e usar apenas 4como meu número aleatório, conforme o XKCD 221 (isso se qualificaria para o bônus de -25 caracteres?).

Exemplo de execução (completo com um erro, onde não posso fazer contas negativas):

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
fonte
Por favor, mostre a saída de amostra do seu código.
Mukul Kumar
2
Essa regra de código não está quebrando 1? EnquantoURong (USayNumbr; ISayBigrOrSmalr) contém um ou mais Os, Ls, Ws, Hs, Is e Gs.
Fors
@ Cruncher: Não sei ao certo o que você quer dizer, pois o programa termina. Depois de obter o valor certo, gé zero e o whileloop termina.
Blckknght
@Blckknght oops, leitura rápida #
Cruncher
@ForsYou can ignore Rule-1 for Rules-2,3 & 4 in Code Rules
Cruncher
13

JavaScript 293, -300 (regras) - 50 (exibição de voltas) - 25 (aviso de alcance) - 25 (sem função aleatória) = -107 (nova pontuação)

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

Eu diria que, por convenções RGB, o preto é uma cor, mas isso seria meio trapaceiro ...

Ah, e devo acrescentar, também não há quebra de regra 1!

Saída em uma série de alertas e prompts

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 não destruído:

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
fonte
você leu as regras cuidadosamente? bem você tem que postar código ungolfed com uma saída
Mukul Kumar
@MukulKumar classificado ...
WallyWest
Você pode salvar 4 prefixando a sua resposta com A=alert;e substituindo toda a alertcom A. E mais um, se você mover o alerta A(0>(x...após o ponto e vírgula prompt())!=r;)n++1.
DocMax
você pode mudar feedback if too high/lowque usa 84 caracteres atualmente para i give feedback(que só exigiria \151 \147\151ve feedbackou 24 caracteres para salvar 60 caracteres .
corsiKa
1
Posso estar errado, mas acho que você pode mover o n++loop for para o x=prompt(n++)para economizar o que fazer + ++n+no alerta final. Isso pouparia 3.
DocMax
7

Javascript, 324 bytes, pontuação -76

[Atualizado devido a alterações nas regras]

  • 324 bytes
  • -300 para mostrar as regras
  • -50 para mostrar as curvas quando o usuário ganha
  • -25 por dizer ao usuário quando ele digita um número fora do intervalo
  • -25 por não usar o aleatório embutido (atualizado)

Pontuação total: -76

Golfe:

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

Deixa a bagunça para o ungolf.

Primeiro, devidamente identificado (mas isso ainda não é muito bom com o 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, renomeando 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!")

Portanto, a função descriptografar obtém todos os caracteres entre ASCII 33 ( !) e ASCII 58 ( :) e adiciona 32, convertendo-os em caracteres no intervalo A-Z.

Permite desgolfizar o código descriptografando todas as strings:

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

E, finalmente, vamos mover algumas instruções para outros lugares, substituir a longa cadeia ternária por ifs e elses, juntar cordas de concatenação e simplificar a matemática, para aumentar a legibilidade:

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

Amostra:

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
fonte
1
Eu realmente gosto dele :)
Wolle Vanillebär Lutz
Por favor, mostre a saída de amostra do seu código.
Mukul Kumar
@MukulKumar. Feito, saída adicionada
Victor Stafusa
7

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

  • -300 para exibir as regras;
  • -50 por dizer ao jogador o número de turnos;
  • -25 por não usar uma biblioteca RNG padrão.

Código de golfe:

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

Saída:

Saída

Oberon
fonte
Onde está a saída?
Mukul Kumar
@IlmariKaronen, EDIT2. Além disso, eu não apenas entendo a época.
Oberon
@Oberon favor postar a saída também
Mukul Kumar
@MukulKumar, publicado.
Oberon
5

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

-300 para as regras, -50 para mostrar o número de tentativas, -25 para não usar nenhum gerador de números aleatórios interno, -25 para a mensagem fora do intervalo e -10 para colorir a mensagem de parabéns.

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

Exemplo de execução:

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!

A última linha aparece em vermelho.

Para s
fonte
Bravo! Você bate todas as recompensas !!!
Mukul Kumar
4

bash, -137

Ponto

273 (bytes) - 300 (regras) - 50 (contagem de tentativas) - 25 (aviso OOF) - 25 (PRNG personalizado) - 10 (cor)

Versão Golfed

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.

Observe que a última linha é um comentário, portanto, não contém literais de sequência ou de caracteres.

Versão ungolfed

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

Saída de amostra

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

A última linha é impressa em verde.

Dennis
fonte
3

C #: -30 pontos

  • 345 bytes
  • -300 para mostrar as regras
  • -50 para mostrar as curvas quando o usuário ganha
  • -25 por dizer ao usuário quando ele digita um número fora do intervalo

Golfe :

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 executá-lo, colocá-lo em um arquivo (code.cs) e correr com scriptcs na linha de comando: scriptcs code.cs.

Ungolfed : nomes de variáveis ​​expandidos para algo mais fácil de entender e alterou letras hexadecimais em letras reais.

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

Exemplo de saída disponível aqui .

Yaakov Ellis
fonte
3
Desculpem-me por dizer isso, mas a regra estabelece que " Não utilize os personagens T, O, L, W, H, Ie G(nem minúsculas nem maiúsculas) em cordas ou caracteres literais. "
Victor Stafusa
Então, basta substituir T, O, L... com \x54, \x4F, \x4C... e você está bem.
Preguiça
Obrigado. Acabei de inserir codificações hexadecimais para os caracteres aplicáveis ​​em literais de string na versão golfed e modifiquei a pontuação de acordo.
Yaakov Ellis
Por favor, mostre a saída de amostra do seu código.
Mukul Kumar
@MukulKumar veja aqui a saída. Também fiz algumas pequenas alterações na lógica, corrigi um problema.
Yaakov Ellis
2

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

-300: Instruções
-50: Mostrando o número de voltas
-25: Não usando a função aleatória
-25: avisando o usuário sobre entrada fora da faixa

GOLFE

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

SAÍDA

Mukul Kumar
fonte
Pessoalmente, eu não conseguia parar de me .. :)
Mukul Kumar
2

C, 183-300-25 = -142

183 bytes -300 para as regras -25 por não usar uma biblioteca aleatória

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

versão não destruída:

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

amostra de execução:

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
fonte
"TOO HIGH"e "TOO LOW"ambos contêm caracteres ilegais TOLWHIGtolwhig.
Oberon
Assim como "Parabéns! Você encontrou o número!" e "WhileURong (USayNumbr; ISayBigrOrSmalr)".
Fors
@Fors, mas esses são permitidos (consulte EDIT2 ).
Oberon
Na verdade eles são! Por alguma razão, eu perdi essa edição.
Fors
@Oberon Então TOO LOW, o EDIT 2 também é permitido ?
Escova de dentes
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

Explicação (lembre-se de que J é lido da direita para a esquerda):

  • 'WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2 - Imprima as regras.
  • 32767-?2^16[- Lance o valor de retorno e gere um número aleatório entre 0 e 2 ^ 16-1 inclusive. Em seguida, ajuste-o no intervalo -32768..32767, subtraindo-o de 32767.
  • 1>:@]^:(...)^:_~- O x u^:v^:_ ypadrão é como um loop while. xpermanece constante e ysofre mutação a cada execução de u. Isso continua até que x v yretorne 0 ou x u yresulte em nenhuma alteração para y. Os ~dois argumentos são trocados, de modo que este xserá o número aleatório e ycomeçará em 1. Our uis >:@], que incrementa esse 1 e o retorna, de modo que ele atua como um contador e a x u ycondição de terminação nunca pode ocorrer.
  • [:".1!:1@1:- Pegue o contador e ignore seu valor, usando o número 1 ( 1:). Leia uma linha de entrada ( 1!:1) do teclado (identificador de arquivo 1) e execute-a ( ".). Isso permite que J, cujo sinal negativo é normalmente _, receba números no formulário -n(é avaliado como negação aplicada ao número n).
  • ]`(...)@.*@-- Tire a diferença do número aleatório de antes e adivinhe ( -). Agora, selecionamos a próxima ação, dependendo se essa diferença é zero ( @.*). Se for, retorne ( ]`) esse 0 como resultado x v y, para que a execução termine e o loop while inteiro retorne o contador. Outro...
  • 71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>- Retorne a matriz 5 8 16se o número for negativo e 1 2 0 1se for positivo. Em seguida, 13 8 8 _39acrescente e adicione 71 a tudo, para que tenhamos um 84 79 79 32 76 79 87ou84 79 79 32 72 73 71 72 .
  • 1[2:1!:2~a.{~- Transforme esses números em caracteres ASCII indexando o alfabeto a.com eles. Em seguida, imprima-os com 1!:2(usando o identificador de arquivo 2) e retorne 1 como resultado de x v y.
  • 'Congrats, you found the number in ',' turns!',~":- Quando o loop termina, ele retorna o contador. Converta-o em uma string com ":e coloque-o entre as strings 'Congrats, you found the number in 'e ' turns!'.

Saída de amostra:

   '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!
algoritmshark
fonte
2

JavaScript -40

335 - 300 (regras) - 50 (contagem de turnos) - 25 (fora do intervalo)

Não vou ganhar, mas uma maneira divertida de receber as cartas, eu acho.

Golfe

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

Saída de amostra

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

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

(Sim, eles contam como bytes, o conjunto de caracteres APL cabe em um byte.)

Eu reivindiquei "exibir as regras do jogo" e "contar o 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!'

Exemplo de execução:

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

Se o número for 10:

Número?

5

Baixo

8

Baixo

12

Alto

10

Yay 4 turnos


A contagem de caracteres é baseada no código com todo o espaço em branco removido.

Observe que o Pogo não é um idioma falso. Eu criei e escrevi um compilador e um IDE para ele aqui: https://github.com/nrubin29/Pogo

nrubin29
fonte
Leia meu EDIT e EDIT - 2
Mukul Kumar
Atualizado de acordo com as edições.
Nrubin29