ІІ етап ІОІТ-2017.
Розбір завдань

Прочитати більше

ІІ етап ІОІТ-2017 пройшов з 13 по 19 листопада включно. Матеріали практичного туру подані нижче.

Завдання для 9 класу Завдання для 10-11 класу

П'ятнашки (Word, 9-11 класи)

Завантажити розв'язання

В цьому завданні потрібно було реалізувати інтерфейс гри в п'ятнашки відповідно до наступного зразка:

Звісна річ, якщо йде мова про створення кнопок для керування інтерфейсом, слід було використовувати інструмент Запис макросу. Цей інструмент знаходиться на вкладці Вид в групі Макроси. Також його можна знайти на вкладці Розробник, що за замовчанням прихована, а тому її слід відобразити у параметрах стрічки інструментів Word.

Оскільки ми маємо справу з чотирма елементами керування грою, то й макросів нам потрібно записати чотири, моделюючи рух порожньої комірки в кожен з чотирьох боків.

Один із варіантів розв'язання завдання передбачає використання під час запису заміни за регулярним виразом. Розглянемо його детальніше.

Вхідні дані для нашого макросу - таблиця 4х4, в кожній комірці якої рівно один символ - цифра від 1 до 9 або одна з літер A, B, C, D, E, F, X. Оскільки межі таблиці заважають нам працювати з нашим полем, приберімо їх. Для цього виділяємо весь вміст документу (Ctrl+A), вирізаємо його (Ctrl+X) та вставляємо (Ctrl+V), при цьому обираючи в розкривному меню варіант Зберегти тільки текст:

Після цього ми отримаємо ту ж таблицю, стовпці якої розділені не межею, а знаком табуляції, а рядки - знаком абзацу (на зображенні нижче результат операції поданий з увімкненими недрукованими символами):

Цієї конфігурації вже достатньо для запису руху вліво та вправо. Наприклад, для руху вправо нам слід знайти в документі підрядок, що складається з символа X, табуляції та деякого іншого значущого символа і змінити їх місцями. Це легко зробити за допомогою заміни з увікненими підстановочними знаками:

Вище в рядку пошуку за допомогою дужок ми виділили групу символів, яку можемо використати у виразі для заміни. Для цього ми використовуємо заповнювач - номер відповідної групи зі зворотньою похилою лінією перед ним (\1). Номер групи визначається порядком розміщення відкриваючої дужки цієї групи. В даному випадку вона єдина, тому використано номер 1.

Аналогічно, розташовуючи значущий символ перед символом X, можна здійснити рух вліво.

З рухом вгору та донизу ситуація видається дещо складнішою. Оскільки заміна з увікненими знаками підстановки не дозволяє здійснювати пошук з використанням символу переносу абзацу (цей символ в рядку пошуку просто відсутній в цьому режимі), одразу здійснити заміну, як це було зроблено для руху вліво та вправо, не можна.

Для цього здійснимо заміну знаку абзацу на знак табуляції з вимкненими знаками підстановки:

Після цього ми отримаємо усі значення, розташовані в одному абзаці з розділювачем у вигляді знаку табуляції. Тепер можна здійснити заміну за регулярним виразом. Аби "пересунути" порожню комірку вгору нам достатньо змінити місцями символ X та символ, що знаходиться на 4 позиції раніше:

Для цього вище ми використали вже поділ на 2 групи, тому їх нумерація в рядку заміни теж змінилася. Позицію трьох символів між тими, що міняються місцями, ми не змінюємо, а два символи скраю змінюємо місцями.

Після цього потрібно повернути табличний вигляд нашому абзацу. Слід зауважити, що хоча символ абзацу не можна "шукати" при увімкнених знаках підстановки, здійснювати заміну на нього можна. Тому відповідна команда заміни доволі проста:

Аналогічно, змінюючи місцями символ X та символ, що знаходиться на 4 позиції пізніше, можна здійснити рух донизу.

Нижче подано перелік команд, які потрібно виконати під час запису макросів для кожного з напрямів.

Напрям вправо.

  1. Виділяємо весь вміст документу (Ctrl+A), вирізаємо його (Ctrl+X) та вставляємо (Ctrl+V), при цьому обираючи в розкривному меню варіант Зберегти тільки текст.
  2. Здійснюємо заміну з увікненими знаками підстановки X^t([1-9ABCDEF]) на \1^tX.
  3. Виділяємо весь вміст документу (Ctrl+A), за допомогою інструменту Вставка - Таблиця - Перетворити на таблицю... перетворюємо отриманий текст на таблицю, використовуючи розділювач знак табуляції.

