Найкоротший код, щоб зробити гру занадто низькою - занадто високою


20

Ви повинні зробити гру занадто низькою --- занадто високою (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 днів.

EDIT : Будь ласка, покажіть вихідний код.
EDIT-2 : Ви можете ігнорувати Правило-1 для Правил 2,3 і 4 в Правилах коду

Удачі :]


2
це дійсне пояснення правил гри? WhileURong(USayNumbr;ISayBigrOrSmalr)
Джон Дворак

1
Виходячи з вашого опису підрахунку балів, у вас немає ні коду гольфу, ні популярності. Це виклик коду (з популярністю краватки). Ознайомтеся з тегами вікі. Я запропонував редагувати, щоб правильно позначити виклик. ps - Jinx! @mniip
Джонатан Ван Матре

1
@JonathanVanMatre для мене формулювання звучить як код-гольф , незважаючи на тай-брейк.
mniip

21
Крім того, мені особливо не подобається правило проти надання допомоги іншим гравцям у вдосконаленні їхньої відповіді. У безсмертних словах Андре-гіганта з "Принцеси нареченої" "Це не дуже спортивно".
Джонатан Ван Матре

1
Це питання так. . . Девід Х. Ахл
Майкл Стерн

Відповіді:


2

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

Гольф:

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: З недавньою зміною правил, яка дозволяє мені використовувати будь-який літеральний рядок для повідомлення "congrats", я можу зберегти 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."!";

Пс. Як альтернатива, якщо просто використання баревок замість рядків для вас здається занадто шахрайським, ось 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.
Кая

Я бив вас старим добрим 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!

Будь ласка, покажіть зразок виходу вашого коду.
Мукул Кумар

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!

Невикористаний код:

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

ви уважно читаєте правила? добре, ви повинні розмістити код без вольфів з одним виходом
Мукул Кумар

@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для того, щоб зберегти 60 символів, потрібно лише 24 символи .
corsiKa

1
Можливо, я помиляюся, але я думаю, що ви можете перенести n++цикл for для переходу до, x=prompt(n++)щоб заощадити, що потрібно робити + ++n+під час остаточного попередження. Це врятувало б 3.
DocMax

7

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

[Оновлено через зміни правил]

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

Загальна оцінка: -76

Гольф:

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

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

Дозволяє ungolf код більше, розшифровуючи всі рядки:

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

Безголівки:

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

Вихід:

Вихідні дані


Де є вихід?
Мукул Кумар

@IlmariKaronen, EDIT2. Крім того, я не просто сприймаю епоху.
Оберон

@ Oberon, будь ласка, опублікуйте також вихід
Мукул Кумар

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

Безголівки:

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

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

-300: Інструкції
-50: Показано кількість витків
-25: Не використовується випадкова функція
-25: попереджає користувача про вихід із діапазону

ЗОЛОЧЕНО

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

НЕЗАЛЕЖЕНО

#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

C, 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!

"TOO HIGH"і "TOO LOW"обидва містять незаконні символи TOLWHIGtolwhig.
Оберон

Як і "Вітаю! Ви знайшли номер!" та "ХочаURong (USayNumbr; ISayBigrOrSmalr)".
Форс

@Fors, але це дозволено (див. EDIT2 ).
Оберон

Справді вони є! Я чомусь пропустив цю редакцію.
Форс

@Oberon Так TOO LOWдозволено також EDIT 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 повертає лічильник. Ще ...
  • 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!

2

JavaScript -40

335 - 300 (правила) - 50 (кількість обертів) - 25 (поза діапазоном)

Я не збираюсь виграти, але цікавий спосіб отримати листи, які я думаю.

Гольф

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

Безумовно

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

1

APL (Діалог) (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!

Безголівки:

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

Так, 4 витка


Кількість символів ґрунтується на коді з усіма пробілами.

Зауважте, що Пого не є фальшивою мовою. Я створив його і написав для нього компілятор та IDE: https://github.com/nrubin29/Pogo


Прочитайте мою редагування та редагування - 2
Мукул Кумар

Оновлено згідно з правками.
нрубін29
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.