Заочна олiмпiада з iнформатики. Хмельницька область 2002-2003 н.р. Тур 3 16.12.2002 - 26.12.2002 Оргкомітет та журі олімпіади вітають учасників з Новорічними Святами! Бажаємо успіхів у новому, 2003, році. Розв'язки приймаються за адресою popyk@ief.tup.km.ua до 24.00 26.12.02. Копiя листа направляється на адресу tur3@oiuv.infocom.khmelnitskiy.ua Тема листа: TUR3 На перевiрку задач буде вiдведено час 1 секунда на комп'ютері Pentium 166. T3Z1 (25 балiв) Задача 1. Новий Рік в епоху інформатизації. У одній з шкіл міста Olympijsk працює лаборант Олена. Вона мріє, щоб Дід Мороз подарував їй у новорічну ніч великого пухнастого білого ведмедика. Зайшовши на офіційний сайт Діда Мороза у Інтернеті www.moroz.did, Оленка вирішила замовити собі новорічний подарунок через on-line систему бронювання подарунків "Yalynka". Але замість вітання "Happy New Year!" вона помітила незрозумілий рядок літер "pyHNa pYr eaew!". Це результат роботи жахливого вірису "AntiFrost", що був написаний хакером Alex'ом. Попри свою шкідливість, вірус має нескладну логіку, і лише переставляє літери у тексті таким чином: 1) Вірус окремо опрацьовує голосні та приголосні літери. 2) Вірус міняє місцями 1-шу голосну з 2-ою, 3-ю з 4-ою, 5-ту з 6-ою, і т.д. за таким же принципом він міняє місцями і приголосні літери. 3) Вірус змінює лише латинські літери, всі інші символи він залишає незмінними. Голосними літерами вважати (a,o,i,u,y,e) Оленка зберігла спотворений вірусом текст у файл NOVYJRIK.HTM Напишіть програму, яка запише початковий (вірний) текст у файл OLENA.HTM 0<= Розмір файлу NOVYJRIK.HTM <= 60000 байт. У файлі можуть бути присутні рядки, довжина яких перевищуватиме 255 символів. Приклад файлу NOVYJRIK.HTM: pyHNa pYr eaew! З Новим Роком! Відповідний файл OLENA.HTM: Happy New Year! З Новим Роком! T3Z2 (50 балiв) Задача 2. Маленкий програміст Петрик вчиться програмувати на мові "CALC". Ця дивовижна мова програмування дозволяє лише обчислювати арифметичні вирази. Мова CALC має такі особливості: 1) Змінні позначаються великими латинськими літерами (A,B,C,...,Z) 2) Оператор присвоєння має наступний синтаксис: Змінна = вираз 3) Вираз - арифметичний вираз, що містить у собі дужки, числа, змінні та знаки арифметичних операцій + , - , * , / , де ділення відбувається цілочисельно (тобто 7/3 дорівнює 2) 4) Виведення реалізується за допомогою оператора: ? вираз 5) На початку роботи програми всі змінні мають значення 0 У файлі PETRO.CLC записана правильна програма на мові CALC. Напишіть програму, яка виведе у файл PETRO.OUT результат роботи програми PETRO.CLC. Гарантується, що значення усіх змінних, виразів, а також будь-якого підвиразу лежатимуть в межах від -10000 до 10000. Символи пропуску можуть зустрічатися у довільному місті рядка. Довжина рядків у програмі PETRO.CLC не буде перевищувати 100 символів. Програма міститиме не більше 50 рядків. Приклад PETRO.CLC T = 3 Z = 2 ? A ? T K = T*Z + A - 7 ? K ? 3*(5+T) /5 ? (((( 7)))) Z=3 Z=-7+1*(-5)+Z ?Z Результат PETRO.OUT 0 3 -1 4 7 -9 T3Z3 (25 балiв) Задача 3. "Новий Рік не прийде". Подорожуючи до міста Olympijsk з країни Вічних Снігів, Дід Мороз зупинився у одному з готелів невеличкого містечка. У місцевому ресторані він познайомився з ICE'om - видатним гравцем у "Крижинки", який запропонував зіграти Діду Морозу на його подарунки. У випадку програшу Діда Мороза, він програє свою чарівну торбинку з подарунками, без якої свято Нового Року не відбудеться. Знаючи, що Дід Мороз не вміє грати у "Крижинки" ICE запропонував йому вирішити, буде він ходити першим чи другим. Гра відбувається на полі розміру NxN. У першому рядку розташовані крижинки ICE'а, у N-ому крижинки Діда Мороза. На кожному ході гравець обирає свою крижинку та переміщує її вперед на будь-яку кількість вільних клітинок. Програє гравець, що не зможе зробити хід. (3<=N<=1000) Приклад: Початкова позиція при полі 5x5 xxxxx ..... ..... ..... ooooo Можливий хід ICE'а xx.xx ..... ..x.. ..... ooooo Можлива відповідь Діда Мороза xx.xx ..... ..x.. ..o.. oo.oo Можливий хід ICE'а x..xx ..... ..x.. .xo.. oo.oo Напишіть програму, яка буде безпрограшно грати за Діда Мороза. Вказівки для розв'язків на мові Pascal При компіляції вашій програмі буде надано модуль GAME.TPU У цьому модулі буде реалізовано такі функції та процедури: FUNCTION InitGame:integer; PROCEDURE BeginGame(K:integer); PROCEDURE MakeDidMorozMove(C,P:integer); PROCEDURE GetIceMove(var C,P:integer); PROCEDURE EndGame; На початку гри викличте функцію InitGame, яка поверне значення N. Далі ваша програма повинна викликати процедуру BeginGame(K) де K = 1, якщо перший хід буде робити ICE, K = 2, якщо перший хід буде робити Дід Мороз. Далі, при ході Діда Мороза потрібно викликати процедуру MakeDidMorozMove(C,P), де C - номер стовпчика у якому робиться хід, P - кількість клітинок, на яку перемістилась крижинка. При ході ICE'а потрібно викликати процедуру GetIceMove(C,P). Значення C та P такі ж, як і в процедурі MakeDidMorozMove(C,P) У кінці гри (коли жоден з гравців не зможе зробити хід) необхідно викликати процедуру EndGame. Ваша програма може виглядати таким чином: USES Game; ... BEGIN ... N:=InitGame; ... BeginGame(K); ... while... begin ... if flag then MakeDidMorozMove(C,P) else GetIceMove(C,P); ... end; EndGame; END. Вказівки для розв'язків на мові C++ При компіляції вашій програмі буде надано файл GAME.H У цьому модулі буде реалізовано такі функції: int InitGame(); void BeginGame(int K); void MakeDidMorozMove(int C, int P); void GetIceMove(int &C, int &P); void EndGame(); Зміст цих функцій відповідний аналогічним функціям та процедурам з модуля GAME.TPU для роз'язків на мові Pascal. Можливий вигляд вашої програми: #include ... int main() { ... N=InitGame(); ... BeginGame(K); ... while... { ... if(flag) MakeDidMorozMove(C,P); else GetIceMove(C,P); ... } EndGame(); return 0; }