Напрям вліво.

  1. Виділяємо весь вміст документу (Ctrl+A), вирізаємо його (Ctrl+X) та вставляємо (Ctrl+V), при цьому обираючи в розкривному меню варіант Зберегти тільки текст.
  2. Здійснюємо заміну з увікненими знаками підстановки ([1-9ABCDEF])^tX на X^t\1.
  3. Виділяємо весь вміст документу (Ctrl+A), за допомогою інструменту Вставка - Таблиця - Перетворити на таблицю... перетворюємо отриманий текст на таблицю, використовуючи розділювач знак табуляції.

Напрям вгору.

  1. Виділяємо весь вміст документу (Ctrl+A), вирізаємо його (Ctrl+X) та вставляємо (Ctrl+V), при цьому обираючи в розкривному меню варіант Зберегти тільки текст.
  2. Здійснюємо заміну з вимкненими знаками підстановки ^p на ^t.
  3. Здійснюємо заміну з увікненими знаками підстановки ([1-9ABCDEF])(^t[1-9ABCDEF]^t[1-9ABCDEF]^t[1-9ABCDEF]^t)X на X\2\1.
  4. Здійснюємо заміну з увікненими знаками підстановки ([1-9ABCDEFX]^t[1-9ABCDEFX]^t[1-9ABCDEFX]^t[1-9ABCDEFX])^t на \1^p.
  5. Виділяємо весь вміст документу (Ctrl+A), за допомогою інструменту Вставка - Таблиця - Перетворити на таблицю... перетворюємо отриманий текст на таблицю, використовуючи розділювач знак табуляції.

Напрям донизу.

  1. Виділяємо весь вміст документу (Ctrl+A), вирізаємо його (Ctrl+X) та вставляємо (Ctrl+V), при цьому обираючи в розкривному меню варіант Зберегти тільки текст.
  2. Здійснюємо заміну з вимкненими знаками підстановки ^p на ^t.
  3. Здійснюємо заміну з увікненими знаками підстановки X(^t[1-9ABCDEF]^t[1-9ABCDEF]^t[1-9ABCDEF]^t)([1-9ABCDEF]) на \2\1X.
  4. Здійснюємо заміну з увікненими знаками підстановки ([1-9ABCDEFX]^t[1-9ABCDEFX]^t[1-9ABCDEFX]^t[1-9ABCDEFX])^t на \1^p.
  5. Виділяємо весь вміст документу (Ctrl+A), за допомогою інструменту Вставка - Таблиця - Перетворити на таблицю... перетворюємо отриманий текст на таблицю, використовуючи розділювач знак табуляції.

Слід зазначити, що якщо хід в якусь зі сторін зробити неможливо, вказані вище заміни просто не знаходитимуть відповідних підрядків і жодних змін не послідує.

Важливо при створенні макросів обирати поточний документ в якості місця збереження, оскільки інакше макрос зберігається на комп'ютері та з файлом не передається.

Залишилось тільки створити кнопки для наших макросів. Для цього переходимо у меню Налаштування стрічки (в контекстному меню стрічки меню). Обираємо підменю Панель швидкого доступу у списку зліва. У розкривному списку лівої частини обираємо пункт Макроси, а у розкривному списку справа - налаштування для поточного документу. Після цього додаємо подвійним кліком кожен з макросів та за допомогою кнопки Змінити встановлюємо відповідну піктограму:

Сапер (PowerPoint, 9-11 класи)

Завантажити розв'язання

В завданні пропонувалося створити інтерфейс для гри в сапера для однієї вказаної розкладки поля.

Для відтворення поля гри слід було розташувати відповідні квадратики, вирівнюючи їх за допомогою інтелектуальних напрямних, що доступні в PowerPoint за промовчанням, один до одного відповідно до зразка. Після цього слід було внести до прямокутників числа з відповідними кольорами шрифту.

Після цього слід було створити один квадратик із прямокутною градієнтною заливкою, застосувати до нього анімацію виходу Вицвітання та встановити тригер цієї анімації при кліку на цей же квадратик. Далі розмножуємо квадратик на все поле, здійснюючи аналогічне вирівнювання. На цьому етапі кожен квадратик відкриває тільки себе.

Для відтворення кліку на порожню комірку достатньо створити два многокутники відповідно до наступного зразка (або згрупувати аналогічно квадратики під вказаною областю), кожен з яких виконує анімацію виходу для себе, всіх комірок під ними та суміжних з ними:

