Правила створення задач | Статті

Процес додавання задач у платформу Алготестер

  1. У правому верхньому куті сайту відкрийте вкладку «Задачі (Автор)». У цій секції відображаються всі створені Вами задачі, а також ті задачі, автор яких вказав Вас помічником. Також Ви побачите 5 кнопок: «Створити», «Видалити», «Змінити порядок», «Перетестувати» та «Надіслати».

  2. Натисніть кнопку «Створити». Ви побачите вкладку зі створення задачі. Необхідно зразу вказати 4 обов’язкові поля для створення задачі: «Назва», «Час (сек.)», «Пам’ять (МіБ)» та «Вивід (МіБ)». У полі «Назва» вкажіть назву задачі. Вимоги до назви:

    • Не використовуйте спеціальні символи ($&*%)

    • Назва не повинна бути довгою (не більше семи слів)

    • Назва повинна бути унікальною. У архіві не повинно бути задач з такою назвою.

    Зауважте, що в умові задачі буде та назва, яку Ви вкажете при створенні умови. У полі «Час (сек.)» введіть максимальний час виконання одного тесту у секундах. Стандартне обмеження на час 2 секунди. Обмеження на час повинно бути до 7 секунд.

    У полі «Пам’ять (МіБ)» введіть обмеження на використання оперативної пам’яті для одного тесту. Стандартне обмеження на пам’ять 256 Мебібайт. Обмеження на пам’ять повинно бути від 128 Мебібайт до 1024 Мебібайт. Обмеження на пам’ять повинно бути степенем двійки.

    Якщо обмеження на час або пам’ять є меншими за стандартні, то переконайтеся що задача розв’язна на Python та Java.

    У полі «Вивід (МіБ)» введіть максимальний розмір виводу програми на одному тесті. Стандартне значення виводу 1 Мебібайт.

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

    Всі інші поля можна буде заповнити пізніше.

    Після створення задачі Ви повернетеся до вкладки «Задачі (Автор)». Там буде новостворена вами задача. Натиснувши на назву задачі, Ви перейдете на сторінку налаштувань.

  3. На сторінці налаштування задачі Ви побачите 9 вкладок:

    • У домашній вкладці (позначається хаткою) Ви можете змінювати обмеження на час та пам’ять, змінювати назву, вибирати першоджерела та ін. Після написання першоджерел, необхідно вибрати їх у цій вкладці. Достовірник (checker) до задачі, можна вибрати одразу.

    • У вкладці «Помічники» Ви можете додавати помічників до задачі. Ви можете вибрати помічника та присвоїти йому роль яку він буде виконувати при підготовці цієї задачі.

    • У вкладці «Умови» Ви можете створювати умови українською та англійською мовами. Детальніше про створення умов читайте в пункті «Умови».

    • У вкладці «Ресурси» Ви можете додавати ресурси до задачі, наприклад картинки до умови.

    • У вкладці «Першоджерела» Ви можете створювати генератори (generator), перевірники (validator), достовірники (checker), оцінювачі (scorer) та розв’язки. Детальніше про кожен тип Ви зможете прочитати у відповідному пункті наступного розділу.

    • У вкладці «Тести» Ви можете створювати ручні тести, створювати тести за допомогою генератора або додавати архіви тестів. При створенні тестів вам необхідно вказати їхню назву, вартість та самі тести (в разі створення ручних тестів), або параметри генератора. Якщо Ви хочете зробити цей тест прикладом, який буде відображений в умові, то Вам потрібно поставити прапорець у чекбоксі «приклад». Детальніше про створення тестів генератором читайте у розділі генератор. Детальніше про вартість тестів читайте в пункті «Оцінювач».

    • У вкладці «Мітки» Ви можете вказувати мітки до задачі.

    • У вкладці «Результат», після надсилання задачі, Ви можете переглядати створені вами тести, та результат роботи вашого розв’язку.

    • У вкладці «Розв’язки користувачів» Ви можете переглядати всі розв’язки інших користувачів.

    Справа від вкладок будуть 2 кнопки: «Змінити» та «Надіслати».

