Головна/Завдання/Частина 4/Провокатор
Доповнення 2: рівні провокатора
Доповнення до документа оцінювання, розділ 8.4. Номер 2, дата , підписав головний рефері. Діє від фінальної здачі. Розкриває те, що оцінювання назвало доповненням: параметри трьох рівнів і команду локального прогону.
Провід, повернення за печаткою і лічильники кривизни описано в частині 2 (part2/04-protocol.md, розділи 8 і 9); тут - тільки рівні.
1Як рахується бал
Після фінальної здачі ваш бот грає по пакету на кожному з трьох рівнів: три пакети, дев'ять партій. Рівень пройдено - 2 бали, усього 6 (scoring.md, 8.1, 8.4).
Рівень пройдено, якщо в його пакеті:
- немає жодної аномалії проводу (
scoring.md, 8.3): кадр не за схемою від того, хто присягнув, другийhelloна тому самому сокеті, відповідь із номером такту, який боту не надсилався, крива печатка повернення при живій сесії; - бот не пропустив жодного такту, крім тактів самого обриву і тактів після зупинки процесу;
- після кожної зупинки процесу бот присягнув у наступній партії пакета.
Пропущений такт рахує вузол, і рахує він одне: кадр спостереження пішов, а відповіді до дедлайну не було. Порожній кадр команд пропуском НЕ вважається, і епізод грамоти - теж: бот, якому нічого сказати шість тактів поспіль, віддає слот грамоті за правилами світу (правила 23.2), але такту не пропускав. Дозволено пропустити по шість тактів на кожен обрив і всі такти від зупинки процесу до кінця партії; більше - рівень не пройдено.
Пакети провокатора йдуть окремо від турнірних: часток не дають, у таблиці не входять і в К1 не рахуються.
2Рівень 1: дублі й часті ротації
| Ручка | Значення |
|---|---|
| Дубль кадру спостереження | кожен 7-й кадр слота йде двічі |
| Планова ротація сесії | кожні 20 с замість канонних 90 |
| Грейс ротації | 2000 мс, як у канонному темпі |
| Кільце вихідних | 240 тактів, як завжди |
Дубль - законне перенадсилання: його не відрізнити від наздоганяння з кільця після повернення. Клієнт із дедуплікацією за номером конверта його не помічає; клієнт без неї годує бота другим примірником такту і ламає собі картину світу. Ротація з грейсом коштує нуля тактів, якщо повертатися одразу за повідомленням, не чекаючи закриття сокета.
3Рівень 2: обриви з поверненням
Усі ручки рівня 1 плюс:
| Ручка | Значення |
|---|---|
| Позапланові обриви | 3 за партію, сокет рветься без прощального коду |
| Коли | такти вибираються жеребом у вікні від 100-го до 1100-го, не ближче за 50 тактів одне до одного |
| Повернення | за печаткою повернення, як завжди: hello з resume і номером останнього конверта |
Вузол причин обриву не розрізняє: процедура та сама, що при плановій ротації. Такти, чиї дедлайни минули до повернення, - мовчання; вони припустимі рівно на час обриву, і це "рівно" машинне: шість тактів на обрив, стільки ж, скільки світ дає грамоті терпіти мовчання. Повернення за сповіщенням коштує нуля тактів, повернення за печаткою після розриву - одного-двох; шість - запас, а не норма. Бот, який після обриву відкриває нову сесію замість повернення за печаткою, дістає аномалію.
4Рівень 3: зупинка процесу
Усі ручки рівня 2 плюс:
| Ручка | Значення |
|---|---|
| Зупинка | одна зупинка голови в першій партії пакета і одна в другій |
| Як | сигнал SIGKILL контейнеру голови посеред партії |
| Коли | такт вибирається жеребом у вікні від 300-го до 900-го |
| Третя партія | без зупинок: у ній видно, чи повернувся бот до нормальної гри |
Печатка повернення вмирає разом із процесом: hello без печатки посеред партії закривається кодом 4006, і до кінця партії слот веде ваша грамота (part2/04-protocol.md, 8.5). Це не аномалія і не провал рівня - так влаштовано світ.
Перед наступною партією пакета машина відкочується до знімка і стек піднімається заново, як перед кожним прогоном (02-build.md, розділ 7). Провал рівня - не присягнути в цій наступній партії: бот, якому для присяги потрібне те, що лишилося на диску від минулої партії, рівень не проходить.
Звідси правило здачі: усе, що боту потрібне в бою, мусить підніматися з репозиторію (02-build.md, розділ 1). Ручного лагодження під час партії не існує.
5Прогін у себе
npx zaria-kit pack --provoke 2 # пакет під рівнем 2
npx zaria-kit pack --provoke 3 --seed 77 # свій жереб тактівПрапорець --provoke N ставить ті самі ручки, що в нас, на локальний вузол (part2/06-local-pack.md). Решта прапорців команди працюють як завжди; жереб тактів росте з --seed, тому тут він ваш. Наприкінці команда друкує жереб, лічильники кривизни і пропущені такти по партіях - те саме, що ми читаємо в заліковому прогоні:
рівень 2: обриви по партіях - 214, 588, 903 | 137, 402, 950 | 301, 658, 1090
кривизна: сміття 0, фантом 0, криве повернення 0
пропущено тактів по партіях (із дозволених): 0/18 | 0/18 | 0/18
рівень 2 пройденоЧесний клієнт тримає нулі: повернення за сповіщенням про ротацію не коштує йому тактів, а повернення за печаткою після обриву вкладається в один-два. Рівень 3 зупиняє ПРОЦЕС вашого бота, тому йому потрібен --bot КОМАНДА: грамоту і ручний слот убивати нічим.
6Що відкрито і що закрито
Відкриті всі ручки: частоти, числа обривів і зупинок, вікна тактів, правила підрахунку аномалій і сама команда. Закритий жереб залікового прогону - конкретні такти обривів і зупинок оголошуються у звіті після прогону.
Межа та сама, що в тестів і аналізатора (scoring.md, 8.8): лагодити провід під відомі частоти - це і є поліпшення; знати точний такт обриву - значить пережити його заготовкою, не вміючи переживати обриви взагалі.