Кратчайший код, чтобы сделать игру Too-low - Too-high

20

Вы должны сделать игру Too-low --- Too-high (TLTH) в самом коротком коде (в байтах)

Правила игры:

  1. Компьютер выберет случайное число из целого диапазона (-32768..32767).
  2. Теперь вы будете думать о числе и вводить его.
  3. Компьютер сообщит, является ли ваш номер ниже ( TOO LOW) или выше ( TOO HIGH) выбранного номера.
  4. Когда вы угадаете число, компьютер должен отобразить Congrats! You found the number!.

Правила Кодекса:

  1. Не используйте символы T, O, L, W, H, Iи G(ни в нижнем регистре , ни в верхнем регистре) в строковых или символьных литералов.
    Например:

    tolower(T);  // Acceptable  
    cout<<"T";   // Unacceptable
    char ch='T'; // Unacceptable
    
  2. Удалите 300 байт, если ваш код может отображать правила игры перед началом игры.

  3. Удалите 50 байт, если ваш код может считать количество ходов и отображать количество ходов, сделанных в конце игры, например:

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

    где n - число выполненных оборотов вместо

    "Congrats! You found the number!"  
    
  4. Удалите 25 байт из своей оценки, если ваш код может сказать пользователю, что введенное вами число находится вне целочисленного диапазона.
    Например:

    Enter the number: 40000  
    Sorry! This number is out of range
    Please Enter the number again:  
    
  5. Удалите 25 байтов, если ваш код берет случайное число, а не встроенную случайную функцию.

  6. Удалите 10 байтов, если ваш код отображает «поздравления» в цвете (выберите любой цвет, кроме белого по умолчанию).

Правила подачи заявок:

  1. Добавьте заголовок с названием вашего языка и счетом со всеми расчетами вознаграждений и их объяснениями.

  2. Разместите свой код для игры в гольф и без игры.

победитель

  1. Ответ с наименьшим количеством байтов выигрывает.
  2. Если есть ничья, победит ответ с большим количеством голосов.
  3. Победитель будет выбран через 5 дней.

РЕДАКТИРОВАТЬ : Пожалуйста, покажите вывод вашего кода.
РЕДАКТИРОВАТЬ-2 : Вы можете игнорировать Правило-1 для Правил-2,3 и 4 в Правилах Кодекса

Удачи :]

Мукул Кумар
источник
2
это правильное объяснение правил игры? WhileURong(USayNumbr;ISayBigrOrSmalr)
Джон Дворжак
1
Исходя из вашего описания оценки, у вас нет ни кода гольф, ни конкурса популярности. Это вызов кода (с популярностью разрешения конфликтов). Проверьте тег вики. Я предложил изменить, чтобы пометить вызов соответствующим образом. PS - Джинкс! @mniip
Джонатан Ван Матре
1
@JonathanVanMatre для меня формулировка звучит как код-гольф , несмотря на тай-брейк.
Мниип
21
Кроме того, мне не особо нравится правило против оказания помощи другим игрокам в улучшении их ответа. В бессмертных словах Андре Великана в «Принцессе-невесте» «Это не очень похоже на спортсмена».
Джонатан Ван Матре
1
Этот вопрос таков. , , Дэвид Х. Ахл
Майкл Стерн

Ответы:

2