Після цього слід задати кольору заливки цих многокутників прозорість 100%, оскільки тільки в такому разі буде можливою робота тригера.

Залишилось тільки опрацювати ситуацію "підриву" мін. Аби зробити це якомога простіше, об'єднуємо в групу комірки, під якими знаходяться міни, та накладаємо на них так само об'єднані в групу міни із зміненим в меню Формат - Колір кольором на червоний. Це дозволить значно зменшити кількість анімацій, які потрібно створити.

Тепер достатньо створити анімацію появи групи мін при кліку на групу полів з мінами. Поява напису Ви програли відтворюється аналогічно.

Аби нашу гру завжди можна було почати заново, найпростіше продублювати слайд з кнопкою Заново, для першого слайду встановити в меню Переходи - Зміна слайду зміну слайду через 0 сек, а для кнопки на другому слайді налаштувати дію перехід на перший слайд.

Судоку (Excel, 9-11 класи)

Завантажити розв'язання

В цьому завданні учасникам пропонувалося створити інтерфейс для гри в судоку.

Для повноцінного розв'язання завдання потрібні вміння роботи з циклічними посиланнями.

Додаємо на аркуш два перемикачі і прив'язуємо їх до деякої комірки цього аркуша (в розв'язку - A3). Тепер значення цієї комірки буде рівним 1, якщо обрано перший варіант, та 2, якщо другий.

Для скорочення умов в подальшому ході розв'язання в комірку A1 вмістимо 1, якщо наразі активний режим заповнення умови (A3=1), та 0 в протилежному випадку.

Діапазон комірок Y5:AG13 в нас зберігатиме умову судоку. В режимі A3=1 цей діапазон повністю повторює діапазон поля судоку C5:K13 (заповнюється умова), а в режимі A3=2 залишає своє попереднє значення. Відповідно, перед протягуванням на діапазон Y5:AG13, в комірку Y5 вміщуємо наступну формулу:

=ЕСЛИ($A$1=0;Y5;ЕСЛИ(C5="";"";C5))

Тепер умовне форматування для виділення комірок умови є дуже простим: якщо комірка діапазону Y5:AG13 не порожня, зафарбовуємо відповідну їй комірку діапазону C5:K13 сірою заливкою. Для задання такого форматування виділяємо діапазон C5:K13 та використовуємо інструмент Головна - Умовне форматування - Створити правило - Використати формулу для визначення форматування комірок і задаємо формулу:

Оскільки в формулі адресація є відносною, для кожної комірки ця формула буде зсунутою на відповідну кількість рядків та стовпців від C5. Також можна спочатку задати форматування для комірки C5, а потім протягнути його на решту поля.

Тепер заборонимо змінювати нашу умову в режимі гри. Оскільки заборона супроводжується відповідним повідомленням, виконати це завдання можна виключно за допомогою інструменту Дані - Перевірка даних, попередньо знов-таки виділивши все поле гри. В якості типу даних оберемо інший та введемо логічний вираз для дозволу чи заборони редагування:

Якщо значення комірки Y5 порожнє (тобто C5 - це не комірка умови), то дозволяємо редагування завжди (повертаємо 1, тобто істину). Інакше (тобто C5 - це комірка умови) редагування дозволяється тільки, якщо або A1=1 (тобто режим введення умови), або комірки C5 та Y5 рівні (тобто значення не змінилося). Остання умова (рівність C5 та Y5) не є обов'язковою та додана для можливості вставки розв'язання судоку в наш інтерфейс гри.

Залишається тільки вказати повідомлення помилки. Для цього переходимо на вкладку Повідомлення про помилку того ж інструменту та вводимо значення у відповідні поля:

Тепер перейдемо до перевірки нашого судоку. Розіб'ємо перевірку нашого судоку на три частини: перевірку стовпців, рядків та квадратів 3х3.

У кожній комірці діапазону Y17:AG25 помістимо кількість відповідних чисел з діапазону X17:X25 у кожному зі стовпців нашого судоку:

Для цього у комірку Y17 перед протягуванням помістимо формулу:

=СЧЁТЕСЛИ(C$5:C$13;$X17)

Аналогічно, у кожній комірці діапазону AI5:AQ13 помістимо кількість відповідних чисел з діапазону AI4:AQ4 у кожному із рядків нашого судоку. Для цього у комірку AI5 перед протягуванням помістимо формулу:

=СЧЁТЕСЛИ($C5:$K5;AI$4)

