Гра «Вгадай число»
Перегляд у форматі PDFНапишіть програму, яка гратиме у гру "Вгадай число": визначатиме загадане суперником ціле число із заданого діапазону на основі запитів до суперника.
У кожному запиті Ваша програма повинна виводити
слово try та одне ціле число,
що трактується як запитання «Загадане число ...?».
Суперник на це відповідає (гарантовано чесно) одне з трьох:
- або, що саме це число й загадане,
- або, що загадане число більше,
- або, що загадане число менше.
Ваша програма повинна продовжувати (або завершити) гру, враховуючи отримані відповіді. Кількість спроб вгадування (неза-лежно від величини проміжку) - до 50 (п'ятдесяти), включно. При перевищенні цього ліміту, Вашій програмі присуджується технічна поразка (вона не отримує балів за відповідний тест).
Тобто, ця задача є інтерактивною: Ваша програма не отримає всіх вхідних даних на початку, а отримуватиме по мірі виконання доуточ-нення, котрі залежатимуть від попередніх дій Вашої програми. Тим не менш, її перевірка теж відбувається автоматично. Тому, у цій Вашій програмі, як і в програмах-розв'язках інших задач, теж слід не «організовувати діалог інтуїтивно зрозумілим чином», а чітко дотримуватися формату. Тільки це формат спілкування з програмою, котра грає роль суперника.
Протокол взаємодії
На початку, один раз, на вхід Вашій програмі подаються записані в один рядок через пропуск (пробіл) два цілі числа ~a~, ~b~ ~(-2\cdot10^9\leqslant a\leqslant b\leqslant 2\cdot10^9)~ — межі проміжку. Це означає, що загадане ціле число гарантовано перебуває в межах ~a \leqslant x \leqslant b~.
На кожному наступному кроці, на вхід Вашій програмі подається рядок, що містить рівно один з трьох символів:
=означає, що останнє виведене Вашою програмою число і є загаданим;+означає, що загадане число більше, ніж виведене Вашою програмою;-означає, що загадане число менше, ніж виведене Вашою програмою.
Поки Ваша програма «не впевнена», яке число загадане,
вона повинна повторювати виведення
в один рядок через пропуск (пробіл або табуляцію)
слова try (маленькими латинськими буквами, без лапок)
та одного цілого числа — чергової спроби вгадування.
Кожне число-спроба повинно бути в межах ~a \leqslant x \leqslant b~ (див. вище).
Наполегливо рекомендується після кожного такого виведення
робити дію flush(output) (Pascal),
вона ж cout.flush() (C++),
вона ж fflush(stdout) (C),
вона ж sys.stdout.flush() (Python),
вона ж System.out.flush() (Java).
Це істотно зменшує ризик,
що проміжна відповідь «застряне» десь по дорозі,
не дійшовши до програми-суперника.
Коли Вашій програмі «стає абсолютно очевидно», яке число загадане,
вона повинна припинити основну частину гри і вивести
в один рядок через пропуск (пробіл або табуляцію)
слово answer (маленькими латинськими буквами, без лапок)
та вгадане число. Після цього слід остат'очно завершити роботу,
не виводячи жодного іншого символа.
Приклад
| Вхід, суперник | Ваша програма |
|---|---|
| 1 100 | |
| try 10 | |
| + | |
| try 20 | |
| - | |
| try 19 | |
| - | |
| try 18 | |
| - | |
| try 17 | |
| = | |
| answer 17 |
Примітки
Програма-суперник з самого початку загадала число 17.
Щоб було видніше, в якому порядку відбуваються введення та виведення, у прикладі використано оформлення таблицею та розділення порожніми рядками. При фактичній перевірці програма-суперник не виводитиме ніяких порожніх рядків і не чекатиме їх від Вашої програми.
Ваша програма не зобов'язана грати за стратегією, що наведена у цьому прикладі. Це лише приклад можливої роботи програми, що успішно завершує конкретно цю гру.
Коментарі