Етапи створення задач

  1. Умова

    Першим кроком створення задачі є створення умови. Умова є обов’язковою частиною задачі. У вкладці «Умова» Ви побачите три кнопки: «Створити», «Видалити» та «Надіслати». Щоб створити умову натисніть на кнопку «Створити».

    Умова — дуже важлива частина задачі, де Ви повинні доступно пояснити суть задачі. Умови на Алготестері пишуть мовою розмітки даних LaTeX. При створенні умови Ви побачите 6 вкладок:

    • У домашній вкладці (позначається хаткою) Ви можете вибрати мову та змінювати назву задачі.

    • У вкладці «Опис» Ви повинні описати суть задачі, розказати що дано, пояснити що потрібно зробити користувачеві, щоб її здати.

    • У вкладці «Вхідні дані» Ви повинні описати які дані користувач отримає та в якому порядку та форматі їх задано.

    • У вкладці «Вихідні дані» Ви повинні описати яку відповідь очікуєте від користувача та у якому форматі він має її вивести.

    • У вкладці «Обмеження» Ви повинні дати обмеження на всі вхідні дані. Якщо в умові ви гарантували якісь спеціальні обмеження, наприклад відсутність петель чи мультиребер у графі, їх варто згадати й тут.

    • У вкладці «Примітки» Ви можете пояснити приклади, написати важливе зауваження, яке може бути не очевидним в описі, або ж уточнити деталі які допоможуть користувачеві зрозуміти що саме йому потрібно зробити.

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

  2. Розв’язок

    Наступним кроком є написання розв’язку до задачі. Розв’язок задачі — це вихідний код, який система буде компілювати та виконувати на наборі тестів, для звірення відповіді з відповідями учасників. У задачі повинен бути один основний розв’язок. Розв’язок повинен зчитувати вхідні дані у форматі, описаному в умові. Вказати основний розв’язок для задачі можна на домашній вкладці (позначається хаткою). Рекомендуємо, щоб кожна задача мала ще й інші розв’язки, написані тестерами, аби уникнути помилок в основному.

  3. Ознайомлення з бібліотеками

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

  4. Перевірник

    Наступною обов’язковою складовою задачі є перевірник. Перевірник (Validator) — програма яка зчитує один тест і перевіряє чи він відповідає формату й обмеженням, що зазначені в умові. Використовуйте нашу бібліотеку при написанні перевірників до задач. Перевірник зчитує вхідні дані зі стандартного потоку вводу (STDIN), та виводить у стандартний потік виводу(STDOUT). Якщо перевірник виявляє некоректний тест, то він повинен вивести короткий текст-пояснення помилки та повернути 0. Тест вважається коректним якщо перевірник нічого не вивів і повернув 0. Перевірники повинні перевіряти не лише обмеження на розмір вхідних даних, елементів масиву, а й зв’язність графа, відсутність циклів у ньому чи будь-які інші гарантовані умови й обмеження. У задачі повинен бути один основний перевірник. Вказати основний перевірник для задачі потрібно на домашній вкладці (позначається хаткою). Ось декілька прикладів перевірників: перевірник до задачі A плюс B, перевірник до задачі Марічка і печиво, перевірник до задачі Коля, Вася і лабіринт.

  5. Звичайний достовірник

    Останнім обов’язковим пунктом створення задач є достовірник. Достовірник (Checker) — програма яка перевіряє правильність відповіді. Якщо відповідь до задачі однозначна — то для цього існує Token Checker. Якщо ж потрібно перевірити відповідь у дійсних числах, використовуйте Double Checker з потрібною для вас точністю. Якщо до задачі немає єдиної відповіді, то потрібно написати достовірник самостійно. Використовуйте нашу бібліотеку при написанні достовірників до задач. Використовуйте функцію «initChecker». Вона повертає масив з трьох елементів: читач тестових даних, читач виводу користувача та читач виводу авторського розв’язку. Якщо відповідь користувача є неправильною, то достовірник повинен вивести помилку та повернути 0. Відповідь вважається правильною якщо достовірник нічого не вивів і повернув 0. Достовірник приймає 4 параметри: шляхи до файлів з вхідними даними, виводом користувача, авторським виводом, кодом користувача. У задачі повинен бути один основний достовірник. Вказати основний достовірник для задачі можна на домашній вкладці(позначається хаткою). Ось декілька прикладів достовірників: Token Checker, Double Checker 1e-4, достовірник до задачі Подвоєна сума квадратів, достовірник до задачі Марічка і смачні цукерки.

  6. Тести

    На цьому етапі ваша задача вже має всі необхідні компоненти. Ви можете повернутися до домашньої вкладки (позначається хаткою), вибрати всі першоджерела до задачі та надіслати її. Якщо Ви все зробили правильно, то задача отримає статус «Успішно завершено».

    Попри те, що задача збудувалася, в ній поки немає тестів. Тести — це набори вхідних даних, на яких будуть перевірятися розв’язки користувачів. Є три способи додати тест до задачі:

    • Створити ручний тест. Ручний тест — це тест, який задається вручну. Такі тести можна роботи прикладами, які відображатимуться в умові.

    • Написати генератор тестів (детальніше в наступному пункті).

    • Додати архівні тести. Щоб додати архівні тести, потрібно надіслати архів у форматі Zip, та вказати розширення вхідних та вихідних файлів. Всі файли зі вхідними та вихідними даними повинні мати відповідні розширення до тих, які Ви вказали. Файли з вхідними та вихідними даними, які стосуються одного тесту повинні мати однакову назву.

  7. Генератор

    Генератор — програма яка дозволяє автоматизувати процес генерації тестів. Використовуйте нашу бібліотеку при написанні генераторів до задач. Генератору можна передавати параметри, наприклад максимальний розмір тесту чи обмеження параметрів задачі. Першим параметром (з індексом 1) завжди передається номер тесту. Наступні параметри Ви повинні вказати самостійно. Останнім параметром ви можете додати міш. Це випадково згенерований рядок. Його потрібно додавати, щоб неможливо було відновити тести, маючи код генератора. Генератор псевдовипадкових чисел ініціалізовується від усіх параметрів. Генератор повинен виводити результат у стандартний потік виводу(STDOUT).

    Ось декілька прикладів генераторів: генератор до задачі A плюс B, генератор до задачі Марічка і печиво.

    В однієї задачі може бути декілька генераторів, які генерують різні типи вхідних даних. Ось один приклад та інший приклад генератора до задачі Максим, Петро й Богдан. Перший генератор формує випадковий зв’язний граф, а другий граф зірку заданого розміру. Оскільки це 2 різні типи графів, то довелося використати більш ніж 1 генератор.

  8. Надсилання задачі

    Після написання всіх першоджерел і додавання тестів задачу потрібно надіслати. Щоб надіслати задачу натисніть на кнопку «Надіслати», що знаходиться справа від вкладок налаштування задачі. Після надсилання задачі відбудеться наступне:

    • Сформуються тести. Генератор (Generator) згенерує тести, і разом з ручними та архівними тестами, сформується набір тестів.

    • Перевірник (Validator) перевірить тести на коректність.

    • Розв’язок (Solution) запуститься на наборі тестів, і будуть сформовані авторські відповіді.

    Якщо на будь-якому з цих етапів виникне помилка, то задача отримає статус Містить помилки, і у вкладці «Результат» буде вказано що саме пішло не так. У іншому випадку у задачі буде статус Успішно завершено. Якщо у задачі є статус Успішно завершено, то Ви зможете побачити тести у вкладці «Результат».

  9. Інтерактивний достовірник

    Інтерактивний достовірник — це достовірник для інтерактивних задач. Використовуйте функцію «initInteractiveChecker». Вона повертає масив з трьох елементів: читач тестових даних, потік вводу користувача (Вам потрібно писати вхідну інформацію в цей потік) та читач виводу користувача (зчитуйте відповіді користувача з нього).

    Генератор та перевірник до інтерактивних задач повинні генерувати та перевіряти лише вхідні дані для достовірника, але не для розв’язків задачі. Розв’язки задачі взаємодіють лише з інтерактивним достовірником. Зауважте, інтерактивний достовірник відповідає не лише за перевірку правильності розв’язку, а й за надання користувачеві вхідної інформації. Ось приклад інтерактивного достовірника до задачі Інтерактивне число. Приклади перевірника та генератора до неї: перевірник до задачі та генератор до задачі.

  10. Оцінювачі та вартість тестів

    Якщо для задачі Ви хочете також враховувати частково правильні розв’язки, то ви можете нараховувати бали за них. Тоді користувач зможе набрати певну частину балів за задачу, якщо не придумав достатньо швидкий чи абсолютно правильний розв’язок. Найпростіший спосіб це зробити поставивши кожній групі тестів певну вартість. Бали за групу тестів користувач отримає лише якщо його розв’язок буде правильним для всіх тестів з групи.

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

    • Файл з вхідними даними.

    • Вивід користувача.

    • Вивід автора.

    • Тека з обробленими файлами коду (файли STDIN, STDOUT, STDERR, виконуваний файл користувача).

    • Тека для писання. Це тека для внутрішнього використання оцінювачем. Вона буде очищена між тестами.

    • Код користувача.

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

  11. Логи виконання тестів

    Щоб побачити результат розв’язку на одному конкретному тесті необхідно:

    • У вкладці «Першоджерела» для відповідного розв’язку натиснути на «Перегляд», що знаходиться в найправішій колонці «Дії».

    • Перейти на вкладку «Результат» і подивитися логи відповідного тесту.

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