Для побудови такого ж поля для квадратів 3х3 помістимо в комірки O17, P17 та Q17 формули для аналогічних обчислень для трьох квадратів 3х3 першого стовпця, а далі просто протягнемо ці формули на весь діапазон O17:W25. В результаті також отримаємо потрібний зсув відносних посилань. Формула для O17 має наступний вигляд:

=СЧЁТЕСЛИ(C$5:E$7;$N17)

Для зручності занесемо в діапазон C17:K25 для кожної комірки нашого поля номер відповідного їй квадрату відповідно до зразка:

Неважко переконатися, що цей номер позначатиме стовпець щойно створеної таблиці в діапазоні O17:W25 для кількостей чисел в квадратах 3х3.

Отож, ми маємо кількості кожного з чисел від 1 до 9 в кожному з дев'яти рядків, стовпців та квадратів 3х3. Як виглядатиме виграш нашого користувача? Дуже просто: всі значення трьох створених нами таблиць не повинні містити жодного нуля (насправді, навіть усі рівні 1). Відсутність нуля при виграші нам може гарантувати функція И(), тож використаємо саме її. Відповідну формулу виграшу вміщено в комірці X1 розв'язання:

=И(AI5:AQ13;Y17:AG25;O17:W25)

Тепер можна легко задати умовне форматування нашого поля гри у разі виграшу (знов-таки виділяємо все поле гри):

А за допомогою кнопки Формат... задаємо зелений фон та білий шрифт.

Аби комірки умови не забарвлювалися зеленим у разі виграшу найпростіше змінити порядок застосування умовних форматувань: в меню Головна - Умовне форматування - Керування правилами опустіть форматування комірок умови донизу.

Залишається виділити "конфліктні" комірки нашого поля. Маючи значення комірки поля судоку та три таблиці кількостей відповідних чисел у стовпцях, рядках та квадратах 3х3 можна легко заповнити діапазон O5:W13 відповідними прапорцями. Для цього перед протягуванням на весь діапазон вмістимо у комірку O5 формулу:

=И(ИЛИ(СМЕЩ($AH5;0;C5)>1;СМЕЩ(Y$16;C5;0)>1;СМЕЩ($N$16;C5;C17)>1);Y5="")

Тут ми здійснюємо зміщення відносно початку відповідної таблиці (для рядків, стовпців чи квадратів 3х3) на відповідну до вміщеного там числа кількість позицій. Якщо там знаходиться число, що перевищує 1, отже ця комірка з якоюсь конфліктує.

Тепер форматування "конфліктних" комірок поля є очевидним:

Знов-таки за допомогою кнопки Формат... задаємо тепер червоний фон та білий шрифт.

Тепер час розв'язувати судоку! 😊

Інформаційна система "Головоломки" (Access, 10-11 класи)

Завантажити розв'язання

В завданні пропонувалось реалізувати базу даних предметної області «Головоломки», схему якої можна представити у наступному вигляді:

Ця база даних є яскравим прикладом подання ієрахічних залежностях в реляційних базах даних. До таблиці Головоломки вносяться дані про усі головоломки: їх ідентифікатор та назва. А до кожної з решти таблиць - відповідний ідентифікатор та додаткові характеристики, специфічні для того чи іншого типу головоломок.

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

Інформаційна система

Слід було створити головну форму та налаштувати у параметрах поточної бази даних (Файл - Параметри) її відкриття при відкритті бази даних. Також після створення схеми даних вже можна було додати на форму кнопки, які відкривають відповідні таблиці (або запити, форми чи звіти на їх основі - що більше було до вподоби учаснику).

Для коректної роботи кнопки Неусні слід було створити запит, робота якого схожа з запитом 5 практичної частини І етапу. Його можна знов-таки відтворити двома способами:

Спосіб 1. Використання оператора NOT IN.
			SELECT Головоломки.*
			FROM Головоломки
			WHERE Головоломки.Ідентифікатор NOT IN (
			SELECT Усні.Головоломка
			FROM Усні;
			);
		

Спосіб 2. Використання лівого зовнішнього об'єднання (LEFT JOIN).
			SELECT Головоломки.*
			FROM Головоломки LEFT JOIN Усні ON Головоломки.Ідентифікатор = Усні.Головоломка
			WHERE Усні.Головоломка IS NULL;
		

Для відображення результату виконання цього запиту також потрібно було створити відповідну кнопку. Також доволі просто створюються фон форми, вставляється відповідні зображення та напис, на чому детально зупинятися не будемо.

