Chat:Ru/2021-03-04
MadKnight: samrrr зачем на работу
MadKnight: wlesavo к успеху пришёл
YurkovAS: добавил блокеру в оценку уменьшение угла к раннеру противника и бот стал побеждать 12 раз нейронок, до этого было только 4
amurushkin: у меня такое всегда было но нейронок побеждать не хочет ))
YurkovAS: только по особому, макс 90 градусов, т.е. это худжий результат. иначе он либо смотрит на него, либо развернут от него
YurkovAS: 2 раза прогонял и результат одинаковый против нейронок. ну оно ни чего не дает, вроде
YurkovAS: у меня до этого небыло угла, экспериментировал с ним давно и толку небыло. а сейчас вдруг показывает прирост
Uljahn: на первой глубине сколько углов за себя рассматриваете? 0 и +/-18?
Uljahn: думаю, нейронки можно переиграть только за счёт более интеллектуального анализа карты и более гибкого переключения командных стратегий, т.е. горизонт планирования должен быть достаточно глубоким, чтобы нейронки не доставали
Uljahn: плюс увеличение факторов неопределённости - кроме использования щитов есть буст, его лучше не тратить, мне кажется
Uljahn: другоё фактор - контролируемые коллизии между своим раннером и блокером, их результат трудно предсказать
Uljahn: *другой
Uljahn: можно ещё использовать ошибку округления угла из инпутов, чтобы проезжать по самой кромке чека (нейронка может не задетектить), но нужен идеальный движок
YurkovAS: 0 и +/-18 - да, почти. кроме 0 и 0.
YurkovAS: ошибку округления угла - ну в принцепе же реально определить точный ход противника перебором
Uljahn: угол противника дают округлённый в инпутах, максимальная ошибка полградуса, свой угол можно трекать точно, он задаётся первым ходом
YurkovAS: глубина, точно, добавляется глубина 8 только с одним ходов по инерции. а 7-я глубина уже с множетсвом ходов. и вот без этого 8-го хода нейронок вообще раньше не выигрывал
Uljahn: ну и часто радиус чека уменьшают для уменьшения ложных срабатываний
Uljahn: в быстрых (не идеально точных) движках
YurkovAS: радиус чека да, очень влияет по локальным замерам, у меня вот такой 598
YurkovAS: реально же он 600, значит у меня не точный двиг, появялется много лишних срабатываний и играет из-за этого хуже...
YurkovAS: официального рефери же нет
YurkovAS: и в коллизиях погрешность (0.00001) постоянно добавляется
Uljahn: погрешность вроде может даже из-за другого порядка операций образовываться, т.е. сначала умножить, потом поделить или наоборот
Uljahn: с рефери бы было проще, это точно
YurkovAS: и погрешность с углом: при коллизиях он не меняется, а в симе мы устанавливаем точное целое число.
YurkovAS: но угол может поменяться, из-за передаваемых координат к рефери, т.к. там х, у
Uljahn: можно для первого хода противника использовать +18.5 и -18.5, чтобы наверняка
YurkovAS: думаешь, можно использовать и 18.9?
YurkovAS: т.е. первые ходы сделать именно такими и свои тоже, а дальше оставить 18.0
YurkovAS: такая же идея?
Uljahn: а, ну да, когда переводим угол в вектор, домножаем на большое число, чтобы получить нужные координаты x, y, то можно брать несколько больших чисел, и выбирать с минимальной ошибкой обратного преобразования
Uljahn: 18.5
YurkovAS: и для себя тоже 18.5?
Uljahn: нет, для себя-то ты точно знаешь угол
YurkovAS: и ты думаешь он именно повернет на все 18.5?
YurkovAS: я просто не понял, зачем это
Uljahn: нет, но это гарантированно покроет неточность инфы об угле противника
Uljahn: т.е. худший случай
Uljahn: это в комплексе с радиусом чека надо делать
Uljahn: т.е. уменьшение радиуса как раз компенсирует эту неточность
YurkovAS: т.е. там может быть неточный угол для противника, дробный. поэтому нам надо его самим определить
YurkovAS: так и нам можно юзать половинные углы - что будет так же ломать расчеты противнику
Uljahn: хм, если противник тремя углами оперирует, то можно постепенно вычислить начальный угол
YurkovAS: и радиус тогда потом поставить 600?
Uljahn: угу
YurkovAS: теперь понял. спасибо!
YurkovAS: ну надо будет поэкспериментировать
YurkovAS: а против своего бота если буду, у меня же целые углы отправляет всегда то тут наверное надо самому тоже начать отправлять нецелые углы? иначе не замечу прироста
YurkovAS: и получается, это нейронки могут такое делать - дробные углы?
YurkovAS: т.е. у остальных ботов всех целые углы юзаются
Uljahn: как я понял, нейронки используют для оценки состояний в минимаксе, а как дробить ходы для перебора - это к нейронкам не относится
Uljahn: т.е. надо реплеи анализировать
YurkovAS: а, ну да, вычислить их глы между двумя ходами
YurkovAS: т.е. может даже сначала посмотреть реплеи, и только потом это делать, если юзают
Uljahn: угу
YurkovAS: есть такая опти search race - очень похожая на ксб, скопировал туда двиг, а он плохо играл. пока не установил такой же радиус чекпоинта и потом вообще все с рефери скопировал и стало заметно лучше
YurkovAS: всмысле, что, если сделать точнее двиг, это может заметно улучшить тоже
Uljahn: тут компромис между точностью и скоростью: когда нужно больше сим (больше глубины), то точностью можно пожертвовать, но тогда иногда будут происходить факапы
YurkovAS: и там не добавляется погрешность, а в ксб добавляется. а если ее убрать, то зацикливается
Uljahn: я просто думаю, что вручную крутить оценочную - гиблое дело, нейронки с этим справляются намного лучше
Uljahn: но и у нейронок есть недостатки
YurkovAS: нейронки это сложно, я точно не осилю. да и книгу дебютов. так-то комп есть, можно оставить и предрасчитать в оффлайне
Uljahn: дял крестиков?
Uljahn: *для
YurkovAS: да вообще, и для других мульти
YurkovAS: вчера видел скрин смитса, у него книги запещены для штук 5 мульти. как я понял он купил новый комп и сейчас все пересчитывает...
Uljahn: например, если в крестиках переиспользуешь дерево, то книгу прикрутить просто - предрассчитанную часть дерева из офлайна скопировать прямо в код
YurkovAS: да и нейронки примерно так же, часто тут юзаются, в 5 мульти точно
YurkovAS: да я вообще не понимаю что за книга и как ее даже предрасчитать...
YurkovAS: мета мктс вроде нужен
YurkovAS: типа для текущего состояния какой лучше ход
Uljahn: это более точный подход, но можно проще на первом этапе
YurkovAS: и так для первых 20 ходов
Uljahn: ты же всё равно дерево строишь в мктс
YurkovAS: да
Uljahn: идея в том, чтобы строить в офлайне, а онлайн начинать строить не с нуля, а с того стейта, до которого досчитал офлайн
Uljahn: т.е. часть дерева со статистиками скопировать
Uljahn: т.е. допустим, дерево до глубины 10 для начала, или обрезать, пока не влезет в код
YurkovAS: ну наверное не один в один
YurkovAS: там же будут огромные числа визитов и скоры
Uljahn: нормализовать можно
Uljahn: скоры можно +/- 1 использовать
Uljahn: с другой константой
YurkovAS: визитов всеравно будет очень много
YurkovAS: а мета мктс тут зачем?
YurkovAS: он же запускаем сам себя, вроде
Uljahn: чтобы считать дерево по частям, а то в память не влезет
YurkovAS: не понял
Uljahn: начинаем строить дерево, пока есть память, потом выгружаем на диск, и начинаем подгружать ветки и досчитывать
Uljahn: вроде так
Uljahn: т.е. есть мктс верхнего уровня, там глобальные статистики варантов, а для решения отдельных веток используются мктс нижнего уровня
Uljahn: поэтому мета-мктс
Uljahn: ну и словер там пригодится
Uljahn: *солвер
YurkovAS: солвер вроде освоил, как понял
YurkovAS: https://www.codingame.com/playgrounds/46262/on-generating-opening-book-for-yavalath-mcts-bot
YurkovAS: читал давно, надо освежить
YurkovAS: он там пишет про мета мктс
YurkovAS: ладно, оставим это
YurkovAS: и ксб тоже. по плану пусть будет попроще - альфа-бета, зобрист и ТТ.
YurkovAS: это уж точно может пригодиться в каком новом конкурсе
YurkovAS: спасибо за помощь. я по книжкам не понимаю, еще и на английском. мне проще, когда как-то абстрактно хоть объяснят "куда коней запрягать"
Uljahn: да мне только и остаётся, что абстрактно объяснять, на питоне особо не посимулируешь
Uljahn: хоть какая-то от меня польза :)
YurkovAS: питон да. ну на самом деле, научиться писать на с++ с тиле "си с классами" не так сложно. это же как в универе учили. ide нормальные для него есть.
YurkovAS: и дебагером локально в иде сможешь пользоваться, на крайняк, там только "O0" сделать в прагмах
Uljahn: это надо кухню разворачивать, студию качать с компиляторами, в версиях разбираться - для моих практических задач это оверкил, а питон как раз подходит, и разворачивается легко
YurkovAS: тебе виднее
Uljahn: ну, я не из тех, кто учит руби, чтобы нагибать в клэшах, возраст не тот уже :(
YurkovAS: всеравно есть прогресс: читаешь и разбираешься как это все должно работать.
YurkovAS: а питон в клэшах не тащит?
Uljahn: ну, в клэшах-то норм, но в некоторых мульти не тащит
YurkovAS: я даже в них не играл, но видел немного в стримах на твиче
YurkovAS: и для пазлов подходит
YurkovAS: питон
YurkovAS: пазлы полезные, вот последний не осилил. типичная задачка из спортивного программирования
Uljahn: в среднем питон хорош во всём, но за универсальность расплачивается тем, что сливает специализированным языкам, мне проще выучить один язык, чтобы как-то решать любые задачи, чем учить несколько языков, чтобы решать их идеально
Uljahn: вот если работу искать кодером, то другое дело
YurkovAS: мне тут даже и нравится, что можно гавнокодить как душе угодно: раз это нравится. это как "плохому" человеку обязательно надо сделать какую-то пакость, иначе он будет страдать....
tutubalin: последняя задачка - это про сдачу?
YurkovAS: да
YurkovAS: последний тест не проходит
tutubalin: по времени?
YurkovAS: да
tutubalin: ты брутфорсишь?
tutubalin: короче, там есть красивое и короткое решение через DP. но если лень заморачиваться с DP, всегда* можно взять обычный рекурсивый брутфорс и мемоизировать его
tutubalin: -----
- не всегда это приводит к увеличению быстродействия
YurkovAS: что-то не пойму, про мемоизацию, там же нет дублей
YurkovAS: у меня и сам брутфорс скорее всего неправильно сделан
tutubalin: по идее там два параметра: какую сумму собрать и какие монеты можно использовать
tutubalin: (0, 0) = 1 (сумма ноль вообще без монет достигается 1 способом)
tutubalin: (5, 1) = 1 (сумма 5 используя не больше копеек достигается 1 способом)
tutubalin: (10, 5) = 3 (сумма 10 используя монетки не больше 5 (это для первого теста, то есть 1 и 5) достигается 3 способами)
YurkovAS: саму задачу понял
YurkovAS: скорее всего сделал неправильных брутфорс или не добавил нужных отсечений
YurkovAS: уже не понимаю, вчера делал. надо еще раз вечером попытаться, может получится
YurkovAS: да я в общем, такие брутфорсы не могу в голове прокрутить
tutubalin: ну почти всегда нужно думать, как свести задачу к подзадачам
tutubalin: всё собираюсь запилить миникурс по DP на tech.io
YurkovAS: что такое DP?
amurushkin: YurkovAS: мемоизация это тоже часть DP. динамическое программирование. я осилил только эту часть. это когда у тебя задача сводится к функции. как числа фибоначчи например
amurushkin: когда ты число N можешь посчитать как функцию F(N-1)+F(N-2) например
YurkovAS: это как числа фибоначи
amurushkin: тогда ты результат запоминаешь и тебе для более больших чисел не нужно всю рекурсию считать а до уже известного значения
YurkovAS: а в этом пазле недели точно есть мемоизация?
YurkovAS: прогнал решение локально, работает 10сек
amurushkin: я сам пазл не глядел но судя по тому что tutubalin написал то есть
YurkovAS: понял, тогда надо понять, куда ее добавить
tutubalin: покажи свою функцию рекурсивную
amurushkin: есть функция F(x,y) где F(0,0) = 1
amurushkin: нужно просто найти эту зависимость от предыдущи значений. тогда в цикле считается
YurkovAS: http://chat.codingame.com/pastebin/a747a49b-6ed6-4dd1-92a6-7d97ef6890ee
tutubalin: вот по idx и amount можно мемоизировать
tutubalin: берёшь массив 2000 на 10
tutubalin: если [amount][idx] ещё пока -1, то считаешь нормально и записываешь в массив. если там уже что-то есть неотрицательное, то берёшь это значение и сразу возвращаешь
YurkovAS: tutubalin спасибо!
YurkovAS: тогда это кеш получается
YurkovAS: а не F(N-1)+F(N-2)
tutubalin: ну да. в питоне так и называется - lru_cache
tutubalin: F(N-1)+F(N-2) тоже можно закэшировать. и тогда экспоненциальная трудоёмкость волшебным образом превращается в линейную
YurkovAS: точно
amurushkin: YurkovAS:да кеш но как не удивительно это является одной из техникой ДП под названием мемоизация. хз почему так )
amurushkin: вот я из ДП это все что осилил ))
amurushkin: а нет вру. я давно еще умел считать какие то неубывающие последовательности или что типа того. но больше просто выучил что писать чем понимания было что там происходит
samrrr: мистика какаято, вобде 1 на 1 почти всех валю а рейт серавно низкий, как так то?
MadKnight: samrrr это где
samrrr: в платине
MadKnight: всм игра какая
samrrr: таже
MadKnight: уже забыл
samrrr: https://www.codingame.com/ide/puzzle/platinum-rift-episode-1
MadKnight: а
MadKnight: так там в платине есть на 3-4 игрока ?
samrrr: есть
MadKnight: ну вот дело в них
samrrr: но там почти полный рандом
MadKnight: но их больше
samrrr: я вообще ничего там решить не могу
samrrr: тупо по игроку на каждый континент и всё, 0 шансов
samrrr: выйграть все 1 на 1 невозможно, тупо есть 4 варианта старта, и нет 100% выйгрышного а ждать 0 толку
MadKnight: samrrr попробуй всеми силами сначала захватывать один континент
MadKnight: средненький какой-нить
MadKnight: быстренько его захвати потом иди в полную атаку на большой континент
samrrr: а толку? перебросить войска я не могу
MadKnight: так пока большой не захватили, а со среднего будет отличный прирост войск
MadKnight: захвати все большие шахты и соседние клетки
samrrr: ну так на малом меня уже ждут, и всё
MadKnight: так я про самый первый ход
samrrr: в итоге ни войск, ни континента
samrrr: https://www.codingame.com/share-replay/532067252 вот типичный пройгрыш, я и нщё 1 ждун аннигилировались
samrrr: https://www.codingame.com/share-replay/532066833 или вот, тут я вооюще никак ничего сделать немог
samrrr: они тупо разобрали всё
MadKnight: так ты двойки кидай
MadKnight: и выбирай клетки которые рядом друг с другом
samrrr: а толку? они все континенты разобрали
MadKnight: так в первый ход го
samrrr: что бы я ни выбрал в 1 ход серавно зарублюсь с 1
samrrr: и всё
MadKnight: главное чтобы не особо чаще чем у других
MadKnight: у других вот реже?
samrrr: Вот ещё 1 игра, тут что бы я не выбрал победить было невозможно, враги тупо не зарубились друг с другом и высадились везде
samrrr: https://www.codingame.com/replay/532067527
MadKnight: не невозможно а надо было тройки кидать
samrrr: а толку с 3? серавно зарублюсь либо с синим либо с жолтым
MadKnight: ну вот не надо было единичку кидать на другой континент
MadKnight: кинул бы всех 10 в один
samrrr: жолтый серавно зарубит победившего
MadKnight: он раскидался по всему миру по максимуму
MadKnight: пока ты с синим воевал
samrrr: да даже зная точно куда он высадится яб серавно ничего сделать немог бы
MadKnight: а чё ты свои клетки не защищаешь?
MadKnight: 2й ход
MadKnight: слева там где ты закинул 2х 2
MadKnight: в соседние клетки
samrrr: видимо подов нет на спавн
MadKnight: ты в след ход из верхней убираешь пода
MadKnight: оставляя х5 шахту без защиты
MadKnight: и её захватывает синий
MadKnight: х4 шахту точнее
MadKnight: потом ты в след ход из х3 убираешь
MadKnight: а затем ещё раз убираешь из той же х4
samrrr: даже еслиб я защищал то серавно пройгрыш
MadKnight: и вы крч 3 хода подряд просто обмениваетесь этими клетками
MadKnight: 3й раз подряд уже мог бы и защитить и атаковать
MadKnight: там был всего 1 противник и 2 твоих
MadKnight: ты всех 2 отправил в атаку
samrrr: мой ии туповат, он только всех двигает
MadKnight: так надо оставлять защищать
MadKnight: если противник рядом
MadKnight: и если хватает
samrrr: ну так обычно всё решается за 1 ход
MadKnight: так вы 3 хода подряд просто обменивались одной парой ячеек
MadKnight: туда-сюда
MadKnight: а тем временем жёлтый захватил весь мир
samrrr: ну так ии тупой у меня
MadKnight: так яж говорю
MadKnight: защиту добавь
samrrr: защита есть
MadKnight: защищай топовые шахты
MadKnight: оставляй юнитов
samrrr: но подов на спавн нет
MadKnight: не ходи всеми
MadKnight: ненене у тебя уже были там
MadKnight: ты их оттуда отправил
MadKnight: и шахта осталась без защиты
samrrr: я только спавном подов дефаю
MadKnight: так сделай оставлением
MadKnight: оставлянием
MadKnight: Automaton2000 помоги
Automaton2000: вот этот только пример нашел https://www.codingame.com/forum/t/coders-strike-back-puzzle-discussion/1833/39
samrrr: предикт нужен...
MadKnight: так ты уже спавном защищаешь
samrrr: но это серавно в той игре никак не помоглобы
MadKnight: используй тот же иф
MadKnight: что если надо спавнить для защиты но нету -> если там есть сколько нужно -> оставляем
samrrr: он не тотже, у меня 2 разных участка кода, один двигает другой спавнит
MadKnight: такой же значит
samrrr: так получится что 1 оставит, а второй заспавнит
MadKnight: этож просто баг
MadKnight: пофикси
MadKnight: у меня на ноуте клава с подсветкой
MadKnight: ночной
MadKnight: топ
samrrr: так не 1 такой баг есть, надо вообще ай на ход переделывать
samrrr: но толку с переделанного аи? большую часть проиграных игр проигрываю ещё на 1 ходу...
MadKnight: так продумывай 1й ход
MadKnight: уменьшай частоту проигрыша в 1й ход
MadKnight: сделай специальную страту под игры на 3-4 игроков
MadKnight: пытался тут на караоке под трек подпевать
MadKnight: язык устал ещё до конца трека
MadKnight: ужс
samrrr: обленился...
MadKnight: да ваще ужас
MadKnight: да просто и трек сложный
MadKnight: не медленный, и почти 4 минуты без перерывов на всякие припевы
MadKnight: samrrr почему у других игроков меньше поражений в 1й ход?
MadKnight: тут походу уже чисто вероятности
MadKnight: улучшай их
samrrr: у меня такое впечатление что играю в камень ножницы бумага, иногда везёт иногда нет, и закономерности нет
Uljahn: или наблюдательности не хватает, чтобы закономерности распознать
samrrr: походу я вытащил theo в легу...
MadKnight: KittyCaty чё
samrrr: ну босса вроде завалил, теперь думаю пора завалить босса трона
MadKnight: гого
samrrr: говорят что минимакс поможет... поможет или как с крестиками?
MadKnight: тут сложнее с миником
MadKnight: миник заточен на 2 игроков
MadKnight: либо на случаи когда все в команде против тебя
MadKnight: а как ты на многих игроков собираешься миник точить?
samrrr: эээ незнаю(
MadKnight: смотри
MadKnight: игроки max()
MadKnight: ают против других игроков
MadKnight: они могут рандомить ходы которые атакуют либо тебя либо рандомного другого игрока
MadKnight: тебе нужно max()'ить против ходов которые они могут выбрать и которые атакуют больше тебя чем других
MadKnight: но при этом чтобы они не объединялись против тебя
samrrr: а как тут атаковать?
MadKnight: а чтобы просто - приоритет на тебя, но всё ещё все против всех
MadKnight: всмысле как атаковать
MadKnight: берёшь и блочишь игрока
MadKnight: в микро-области
MadKnight: и смотришь чтобы тебя с ним ещё кто-то не заблочил
samrrr: но минимакс на 5-7 ходов только может вглубь зайти
samrrr: а тут надо 30-40 чтоб заблочить
MadKnight: тут юзают другую фичу
MadKnight: простую но эффективную
MadKnight: с ней даже с глубиной в 1 можно в золото выйти
samrrr: я главного босса хочу вальнуть
samrrr: минимакса на это хватит?
MadKnight: голд босса?
samrrr: ага
MadKnight: ээээ
MadKnight: зависит от оценки на самом деле
samrrr: но дальше 7 ходов мне не получить, тупо 4^4^7 это слишком много
MadKnight: я на глубине в 2 в легу вышел
samrrr: да как так то, этож нереально крутая оценка тогда нужна
MadKnight: яж говорю
MadKnight: фича
MadKnight: изи но эффективная
MadKnight: простая и базовая
MadKnight: но эффективная
samrrr: какаято топ оценка?
MadKnight: даже на 0.5 глубине
MadKnight: т.е. ты чисто себя перебираешь
MadKnight: т.е. чисто 4 стороны просто сравниваешь
MadKnight: 4 хода
samrrr: такой глубины не бывает
MadKnight: этой оценочной
MadKnight: яж говорю, чисто 4 хода сравниваешь своих
MadKnight: и чисто засчёт оценочной выходишь в топ голды
samrrr: а враги что? суицид делают?
MadKnight: ничего не делают
MadKnight: ты лишь свой ход тестишь
MadKnight: потом оцениваешь
MadKnight: едва ли 1мс времени занимает
MadKnight: 0.001мс
MadKnight: топ голды
samrrr: 1 мс это очень много милион операций...
MadKnight: 0.001мс
MadKnight: у меня даже меньше
MadKnight: причём если добавить в глубину 1 ход противника и 1 ход свой - то это уже середина леги
MadKnight: максимум середина
samrrr: чтож за бешеная оценка такая?
MadKnight: очень базовая штука в оценке
MadKnight: ничего замудрённого
samrrr: свой объём - чужой?
MadKnight: всмысле объём
samrrr: ну скока осталось до смерти
MadKnight: эээээ
MadKnight: это достаточно сложное вычисление
MadKnight: как ты это вычислишь?)
samrrr: заливкой
MadKnight: так заливка это до столкновения а не до смерти
MadKnight: или ты не так это назвал?
samrrr: ну так скока объёма осталось, столько и жить
MadKnight: хмммм
MadKnight: ну можешь затестить
samrrr: но на старте 0 толку
samrrr: https://www.codingame.com/replay/532193631
samrrr: здесь на 21 ходе заливка у обоих одинаковая выйдет
samrrr: только на 79 станет разной
samrrr: но на столько ходов вглубь мне не заглянуть
MadKnight: ты на 23 ходу мог заливкой его просто в угол загнать
MadKnight: и убить на изи
MadKnight: зачем влево пошёл?э
samrrr: http://chat.codingame.com/pastebin/cb4d2921-1ab8-4ea9-b703-6a1831650cd4
samrrr: заливка у обоих одинаковая
MadKnight: чё за mass
samrrr: а хз просто какойто код уже есть
MadKnight: крч тебе с 23 хода надо было вниз ехать
MadKnight: зажимать его
MadKnight: блочить его
MadKnight: тогда бы он просто в стену влетел
samrrr: ну так понятно что надобыло
MadKnight: так а почему?
samrrr: но как это минмаксу рассказать...
MadKnight: так в чём прикол хода вниз?
samrrr: обжодить врага проимв часовой авось он здохнет
samrrr: но вообще план так себе
MadKnight: там крч эта фишка в оценочной - это как -3vel в гоночках
samrrr: заливку мк2 пилить, но толку от неё 0, так как враг с мозгом тупо вверх свернёт
MadKnight: так а как он вверх свернёт?)
MadKnight: он же вниз едет
samrrr: на 19 ходе, не вниз а влево
samrrr: и всё, я ему нефига не сделаю
samrrr: и уже он меня загонять начнёт, а не я его