Chat:Ru/2021-03-04

From CG community
Jump to navigation Jump to search

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: улучшай их

Default avatar.png KittyCaty: :(

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: и уже он меня загонять начнёт, а не я его