ЗОРЯ

Головна/Завдання/Частина 4/Провокатор

Доповнення 2: рівні провокатора

Доповнення до документа оцінювання, розділ 8.4. Номер 2, дата , підписав головний рефері. Діє від фінальної здачі. Розкриває те, що оцінювання назвало доповненням: параметри трьох рівнів і команду локального прогону.

опубліковано 21.09

Провід, повернення за печаткою і лічильники кривизни описано в частині 2 (part2/04-protocol.md, розділи 8 і 9); тут - тільки рівні.

1Як рахується бал

1.1

Після фінальної здачі ваш бот грає по пакету на кожному з трьох рівнів: три пакети, дев'ять партій. Рівень пройдено - 2 бали, усього 6 (scoring.md, 8.1, 8.4).

1.2

Рівень пройдено, якщо в його пакеті:

  • немає жодної аномалії проводу (scoring.md, 8.3): кадр не за схемою від того, хто присягнув, другий hello на тому самому сокеті, відповідь із номером такту, який боту не надсилався, крива печатка повернення при живій сесії;
  • бот не пропустив жодного такту, крім тактів самого обриву і тактів після зупинки процесу;
  • після кожної зупинки процесу бот присягнув у наступній партії пакета.

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

1.3

Пакети провокатора йдуть окремо від турнірних: часток не дають, у таблиці не входять і в К1 не рахуються.

2Рівень 1: дублі й часті ротації

РучкаЗначення
Дубль кадру спостереженнякожен 7-й кадр слота йде двічі
Планова ротація сесіїкожні 20 с замість канонних 90
Грейс ротації2000 мс, як у канонному темпі
Кільце вихідних240 тактів, як завжди

Дубль - законне перенадсилання: його не відрізнити від наздоганяння з кільця після повернення. Клієнт із дедуплікацією за номером конверта його не помічає; клієнт без неї годує бота другим примірником такту і ламає собі картину світу. Ротація з грейсом коштує нуля тактів, якщо повертатися одразу за повідомленням, не чекаючи закриття сокета.

3Рівень 2: обриви з поверненням

Усі ручки рівня 1 плюс:

РучкаЗначення
Позапланові обриви3 за партію, сокет рветься без прощального коду
Колитакти вибираються жеребом у вікні від 100-го до 1100-го, не ближче за 50 тактів одне до одного
Поверненняза печаткою повернення, як завжди: hello з resume і номером останнього конверта

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

4Рівень 3: зупинка процесу

Усі ручки рівня 2 плюс:

РучкаЗначення
Зупинкаодна зупинка голови в першій партії пакета і одна в другій
Яксигнал SIGKILL контейнеру голови посеред партії
Колитакт вибирається жеребом у вікні від 300-го до 900-го
Третя партіябез зупинок: у ній видно, чи повернувся бот до нормальної гри
4.1

Печатка повернення вмирає разом із процесом: hello без печатки посеред партії закривається кодом 4006, і до кінця партії слот веде ваша грамота (part2/04-protocol.md, 8.5). Це не аномалія і не провал рівня - так влаштовано світ.

4.2

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

4.3

Звідси правило здачі: усе, що боту потрібне в бою, мусить підніматися з репозиторію (02-build.md, розділ 1). Ручного лагодження під час партії не існує.

5Прогін у себе

shell
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): лагодити провід під відомі частоти - це і є поліпшення; знати точний такт обриву - значить пережити його заготовкою, не вміючи переживати обриви взагалі.