Доміно-пасьянс

В цій частині потрібно було реалізувати інтерфейс для генерування поля гри в доміно-пасьянс за заданим розміщенням кісток доміно.

Таблицю з наданого нам файлу-заготовки в Excel копіюємо та вставляємо в режимі перегляну в нову таблицю Доміно в Access та змінюємо після цього типи полів в режимі конструктора, якщо потрібно.

Після цього створюємо в режимі конструктора в полі Розміщення розкривний список з чотирьох елементів за допомогою Майстра підстановок використовуючи вручну введений список:

Після цього будуємо на основі цієї таблиці форму Декілька елементів (Створення - Інші форми - Декілька елементів).

У цій формі спочатку надаватиметься можливість редагування кісток доміно, а тому, аби заборонити це, скористаємось аркушем властивостей для двох полів доміно та змінимо параметр Увімкнена на Ні:

Після цього колір відповідний полів зміниться, а тому за допомогою вкладки формат панелі інструментів потрібно буде змінити їх заливку, так само як і заливку інших елементів і прибрати їх межі.

Для підсвічування некоретних значень координат слід скористатися інструментом Формат - Умовне форматування:

Правило слід задати відповідно до наступного зразка:

Аналогічним чином задається умовне форматування для другої координати кістки доміно.

Тепер перейдемо до генерування поля нашої гри.

Спочатку знайдемо коректне розміщення кістки доміно відповідно до поля Розміщення за допомогою наступного запиту:

Запит Правильний порядок

			SELECT IIf([Доміно]![Розміщення]=2,[Доміно]![Число2],IIf([Доміно]![Розміщення]=4,[Доміно]![Число2],[Доміно]![Число1])) AS Перше_число, IIf([Доміно]![Розміщення]=2,[Доміно]![Число1],IIf([Доміно]![Розміщення]=4,[Доміно]![Число1],[Доміно]![Число2])) AS Друге_число, Доміно.x, Доміно.y, Доміно.Розміщення
			FROM Доміно;
		

Вище, якщо розміщення "знизу догори" або "справа наліво" (номери 2 та 4, відповідно), ми змінюємо місцями числа в кістах доміно, інакше залишаємо їх на своїх місцях.

Тепер знайдемо координати лівих верхніх кутів кісток доміно та значення у відповідних комірках (це значення зараз в полі Число1 вищезгаданого запиту; результат запиту - число та позиція верхньої/лівої частини кістки доміно):

Запит Заповнені перші числа

			SELECT [Правильний порядок].Перше_число, [Правильний порядок].x, [Правильний порядок].y
			FROM [Правильний порядок];
		

Для того, щоб знайти координати іншої частини нашої кістки доміно, потрібен дещо складніший запит (результат запиту - число та позиція нижньої/правої частини кістки доміно):

Запит Заповнені другі числа

			SELECT [Правильний порядок].Друге_число, IIf([Розміщення]<=2,[x]+1,[x]) AS x_new, IIf([Розміщення]>=2,[y],[y]+1) AS y_new
			FROM [Правильний порядок];
		

Вище, якщо розміщення вертикальне (номери 1 та 2), то друга (нижня) частина матиме координату x на одиницю більшу, а координату y таку ж, що і у верхньої частини, а якщо розміщення горизонтальне (номери 3 та 4), то права частина матиме координату y на одиницю більшу, а координату x таку ж, що і у лівої частини.

Тепер об'єднаємо результат двох попередніх запитів:

Запит Заповнені другі числа

			(SELECT [Правильний порядок].Перше_число AS Число, [Правильний порядок].x, [Правильний порядок].y
			FROM [Правильний порядок])
			UNION (SELECT [Правильний порядок].Друге_число, IIf([Розміщення]<=2,[x]+1,[x]) AS x_new, IIf([Розміщення]>=2,[y],[y]+1) AS y_new
			FROM [Правильний порядок]);
		

Тепер ми отримали запит, в якому для кожної координати нашої сітки гри ми маємо число, яке в цій комірці розташоване. Тепер за допомогою перехресного запиту створимо нашу сітку:

Умови того, що координати належать до відповідних діапазонів дозволяють приховати некоретно розташовані кістки доміно. Пропонуємо вам поекпериментувати та прибрати ці умови і познайомитися з результатом цього запиту.

Після створення перехресного запиту будуємо на його основі форму Декілька елементів та форматуємо її аналогічно:

Залишається тільки створити кнопку для відкриття створеної вище розкладки і система готова.