JavaScript (-210 баллов ( 190байт - 300 (для правил) - 50 (для количества догадок) - 25 (для неиспользования какого-либо встроенного источника случайных чисел) - 25 (для сообщения о том, находится ли ввод вне диапазона со знаком 16-битное целое число) ):

Golfed:

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

Полный код (красиво отформатированный):

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

Выход:

ALERT:  Guess number
PROMPT: 5
ALERT:  TOO LOW
PROMPT: 20000
ALERT:  TOO LOW
PROMPT: 30000
ALERT:  TOO HIGH
PROMPT: 25000
ALERT:  TOO HIGH
PROMPT: 22500
ALERT:  TOO HIGH
PROMPT: 21000
ALERT:  TOO HIGH
PROMPT: 20500
ALERT:  TOO HIGH
PROMPT: 20200
ALERT:  TOO LOW
PROMPT: 20400
ALERT:  TOO LOW
PROMPT: 20450
ALERT:  TOO LOW
PROMPT: 20475
ALERT:  TOO HIGH
PROMPT: 20460
ALERT:  TOO LOW
PROMPT: 20468
ALERT:  TOO HIGH
PROMPT: 20464
ALERT:  TOO LOW
PROMPT: 20466
ALERT:  TOO LOW
PROMPT: 34000
ALERT:  -32767-32768
PROMPT: 20467
ALERT:  Great! You found the number in 17 turns!
PROMPT: (nothing)
зубная щетка
источник
@IlmariKaronen Извините, я ошибся. Я обновил свой ответ.
Зубная щетка
Спасибо, теперь он работает ... но, кажется, сломается, если я угадаю 0. :-( Кроме того, не должно быть места в TOO LOW/ TOO HIGH?
Илмари Каронен
19

Perl 5.10+: 159 144 байта - 350 = −206 баллов

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

Редактировать 2: С недавним изменением правил, которое позволяет мне использовать любой строковый литерал для сообщения «поздравляю», я могу сохранить 15 байтов из моего исходного 159-байтового решения. Нет ничего особенно нового или интересного в новом вышеприведенном коде по сравнению со старым кодом (я только что избавился от pфункции и sayвместо этого вызвал напрямую), поэтому в оставшейся части этого поста будет описан оригинальный код, показанный ниже:

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

Да, я чертовски злоупотребляю правилом 1. Кому нужны строки, когда вы можете иметь голые слова ? ;-)

Запустите с, perl -M5.010чтобы включить функцию Perl 5.10+ say(или замените тело pфункции наprint join$",@_,$/ на дополнительную плату в 5 байт).

Бонусные баллы:

  • −300 баллов: «показать правила игры перед началом игры»
  • −50 баллов: «показать количество ходов, сделанных в конце игры»

Код не содержит ни одного строковых литералов в строгом смысле этого слова, так что я бы сказал , что правило 1, технически, не нарушается. Хитрость заключается в том, что в Perl use strictлюбой идентификатор, который не соответствует ключевому слову или подпрограмме известного языка, просто оценивает свое собственное имя. Затем функция pпросто берет список слов и выводит их через пробел.

Пример воспроизведения:

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!

Редактировать: О, правильно, правила говорят, что мне нужно опубликовать версию кода без игры в гольф, так что вот так. Технически, это «де-гольф», так как я обычно сочиняю свои программные гольф-программы в более или менее полностью гольф-форме с самого начала, и иногда бывает сложно убрать все «гольфовые» оптимизации без фундаментального изменения того, как некоторые части программная работа. Тем не менее, я хотя бы попытался добавить пробелы, комментарии и более значимые имена функций / переменных:

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. В качестве альтернативы, если использование простых слов вместо строк кажется вам слишком обманчивым, вот 182-байтовое решение, которое не использует буквы TOLWHIG даже в голых словах (но использует их в операторе транслитерации). Он по-прежнему получает те же бонусы, для общего счета 182 - 350 = −168 баллов :

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

Вывод выглядит точно так же, как указано выше. Согласно (оригинальным) правилам, я использую буквы tи iпри печати правил, поскольку это разрешено; исключение даже тех использований стоило бы только два дополнительных байта. И наоборот, вывод всего верхнего регистра (который, судя по приведенным выше комментариям, кажется разрешенным) позволил бы мне сохранить три байта.

Илмари Каронен
источник
Это хороший и умный ответ! +1 от меня
Мукул Кумар
Теперь, когда я вижу это, мне интересно, можно ли победить с Ruby 1.8, если вы возьмете штраф за def method_missing *args;args.join' ';end.
Kaya
Я побил тебя старым добрым JavaScript!
Зубная щетка
14

Python 2: -80 очков (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

Оценка - 270 символов, минус 300 за показ инструкций, минус 50 за показ догадок в поздравлениях! строка, в общей сложности 80 отрицательных баллов.

Безгольфовая версия цикла с неэкранированными строками:

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

Встроенный cmp функция возвращает 0, если значения равны, -1, если первое меньше, и 1, если первое больше. Я использую значение для индексации кортежа строк, а затем снова в качестве условия выхода цикла. Индексирование последовательности с отрицательным индексом (например, -1) начинается с конца последовательности, а не с начала.

Мне очень хотелось пропустить импорт и просто использовать в 4качестве моего случайного числа, согласно XKCD 221 (будет ли это соответствовать бонусу -25 символов?).

Пример выполнения (завершается с ошибкой, где я не могу выполнить отрицательную математику):

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
источник
Пожалуйста, покажите пример вывода вашего кода.
Мукул Кумар
2
Разве это не нарушает кодекс правилом 1? В то время как URong (USayNumbr; ISayBigrOrSmalr) содержит один или несколько Os, Ls, Ws, Hs, Is и Gs.
Форс
@Cruncher: Я не уверен, что вы имеете в виду, так как программа действительно завершается. После того, как вы получите правильное значение gравно нулю, и whileцикл заканчивается.
Blckknght
@Blckknght К сожалению, быстро прочитать
Cruncher
@ForsYou can ignore Rule-1 for Rules-2,3 & 4 in Code Rules
Кранчер
13

JavaScript 293, -300 (правила) - 50 (отображение поворотов) - 25 (предупреждение о диапазоне) - 25 (без случайной функции) = -107 (новый счет)

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

Я бы сказал, что, согласно соглашениям RGB, черный - это цвет, но это было бы своего рода обманом ...

О, и я мог бы добавить, что не нарушается и правило № 1!

Вывод в серии предупреждений и подсказок

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 код:

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
Уолли Уэст
источник
вы внимательно читаете правила? ну, вы должны опубликовать некогольф код с одним выходом
Mukul Kumar
@MukulKumar отсортировано ...
WallyWest
Вы можете сохранить 4 предваряя свой ответ A=alert;и заменить все из alertс A. И еще один, если вы переместите предупреждение A(0>(x...после точки с запятой в prompt())!=r;)n++1.
DocMax
Вы можете изменить, feedback if too high/lowкоторый использует 84 символов в настоящее время i give feedback(что потребует только \151 \147\151ve feedbackили 24 символов для сохранения 60 символов .
corsiKa
1
Возможно, я ошибаюсь, но я думаю, что вы можете переместить n++цикл for в цикл, x=prompt(n++)чтобы сохранить необходимость + ++n+в последнем предупреждении. Это спасло бы 3.
DocMax
7

Javascript, 324 байта, оценка -76

[Обновлено из-за изменений правил]

  • 324 байта
  • -300 за показ правил
  • -50 для отображения поворотов, когда пользователь выигрывает
  • -25 для сообщения пользователю, когда он вводит число вне диапазона
  • -25 за неиспользование встроенного случайного (обновлено)

Общий балл: -76

Golfed:

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

Позволяет распутать этот беспорядок.

Во-первых, правильно идентифицировано (но это все еще не очень хорошо с запутанным кодом):

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

Во-вторых, переименование идентификаторов:

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

Таким образом, функция unencrypt получает все символы между ASCII 33 ( !) и ASCII 58 (: ) и добавляет 32, преобразовывая их в символы в диапазоне A-Z.

Давайте расширим код, расшифровав все строки:

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

И, наконец, давайте переместим некоторые инструкции в другие места, заменим длинную троичную цепочку на ifs и elses, соединим конкатенационные строки и упростим математику, чтобы повысить удобочитаемость:

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

Образец:

ALERT:  WhileURong(USayNumbr;ISayBigrOrSmalr)
PROMPT: 5
ALERT:  TOO LOW
PROMPT: 20000
ALERT:  TOO LOW
PROMPT: 30000
ALERT:  TOO HIGH
PROMPT: 25000
ALERT:  TOO HIGH
PROMPT: 22500
ALERT:  TOO HIGH
PROMPT: 21000
ALERT:  TOO HIGH
PROMPT: 20500
ALERT:  TOO HIGH
PROMPT: 20200
ALERT:  TOO LOW
PROMPT: 20400
ALERT:  TOO LOW
PROMPT: 20450
ALERT:  TOO LOW
PROMPT: 20475
ALERT:  TOO HIGH
PROMPT: 20460
ALERT:  TOO LOW
PROMPT: 20468
ALERT:  TOO HIGH
PROMPT: 20464
ALERT:  TOO LOW
PROMPT: 20466
ALERT:  TOO LOW
PROMPT: 20467
ALERT:  Congrats! You found the number in 16 turns!"
Виктор Стафуса
источник
1
Мне действительно это нравится :)
Wolle Vanillebär Lutz
Пожалуйста, покажите пример вывода вашего кода.
Мукул Кумар
@MukulKumar. Готово, добавлен выходной
Виктор Стафуса
7

C - 272 символа - 300 - 50 - 25 = -103

  • -300 за отображение правил;
  • -50 за указание игроку количества ходов;
  • -25 за неиспользование стандартной библиотеки RNG.

Гольф-код:

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

Выход:

Выход

Oberon
источник
Где выход?
Мукул Кумар
@IlmariKaronen, EDIT2. Кроме того, я не просто беру эпоху.
Оберон
@ Оберон, пожалуйста, опубликуйте также вывод
Мукул Кумар
@MukulKumar, опубликовано.
Оберон
5

C: 237 - 300 - 50 - 25 - 25 - 10: -173 очка

-300 для правил, -50 для отображения количества догадок, -25 для неиспользования встроенного генератора случайных чисел, -25 для сообщения вне диапазона и -10 для раскрашивания поздравляющих сообщений.

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

Ungolfed:

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

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

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

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

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

Пример выполнения:

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!

Последняя строка отображается красным цветом.

Форс
источник
Браво! Ты ударил всех щедрот !!!
Мукул Кумар
4

Баш, -137

Гол

273 (байты) - 300 (правила) - 50 (количество попыток) - 25 (предупреждение OOF) - 25 (пользовательский PRNG) - 10 (цвет)

Гольф версия

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.

Обратите внимание, что последняя строка является комментарием, поэтому она не содержит строковых или символьных литералов.

Неуправляемая версия

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

Образец вывода

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

Последняя строка напечатана зеленым цветом.

Деннис
источник
3

C #: -30 баллов

  • 345 байт
  • -300 за показ правил
  • -50 для отображения поворотов, когда пользователь выигрывает
  • -25 для сообщения пользователю, когда он вводит число вне диапазона

Гольф :

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

Для того, чтобы запустить его, поместите его в файл (code.cs) и работать с scriptcs в командной строке: scriptcs code.cs.

Ungolfed : расширенные имена переменных во что-то более простое для понимания, и измененные шестнадцатеричные буквы в реальные буквы.

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

Пример вывода доступен здесь .

Яаков Эллис
источник
3
Извините за это говорить, но правило гласит , что « Не использовать символы T, O, L, W, H, Iи G(ни в нижнем регистре , ни в верхнем регистре) в строковых или символьных литералов. »
Виктор Stafusa
Так просто заменить T, O, L... с \x54, \x4F, \x4C... и все в порядке.
ленивец
Благодарю. Я просто вставил шестнадцатеричные кодировки для соответствующих символов в строковых литералах в версии для гольфа и соответственно изменил начисления очков.
Яаков Эллис
Пожалуйста, покажите пример вывода вашего кода.
Мукул Кумар
@MukulKumar смотрите здесь для вывода. Я также только что сделал несколько небольших изменений в логике, исправил проблему.
Яаков Эллис
2

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

-300: инструкции
-50: отображение количества оборотов
-25: не использовать случайную функцию
-25: предупреждение пользователя о входе вне диапазона

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

ВЫХОД

Мукул Кумар
источник
Лично я не мог остановить себя .. :)
Мукул Кумар
2

С 183-300-25 = -142

183 байта -300 для правил -25 для неиспользования случайной библиотеки

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

версия без золота:

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

образец прогона:

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
источник
"TOO HIGH"и "TOO LOW"оба содержат недопустимые символы TOLWHIGtolwhig.
Оберон
Как и «Поздравляю! Вы нашли номер!» и "WhileURong (USayNumbr; ISayBigrOrSmalr)".
Форс
@, Но они разрешены (см. РЕДАКТИРОВАТЬ 2 ).
Оберон
Действительно они есть! По какой-то причине я пропустил это редактирование.
Форс
@ Оберон Так тоже TOO LOWразрешено редактировать 2 ?
Зубная щетка
2

J - 190 символов -300 -50 = -160 баллов

'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

Пояснение (напомним, что J читается справа налево):

  • 'WhileURong(USayNumbr;ISayBigrOrSmalr)'1!:2]2 - Распечатать правила.
  • 32767-?2^16[- Бросьте возвращаемое значение, а затем сгенерируйте случайное число от 0 до 2 ^ 16-1 включительно. Затем настройте его на диапазон -32768..32767, вычтя его из 32767.
  • 1>:@]^:(...)^:_~- x u^:v^:_ yОбразец похож на цикл времени. xостается постоянным и yмутирует при каждом выполнении u. Это продолжается до тех пор, пока либо не x v yвернет 0, либо x u yне изменится на y. В ~меняет местами два аргумента, так что xбудет случайное число и yначнется в 1. Нашего uесть >:@], которая увеличивает этот 1 и возвращает его, так что он действует в качестве счетчика и x u yусловия завершения не может произойти.
  • [:".1!:1@1:- Возьмите счетчик и проигнорируйте его значение, используя вместо этого число 1 ( 1:). Прочитайте строку ввода ( 1!:1) с клавиатуры (дескриптор файла 1) и выполните ее ( ".). Это позволяет J, чей отрицательный знак обычно _, принимать числа в форме -n(оценивается как отрицание, примененное к числу n).
  • ]`(...)@.*@-- Возьмите разницу случайного числа от и до предположения ( -). Теперь мы выбираем следующее действие в зависимости от того, равна ли эта разница нулю ( @.*). Если это так, верните ( ]`) этот 0 как результат для x v y, чтобы выполнение завершилось, и весь цикл while возвращает счетчик. Else ...
  • 71+13 8 8 _39,(5 8 16;1 2 0 1){::~0&>- Вернуть массив, 5 8 16если число отрицательное, и 1 2 0 1если оно положительное. Затем 13 8 8 _39добавьте ко всему 71 и добавьте либо, 84 79 79 32 76 79 87либо 84 79 79 32 72 73 71 72.
  • 1[2:1!:2~a.{~- Превратите эти числа в символы ASCII, указав для a.них алфавит . Затем распечатайте их с 1!:2помощью (используя дескриптор файла 2) и верните 1 в результате x v y.
  • 'Congrats, you found the number in ',' turns!',~":- Когда цикл заканчивается, он возвращает счетчик. Преобразуйте его в строку с ":и поместите его между строками 'Congrats, you found the number in 'и ' turns!'.

Образец вывода:

   '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
источник
2

JavaScript -40

335 - 300 (правила) - 50 (количество ходов) - 25 (вне диапазона)

Думаю, не выиграю, но получу письма интереснее.

Golfed

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

Ungolfed

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

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

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

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

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

Образец вывода

(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
источник
1

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

(Да, они считаются байтами, кодировка APL помещается в байт.)

Я утверждал, что «отображать правила игры» и «считать количество ходов».

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

Пример выполнения:

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

Ungolfed:

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

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

⎕←'Guess 16-bit signed number'

try:
  tries +← 1
  guess ← ⎕
  →(guess=num)/found
  ⍝ still here: number was wrong
  ⎕←too, (1+num<guess)⊃low high  ⍝ output appropriate word
  →try ⍝ try again
found:
  ⎕←'Congrats! You found the number in' tries 'tries!'
Мэринус
источник
1

Пого: -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

Если число 10:

Номер?

5

Низкий

8

Низкий

12

Высоко

10

Yay 4 хода


Количество символов основано на коде со всеми удаленными пробелами.

Обратите внимание, что Pogo не является поддельным языком. Я создал его и написал для него компилятор и IDE: https://github.com/nrubin29/Pogo

nrubin29
источник
Прочитайте мой РЕДАКТИРОВАТЬ и РЕДАКТИРОВАТЬ - 2
Mukul Kumar
Обновлено в соответствии с изменениями.
nrubin29