Chat:Ru/2020-05-16

From CG community
Jump to navigation Jump to search

gybson_samara: я тут с 7 просчитанных ходов до 5 упал, а у людей есть время противника трекать =(

zuko3d: а ты для всех сразу перечисляешь ходы? или по отдельности?

zuko3d: когда я считаю для одного - успеваю на 30 ходов вглубь взять все пути без двойных петель.

gybson_samara: для всех

gybson_samara: что-то пока совсем непонятно в чем фишка серебра

vrabosh: чтоб больше иногда просчитываь ходов.. можно считать только нечетные х и y

vrabosh: а также смотреть сколько времени после каждого юнита остается до тоймаута.. и последнему можно дать больше просчета если время норм остается

gybson_samara: я для начала все на numpe перепишу, а не только самое самое

vrabosh: что тут переписывать.. тут одна таблица h на w

vrabosh: и по ней бегай.

vrabosh: в предыдущих играх я проверки делал вообще тупо если на х-1,y+1 есть чтото то туда можно идти.

vrabosh: а сейчас все связи в граф занес

vrabosh: Akarachudra, расскажи про свой алгоритм плз

gybson_samara: если он спршивал про бота, наверное он просто гоняет у себя бои подбирая параметры и ищет оптимальные

Default avatar.png Akarachudra: vrabosh bfs+извращенный A*-подобный дейкстра. Это для поиска. Ну и всякие попытки предсказать позиции соперников.

Default avatar.png Akarachudra: У поиска есть явные проблемы, но не уверен, что есть время и силы что-то править.

Default avatar.png Akarachudra: Я в чате видел некоторые твои идеи. Они у тебя хорошие, думаю в твоём случае проблема не в идеях, а в том, чтобы их корректно закодить.

Default avatar.png Akarachudra: Тут только пробовать и ошибаться.

vrabosh: ты каждый ход пересчитывашь карту куда ходить? или 1 раз посчитал и ходишь по проложенному пути?

vrabosh: я кстаи через bfs хорошо нахожу на какой поинт 10 идти. Тут как раз учитывает в начале где противник стоит, и я.. и всех границы просчитывает и в итоге на что меньше влияния от дургих, туда и идти..

Default avatar.png Akarachudra: каждый ход, по несколько раз, с сохранением всей истории предыдущих ходов. памяти немеренно дают - можно всё хранить. но работает криво, знаю где проблема, но чтобы поправить нужно подойти к снаряду конкретно.

vrabosh: я вот как делал, пускал волну от себя, потом от максимальной точки обратно.. и тогда вокруг меня вроде как хорошие коэф были..

vrabosh: но сталкивался с проблемой что то туда то сюда хочет ходить..

Default avatar.png Akarachudra: ну я хз как такое отлаживать, если не написан свой дебаггер или тесты.

vrabosh: это мне не понятно.. просто некогда не писал тесты..

vrabosh: как тут можно тесты написать?

Default avatar.png Akarachudra: ну функциональные, берешь историю игры, смотришь, пишешь что поведение ожидаемое. тестируешь оторванный поиск пути. да много чего можно. но с тестами сложнее в таких коротких контестах. лучше дебаггер написать.

Default avatar.png Akarachudra: но сейчас скорее полезно сконцетрироваться на поиске путей. времени мало.

Default avatar.png Akarachudra: реализуй какой-нибудь жадный алгоритм, с глубиной 30-40. не забудь пометить пройденные пути.

vrabosh: а так идея ввести логи.. на будущее буду использовать.. возможно даже вести лог предсказания след ходов.

Default avatar.png Akarachudra: ну логи обязательно. только их парсить нужно - не глазами смотреть.

vrabosh: потом проще у себя на компе ситуацию проигрывать.. да и еще некторые вещи в будущем писать

vrabosh: вот еслиб сразу делал логи, то сталкновение лбами из за угла легко вычислить в 1 строчку..

vrabosh: у меня идея пришла для тех кто перебором играет

vrabosh: карты же семетрчные..

vrabosh: также в начале дается много времени..

vrabosh: берете одну половину.. где нить точку, тут надо еще придумать лучшую.

vrabosh: и просчитываете все ходы самые лучшие.. запоминаете это

zuko3d: а как это с симметричностью связано?

vrabosh: потом кидаете на этот путь 2 юнитов, один ходит с 1 по конец, другой с конца по начало..

vrabosh: дву других юнитов на другую половину

vrabosh: и можно не учитывать где, кто что скушал. возможно такое зайет

vrabosh: либо если 2 юнита играет.. одного на одну половину кидаешь, другого на другую..

zuko3d: осталось с оппонентом договориться, чтобы он не мешал =)

vrabosh: ну и тут уже играешься как ходить.. либо с первого по последнее число, либо в обратную сторону..

vrabosh: это чисто путь. он как ореентир куда идти

vrabosh: ты опнимаешь, если там скушано.. то идешь где не скушано и продолжаешь путь. можешь посмотреть просто где больше будет назад идти или вперед.

vrabosh: но это теория)

vrabosh: покрайней мере вначале мне кажется можно хорошо пропарсить.

wlesavo: лол проспал повышение

tiraptor: Я тоже) Проснулся и приятный сюрприз

vrabosh: можно как нить делать, чтоб он считал пока ждет ответ от инпут?

vrabosh: т.е. всегда считал)

vrabosh: я код выполняю как обычно.. а гдето параллельно работает функция независима на мою последовательность кода.

vrabosh: надо щаз куча всего напробовать.. чтоб в будущм контесте был опыт)

vrabosh: инпут иногда до 100мс ждешь

wlesavo: tiraptor интересно кому спасибо сказать, я уходил на седьмом месте с разницей до босса очка в 2.5

OkThought: у меня внезапно в серебряной лиге баг в чтении пеллетов: он читает на одну меньше, и таймаутится, я вахуе

wlesavo: vrabosh нет, нельзя, там есть хитрости вроде чтобы наиграть пол мс на этом но не все 50

wlesavo: OkThought дай угадаю

wlesavo: питон

wlesavo: принтишь без flush = True

OkThought: 🤔 щас чекну

wlesavo: таймаут в коде, последний пеллет в инпуте

wlesavo: известная проблема, все там были

OkThought: спасибо

OkThought: странно что я сюда попал на серебре

wlesavo: http://chat.codingame.com/pastebin/8f8f6780-7606-4e9d-8772-cfb8df3c8c2a

OkThought: о, это ваще ништяк, спасибо

wlesavo: ну там game.turn_start надо либо выкинуть либо у себя добавить если есть класс

OkThought: разобрался :)

OkThought: функция конечно корявая, почти полностью её переписал

wlesavo: помню тоже пару часов искал косяк, начал уже все подряд принтить, и обнаружил что инпуты не приходят, но пришел ульян и спас меня)

OkThought: всех когда-то спасает свой Ульян

wlesavo: блин, хотел чето поделать, а во сне запромоутило в легенду и чето как мотивация потухла

wlesavo: ну ладно, сник фраги сделаю и пожалуй хватит

ashelkov: я вот чтото поправил и с 15 места на 45 ((

ashelkov: и вроде ничего плохого не сделал)

735487: может просто с сабмитом не повезло

wlesavo: да скорее всего, но прям очень рандомная игра таки

ashelkov: ну я конечно еще попробую

wlesavo: с другой стороны реально улучшения похоже которые вчера насоветовали помогли

ashelkov: но как то странно если так уж разбрасывает

gybson_samara: OkThought ты может их как-то обрабатываешь при чтении?

wlesavo: да там уже разобрались gybson_samara

wlesavo: пришел чувак и за день накидал бота который уже в топ 20 легенды, нормально так

zuko3d: это ты о ком?

wlesavo: чокудай

wlesavo: недавно в ворлде обуждали только

wlesavo: типа у японцев есть даже свои алгоритмы о которых мы вообще не слышим толком даже, например чокудай серч

zuko3d: :D

wlesavo: ща он пришел, говорит вчера в твиттере увидел, решил поучавствовать

ashelkov: все таки не сабмит был плохой

ashelkov: улучшение было плохое

ashelkov: вернулся в топ 15

ashelkov: идея игнорить "чужие" супер пеллеты (те где враг ближе) не работает

ashelkov: я типа оттестил на 1 примере игры де это работало и запилил

ashelkov: а по факту хрень

dbf: инетресно, а почему не работает? враг лажает и можно их отобратьт что ли?

dbf: я просто тоже такое впилил и только 1 раз была проблема

metahom: так и называется? Чо-Куда поиск?))

ashelkov: мне кажется что не работает потому что паки не навязыват борьбу на територии противника и уходят кудато

ashelkov: а може я чтото хреново запилил))

wlesavo: metahom :grinning:

wlesavo: ashelkov много случаев когда тяжело определить какая большая еда твоя, когда один и тот же твой пак оказывается ближним к двум пелеткам, но не может одновременно успеть взять две. я думаю проблема в этих едж кейсах

ashelkov: ну не настолько чтоб вниз сабмититься/ таких кейсов не так много

wlesavo: все таки может хватить, если из-за этого у тебя будут рандомные проигрыши на 40-50 рангах то просто будет тяжело подниматься

ashelkov: ну может быть/ согласен

vrabosh: жесть, с этими тонкостями питона..

vrabosh: у меня массив в котором список.. копирую этот массив, а внутри список ссылается на старые данные

zuko3d: ага, есть такое. используй deepcopy

zuko3d: а ещё лучше не исопльзуй списки если тебе нужна производительность - используй только массивы numpy

gybson_samara: если маленькие, то можно и списки

zuko3d: даже маленькие. Список - это массив из указателей. Каждый доступ к элементу - это несколько прыжков по памяти

vrabosh: а у нампи дипкопи как звучит?

zuko3d: newArr = arr.copy()

vrabosh: у меня в нампи списки

vrabosh: и они при копи обычном ссылкаются на старый указатель

zuko3d: брр... у нампи обычно ndarray

zuko3d: а зачем тебе в нампи списки?

vrabosh: да я нампи как обычный масив использую по привычки

vrabosh: удобней [x,y] писать чем [][]

zuko3d: тогда это уже не список

wlesavo: from copy import deepcopy a = deepcopy(arr)

vrabosh: вот и засунул туда списки.. а на каждый xy у меня хранятся связи с соседями клетками

wlesavo: но с нумпайными можно просто arr.copy()

wlesavo: и это быстро достаточно работает

zuko3d: не, там судя по всему в ячейках лежат list

wlesavo: а дипкопи это смертить

vrabosh: спаибки с дипкопи заработало..

vrabosh: да, я в ячейки list запихнул

vrabosh: удобно.. я таким способом легко узнаю где сколько переходов через len(g[x,y])

gybson_samara: я это в отдельный массив занес

vrabosh: и цикл легко кидать for nx,ny in g[x,y]

wlesavo: в смысле координаты там?

wlesavo: тогда сделай ккоордиаты ну туплах, (x, y), они иммутаблы и не требуют дипкопи

vrabosh: я туда еще засовываю всякие переные с которыми работать могу

vrabosh: типа веса итд.. вот щаз решил их потрогать.. стратегию поменять.. и столвнулся, что везде меняет

vrabosh: ищу способ как быстро перебирать.. под рекурсией каждый раз копи делать. то получается долго думает

vrabosh: я вот думаю как без копи это сделать, чтоб он по томуже масиву через рекурсию проходил..

vrabosh: можно впринципе попробовать копию делать на развилках.. тогда нагрузка сократиться.

vrabosh: и не надо будет чтото выдумывать

vrabosh: вообще тут ктото перебором пользуетс, кто в золоте или легенде?

zuko3d: я перебором делаю

zuko3d: пока есть надежда пройти в легу, но надежда тает =)

vrabosh: насколько клеток получается просчитывать?

ashelkov: глубина 15 с запретом возврата через шею

ashelkov: шея = предыдущая клетка

ashelkov: разрешать разврорт если шея единственный вариант

ashelkov: но надо не учитывать клетки ктотрые сам прошел в скоринге

ashelkov: и будет вам лега)

BorisZ: я вот тут подумал что может ситуаций когда выгодно свитчится вообще практически не бывает если враги разумные

ashelkov: я и не свитчусь)

BorisZ: а враги там в легенде свитчатся?

BorisZ: на глазок - как?

ashelkov: да некоторые ловят

ashelkov: изза угла ктото просчет написал

ashelkov: если враги разумные - там как раз все разумные))

BorisZ: ловить одна ситуация в тупике, другая в тоннеле с двух сторон - вобще экзотика

BorisZ: в тупике чего ловить - враг собирает, ты время теряешь, в начале еще может быть, а в конце точно нафиг надо

ashelkov: не очень ловля работает

BorisZ: из начальных позиций может конечно возникнуть ситуация хз

ashelkov: меня чувак ловил в туннеле и проиграл на 4-5 пелеток

ashelkov: хотя он бы мог съесть больше если б не ловил - мне все равно с туннеля возвращаться

BorisZ: или короткий путь к вкусняхе одним забокировать чтоб другой дошел, но это и редко и сложно реализовать как-то

ashelkov: ну что сабмичу

ashelkov: подкрутил коефициент а там посмотрим

BorisZ: погоди, выпей для храбрости

ashelkov: да чтото херовенько пошло. / посмотрим

BorisZ: короче делаю новый поиск путей вобще без свитчей

BorisZ: ух 63 человека уже в леге

ashelkov: удачи тебе с новым поиском!

ashelkov: он и должен быть просто поиском возможных путей + принимать блокирующие клеки

BorisZ: спасибо, беру повышенные обязательства - в чат не писать и не читать пока в легу не пройду

ashelkov: и отдельно оценка путей

wlesavo: ого, это серьезное заявление

vrabosh: те кто в легенду попадает, в каких фирмах вы работаете\работали? не ниже уровня яндекса?

vrabosh: это насколько круто надо программить, чтоб в легенду попадать

TheCrucial: очевидно легендарно круто

ashelkov: хаха/ обычная аутсорс фирма)

wlesavo: вообще не прогер, начал где то год назад

wlesavo: ooc моя первая легенда была

vrabosh: и как так получается легенды брать?

gybson_samara: в принципе тут и уровня студента хватит, как мне кажется

Xanrum: навык программирования игровых ботов ну никак не помогает на настоящей работе : (

Xanrum: так, за два дня отсутствия с 8 до 160 скатился, надо вернуть могущество

wlesavo: и за пределами cg вообще почти не прогал, только по мелочи всякие скриптики для автоматизации повседневной работы и примитивные штуки

ashelkov: у меня оос первый контест - попал в золото без поиска путей и кодя во встроенном редакторе)

vrabosh: та лан, уметь так мыслить - оч хорошо думаю помогает сложные задачки решать на работе

wlesavo: тоже первый контест был

wlesavo: но там у меня както сильно лучше шло

ashelkov: мало общего с работой) я до этого задачки на кодварс решал

wlesavo: здесь только с подсказок в легенду попал)

vrabosh: вы еще не во встроеном кодите?

vrabosh: это мой первый..

Xanrum: работа программиста - чем быстрее делаешь фичи, тем ты лучше. Рецепт быстрых фич - соединил несколько фреймворков, починил баги через stackOverflow

vrabosh: это уже не программист, а сисадмин какойто)

vrabosh: или как там называют щаз, девопсы?

Xanrum: аха, SRE

Xanrum: если это инфраструктурная фича - то девопс, если бизнесс фича - то девелопер

YurkovAS: где можно почитать про алгоритм поиска пути? может в PM-ах было где, к ooc. Кроме dfs (будет медленно) ни чего на ум не приходит.

vrabosh: графы в ютюб набрать или на хабре

vrabosh: wlesavo, что тебе помогает легенды брать, до этого матиматику хорошо шарил?

vrabosh: я просто ноль с матиматике.. вот думаю, может школьный курс просмотреть

wlesavo: YurkovAS сделай простой монтекарло без возвращений

YurkovAS: vrabosh а без графов можно (я про списки все эти, страшное дело) просто на массивах (битбордах). вот в ooc все генерировали эти лучше пути. я так и не понял как. точнее dfs-ом могу сделать несколько путей в одну точку, но очень медленно. а с bfs-ом в одну точку будет только 1 путь.

wlesavo: vrabosh ну вообще да, логическое мышление нормальное нужно, я так то физик

wlesavo: YurkovAS берешь точку, проверяешь куда из нее можно пойти, случайно идешь, смотришь сколько за это получил эвала, так на глубину. дальше максимизируешь эвал по разным оцененым путям

wlesavo: это самое просто что можно придумать помоему, как рандомные плейауты на нулевой глубине

vrabosh: YurkovAS , я эксперементально нашел свой способ

vrabosh: кидаю волну, нахожу самый далекую точку и потом от нее еще раз волну кидаю. и потом сумирую и хорошо видно куда ходить. но не всегда идально

vrabosh: а вот вчера узнал, что есть радиус у графов, и как раз с радиуса или с диаметра кидать волну, а потом от себя.. и получаются хорошие ходы..

vrabosh: надо будет попробовать потом на оос

YurkovAS: wlesavo и vrabosh спасибо! всеравно не понятно. может после конкурса кто-то опубликует детали генератора путей...

AntonT: vrabosh: первую волну от пакмана кидаешь?

735487: vrabosh: на самом деле не обязательно программить на уровне яндекса. я вон тоже попадаю. в этот раз просто не было времени заняться. в прошлом на 28 месте кажется финишировал. просто практика нужна

FeZar97: а мне кажется не практика а энтузиазм)

735487: ну без энтузиазма тут вообще наверное делать нечего

FeZar97: количество энтузиазма пропорционально месту в общем лидерборде

TheCrucial: чем больше ентузиазма тем дальше от первого места?

FeZar97: тогда обратнопропорционально)

TheCrucial: :)

FeZar97: хорошее замечание)))

vrabosh: AntonT, да от пакмана, потом от самой дальней точки... Но мне кажется лучше кидать от точки к которой точно все дороги ведут , потом от дальней, а потом может еще и от пака)

AntonT: vrabosh: а это не приведёт к тому, что пакманы будут в центре тусоваться? или пока не дошёл - не менять?

Hamibar: wlesavo ооо, попал вижу в легенду. Поздравляю

wlesavo: Hamibar спс, мне тут вчера насоветовали, я прикрутил и прошел

Hamibar: тут же не дают футболку за топ 20?

wlesavo: вроде нет

wlesavo: мне кстати за прошлый уже должна где то подъезжать вроде

Hamibar: жаль. Но все равно нужно попробовать влезть завтра.

Hamibar: Быстро достаточно подвозят)

wlesavo: письмо было какое-то что вроде идет

wlesavo: типа на границе или где

Hoggins: А из CGBenchmark или какой то тулы можно получить весь "Standard Error Stream" без ручного копипаста?

Uljahn: есть такой мануал, как из реплеев доставать https://www.codingame.com/playgrounds/53705/contest-tools-and-workflow/introduction

Hoggins: круто, спасибо

gybson_samara: столько багов исправил, что непонятно как вообще в серебро попал

ilt: они друг друга компенсировали )

gybson_samara: и кто тут босс? https://www.codingame.com/share-replay/465634663

gybson_samara: чет давно так не ржал =)

AntonT: не так страшен босс, как те, кто к ниму идут)

gybson_samara: я поржал с того, как мы синхронно налажали, но он больше

gybson_samara: сабмитну, мало ли

gybson_samara: ну ниче вроде пошло

MadKnight: гого

gybson_samara: кто-то пробовал делать свитч просто исходя из списочного состава своей команды и противника?

ilt: в чем смысл?

gybson_samara: ну типа если у него все ножницы, то своих всех в камень свитчнуть

ilt: ты же их не видишь

Uljahn: подготовиться типа заранее к случайным встречам?

gybson_samara: если у него две бумаги и камень, то одного в бумагу и двух в ножницы

gybson_samara: да

gybson_samara: мы их не считаем, так хоть вероятность уменьшим

Xanrum: я пробовал - иногда эффект есть - но потеря скорости приводит к большим потерям очков чем вероятность иногда съесть кого то на повороте

Xanrum: в результате - отказался

Xanrum: но ничто не исключает что я криворукий

gybson_samara: я как-то нечаянно научился люто жрать https://www.codingame.com/share-replay/465701503

Uljahn: подозреваю, что в разных ситуациях будет эффективно разное сочетание фич

gybson_samara: и вот эти ситуации

gybson_samara: http://chat.codingame.com/pastebin/0b291711-82b8-4bca-8073-bdf4dfc39431

gybson_samara: это в нейронку бы загнать, она бы выдала параметры

gybson_samara: а так сижу руками правлю

Uljahn: угу, для этих целей нейронка как раз годится

Uljahn: в зависимости от размера карты и количества паков определять оптимальные параметры, например

gybson_samara: урок на будущее мне

gybson_samara: сразу надо готовить обучалку и в нее алгоритмы пихать

Uljahn: обучалку?

gybson_samara: ну программу, куда сунул бота, а получил результат

gybson_samara: и так много раз

gybson_samara: и другой программой обработал результат

Uljahn: а, селф-плей типа?

gybson_samara: да

Uljahn: так нужен движок игры быстрый, чтобы много игр запускать, миллионы

Uljahn: или параллелить

gybson_samara: если я за сутки справляюсь, то и тот справится

Uljahn: чтобы за сутки справляться, ты 30+ лет обучался в реальной жизни)

gybson_samara: тоже прпавильно

gybson_samara: но как будет прикольно решать эту задачу ведь

Uljahn: котоботов тоже думал мутить "универсального решателя"

Uljahn: на скала, наверное

Xanrum: на кой эти нейросети, у меня в голове нейросеть с десетялетней историей

MadKnight: перепиши на алгоритм

Uljahn: чтобы переложить на неё рутинные задачи подбора параметров

gybson_samara: хоть в первой половине серебра устаканился

Uljahn: :)

Uljahn: Automaton2000: какова значимость всей этой деятельности для нейросети с десятилетней историей?

Automaton2000: а почему ты не в курсе, что у тебя в общаке смайлы показывает?

gybson_samara: мат в 8 ходов https://www.codingame.com/ide/2786465532cf44b084948025e170b8bb2b5d7f17

Uljahn: ?

Uljahn: ссылка левая

gybson_samara: сорян https://www.codingame.com/share-replay/465714551

gybson_samara: веселый, надо признать, челлендж

Hamibar: прикольный реплей. Как интересно нужно поступать при таком старте

Hamibar: сжирать камень и дальше собирать.

Hamibar: а камнем тогда можно из-за угла подождать.

gybson_samara: там у него начало было интересное, потому на нем и стал тренироваться

gybson_samara: и сделал учет КД соперника

Uljahn: у него нет предсказания соперника, иначе он скорость врубил бы, чтобы убегать, а не в ножницы свитчиться

Hamibar: еще он на бумагу напоролся, хотя видел ее

gybson_samara: он на скорости

gybson_samara: но да

gybson_samara: он забыл, что на скорости сразу два хода

Uljahn: скорее всего, жёстко раздаёт цели на старте - бежать к супер-пеллету

Hamibar: мб просто не чекает безопасность пути. Но тут интересно, чтобы топы сделали. Надо ща затестить

gybson_samara: все он чекает, но криво, до того на другой карте он меня жрал

gybson_samara: вот вам кейс про то, что важно точки жрать, а не убивать

gybson_samara: https://www.codingame.com/share-replay/465724789

Hamibar: прикольно, что топы не стремятся убивать запертый камень. Только эйлер из топ 5 побежал.

gybson_samara: так это его бот в серебре?

vrabosh: чтоб пвпшится под это надо конкретно писаь стратегию..

WhiteCrow: NightLuna в легу будешь проходить? :)

WhiteCrow: spaceorc тот же вопрос :)

vrabosh: допустим ты не можешь прыгнуть тупо на зажавшага в углу противниа.. у него почти всегда откатится скил

Hamibar: gybson_samara не думаю.

Hamibar: в той ситуации не успеет. Я думаю проблема в том, что не видишь противника.

vrabosh: тогда придется подходить к нему в упор и 1 ход стаять на месте или назад ототи.. он использует скилл, потом противопоставить ему и прыгать

Hamibar: Не знаешь заюзал абилку или нет.

vrabosh: знаешь, поменял он тип или нет..

WhiteCrow: Почемк наш универ на втором месте?

vrabosh: у меня есть штука, если я под спидом, противник нет, и у него обилка не откатилась.. я бегу за ним

vrabosh: если он рядом на 1,2 клетки

wlesavo: в леге злые конечно ребята

gybson_samara: Сегодня с Боссом https://www.codingame.com/replay/465634663

WhiteCrow: vrabosh я похожее думаю реализовать

WhiteCrow: Если на сборе и мелких эвристиках не пройду в легу :)

gybson_samara: бежать за противником по пустым клеткам?

ashelkov: wlesawo да чтото очень/ не дают спокойно все пособирать

ashelkov: ))

vrabosh: у меня эти все штуки пишутся в одно условие.. 2 строчки кода короткие

Hamibar: gybson_samara если ты на спиде, а он нет, то точно убьешь. За 2 хода макс

vrabosh: вы хоть собираете.. а я проигрываю в собирательстве)

wlesavo: ashelkov у меня почему то агрессивная стратегия лучше играет в легенде, но один фиг на дне

vrabosh: плохой с меня сборщик

vrabosh: либо может гдето в коде натупил.. потому что пару дней назад был в 300, а щаз в 500

ashelkov: wlesawo не знаю я пока вообще не агресивничаю / удается пока 24 держаться как-то

ashelkov: еще не все сдеано для налаживания сбора

Hamibar: Помниться в кристалликах вышел в легу не разу не поставив мину) это об агрессивных стратегиях

ashelkov: хотя некоторые подлавливают вначале хоть 1 пака и потом как нистарайся

vrabosh: если ктото сделает агресивного, который будет уметь подлавливать. думаю будет в топе

vrabosh: просто сейчас походу все играют чисто сборщиков

ashelkov: не все/ ловят некоторые в топ 15

ashelkov: изза угла просчитывают с начального

vrabosh: расскажите как вы ходите хорошо?

Hamibar: мне тоже интересно)

vrabosh: надо перед сабмитом версию подписывать.. и что изменил.. и какое место предыдущий сабмит занимал.. а то хочу старую 2 дневной давности вернуть.. посмотреь что будет

wlesavo: ashelkov euler сегодня показывал такой реплей где ловит на начальной траектории

wlesavo: я хотел такое сделать но чето не смог

wlesavo: старая идея еще была

gybson_samara: vrabosh слева кнопка "History"

ashelkov: ну вот/ жесткие они там/ сделать то можно попробовать но есть еще и проще способы подняться)

vrabosh: как мне из этих всех хистори узнать, что было толковое?)

vrabosh: я не помню когда золото взял.. и в тот день было куча сабмитов

Hamibar: используй гит. И этой проблемы не будет

gybson_samara: глубина хода 15 не очень хорошо помогает, там в конце такие копейки, что только вредят

gybson_samara: поставил 14

Uljahn: вроде ещё cg enhancer есть плагин

Xanrum: а если 10 пелетка дальше 15 ходов?

Uljahn: позволяет в хистори сабмиты подписывать или типа того

Uljahn: 15 ходов - это два раза спид заюзать можно

gybson_samara: если в сабмите писать "Это в золото", то это будет либо каждый, либо никакой

Uljahn: в сабмите писать, какую фичу запилил

gybson_samara: легче не станет особо

vrabosh: походу рально чтото намудрил. стал старую версию... она сразу на 100 позиниц понизила меня

qbit86: Uljahn У меня MSBuild при сшивании исходников добавлят в шапку комментарий с датой и commit id.

Uljahn: норм

tomatoes: я в коммите пишу голд 121 и норм

Uljahn: так рейтинг плывёт постоянно

vrabosh: гит не гид, писать надо , что за версию отправляю.. в привычку надо это сделать.

qbit86: tomatoes А такое надо писать в git tag :)

gybson_samara: tomatoes пиши сразу лега =)

gybson_samara: на удачу типа

gybson_samara: я кажись в первую сотню серебра лезу тупо на параметрах

gybson_samara: к следующему контенсту буду эмулятор писать

tomatoes: а вроде написано что-то подобное, но сам не пользовался

vrabosh: если эмулятор будешь писать.. то ИИ освой)

gybson_samara: ну реально сижу 3 константы правлю до победы, потом сабмит

Xanrum: а мог бы пилить фичи

vrabosh: я думаю тут ИИ не сложный.. для тех кто умеет его деать

gybson_samara: vrabosh для начала хватит и ГА или регрессии

vrabosh: что за ГА?

gybson_samara: генетический алгоритм

vrabosh: какая логика в нем?

gybson_samara: Xanrum вот их я и пилил на самом деле весь день, и баги правил

tomatoes: https://github.com/eulerscheZahl/ParameterFiddler это вроде

gybson_samara: теперь сижу константы двигаю

Uljahn: так дело в том, что оптимальные константы для каждого сида свои будут

vrabosh: чтоб генетический алгоритм делать, надо понять какой им мозг сделать

Uljahn: в ГА полурандом

gybson_samara: Uljahn никто же не запрещает их в самом начале поставить в зависимости от параметров карты

tomatoes: у меня мысль была двигать константы в зависимости от размера поля, количества паков. и мб от текущих очков/состояния

vrabosh: ну как он должен думать? типа посмотрю на право, если есть чтото пойду туда.. а другой, посмотрю на две клетки, потмо на 1 клетку, или сразу схожу

tomatoes: но не придумал куда и как

gybson_samara: tomatoes еще можно начальное состояние паков, ну там кто ножниц, кто что

gybson_samara: tomatoes я бы их вообще просто рандомно двигал в интервале некотором

Uljahn: ГА не думает, он выбирает несколько рандомных путей, симулирует, определяет сумму очков, потом часть путей изменяет, у части путей переставляет куски местами, и заново оценивает, оставляет лучшие варианты и добавляет новых

gybson_samara: селфплей

gybson_samara: Uljahn так и мы не думаем, а вот как ГА =)

tomatoes: что-то вроде если поле маленькое и много паков, то стараться агрессивнее. если мало паков, то аккуратнее. итп

vrabosh: с ИИ тут все просто на вход даешь h*w , плюс, х+y*колво юнитов, и тип.. потом на второй позицию чтото и на выходе х y id и команда, и пускай он крутится этот алгоритм..

gybson_samara: vrabosh это ис ГА так и с обратной регрессией

Uljahn: tomatoes: думаю, у топов это будет в каком-то виде

gybson_samara: на целом классе задач обратная регрессия даже лучше ИИ работает

vrabosh: это ИИ какой я видел.. ГА, это когда есть логика, т.е. он по логике действует.

vrabosh: у него есть куча команд, и он уже эти команды рандомно у себя раставляет.. какую как выполнять

gybson_samara: это та логика, которую используют в обучении ИИ

gybson_samara: vrabosh ИИ нельзя просто сказать "учись"

Uljahn: ну, если ты функцию оценки называешь логикой...

vrabosh: я не программил ии кнечно. но видюшей постмотрел

vrabosh: там просто подаешь данные куча, и потом он подбирает веса и выдает выход.. тут безразницы какие данные

gybson_samara: Uljahn функция оценки это то божественное, что мы помещаем от себя в ИИ =))))

Uljahn: а могли бы нейронке отдать на откуп

gybson_samara: а могли бы с собакой погулять, а не вот это все =)

vrabosh: в данном случае это колво клеток, 10 юнитов и их способности. и на выход 4...

Uljahn: разница кстати есть, и очень большая

vrabosh: и все это в тензерфлов запихал..

Uljahn: )))

gybson_samara: что самое сложное в ластбатлах, так это найти самого высокорейтингового противника

Uljahn: если бы всё было так просто, то в крестиках нейронки были бы в топе

vrabosh: а почему не втопе?

vrabosh: просто симуляцию надо писать, чтобы ИИ играл, и причем быстро

tomatoes: не выходит видать

zuko3d: симу написать несложно

vrabosh: но нудно

gybson_samara: а почему у _Vincent_ написано 662nd, а у меня N/A?

vrabosh: а вот с ГА не могу понять как сделать

gybson_samara: vrabosh никак

gybson_samara: в этом конкурсе

zuko3d: с нейронкой есть две проблемы - хорошо обучить и запихнуть в 100кб

Uljahn: так ГА без симы не будет работать

vrabosh: ну это понятно

Uljahn: zuko3d: именно

Uljahn: от характера правил игры зависит то, сколько данных потребуется для обучения и какой размер нейросети сможет начать что-то обобщать

Uljahn: в гоночках простые правила, там нейронка влезает

vrabosh: причем тут же наверно нет библиотек ИИ?

vrabosh: надо свои пихать?

Uljahn: нет

gybson_samara: тут полный перебор на 15 ходов избыточен, куда еще ГА? ну разве что все паки вместе гонять

zuko3d: 15 ходов - избыточен?....

gybson_samara: надо будет попробовать, хода на 4-5

zuko3d: а если пилюля на расстоянии 16 ходов? :)

Uljahn: у эйлера 4 вроде было)

gybson_samara: zuko3d там уже на 10 такие артефакты

gybson_samara: сложно подбирать угасание

Hamibar: полный перебор всех вариантов на 15 ходов?

zuko3d: зачем угасание?

Hamibar: мне кажется их многвато

gybson_samara: каждое новое изменение веса в хвосте неожиданно играет

gybson_samara: и прочее

gybson_samara: zuko3d чтобы не игнорировать цели на первом ходу в угоду целям на 15

zuko3d: Hamibar: там по ходу можно отсекать много очевидного мусора. т.е. не полный перебор всех, а все "адекватные"

Xanrum: перебираешь хоть всех паков одновременно?

gybson_samara: zuko3d все адекватные и захардкодить можно

gybson_samara: Xanrum пока нет

Hamibar: ну тогда ясно. Кстати на старте ищу пути не более 15 длиной)

zuko3d: эээм.... захардкодить тысячи вариантов получится вряд ли

gybson_samara: zuko3d адекватный то вариант только один

Uljahn: как сделать одновременный перебор? :upside_down:

gybson_samara: zuko3d который побеждает

Hamibar: это не адекватный а оптимальный

Uljahn: так у нас неполная инфа, от противника много зависит

Hamibar: и я не уверен что он один

zuko3d: не, ну если сразу знать, какой побеждает - то и перебор не нужен. я имел в виду - отсекать заходы в пустые тупики и т.п.

vrabosh: Uljahn , перебираешь первым, возращаешь куда он ходит.. потом когда вторым перебираешь даешь эти данные.. и он их учитывает каждый ход

gybson_samara: Xanrum у каждого пака 1-4 возможных хода, буду пытаться вместе, но пока думаю как

Uljahn: это не одновременно...

vrabosh: но они не будут пересикаться

MadKnight: пересе*

Uljahn: угу

Xanrum: gybson_samara двигаешь

gybson_samara: да они и у меня уже не пересекаются

Xanrum: gybson_samara делаешь цикл движений одного, на каждый вариант пересматриваешь все движения второго, и на каждый вариант второго смотришь движение третьего

Xanrum: еще проверяешь что в один ход они на одну позицию не стали

gybson_samara: Xanrum тогда не на каждый, их у меня по полтыщи

vrabosh: в 50мс думаю с таким даже 10 ходов 5 пакам не посмотреть

gybson_samara: Xanrum вот если на 4-5 ходов, то да

Xanrum: с 5 ю паками в рамках 50мс вот максимум на 12 ходов и выходит. С парой паков на 30 можно

Xanrum: там очень степенная зависимость - за. то пути ищут идеально

vrabosh: вы через рекурсию тоже делаете перебор.. и каждый раз передаете копию массива?

Xanrum: а вот это уже самое интересное и сложное

gybson_samara: Xanrum я на питоне пока, а не си

vrabosh: я так делаю.. в рекурсию передаю все данные копией массива..

Xanrum: там на каждый уровень рекурсии уже подготовлен переиспользуемый набор буферов

Xanrum: мне удалось сделать когда исключил все аллокации и создания чего либо в одном вложении рекурсии

vrabosh: поясни

Xanrum: там еще надо помечать что взял конфету и во вложенных рекурсиях другими паками видно было что там 0 очков

gybson_samara: не проще сразу сделать массив по количеству паков?

gybson_samara: взял миниму из столбика и вот оно

Uljahn: как рекурсию на таймауты контролить?

vrabosh: тут можно аптимизировать перебор до 20 ходов, думаю даже и до 30.. но это муторно..

vrabosh: построить граф сразу, где переходные пути длиные.. это как один ход для беребора

vrabosh: потом можно всякие тунели тоже делать как 1 ход

Hamibar: тут вопрос а нужно ли до 30-ти. Ведь чем длиннее путь тем менее точная оценка.

vrabosh: в переборе вроде как оценка максимальная... не зависимо от длины..

vrabosh: он в поле видимости допустим 30 возьмет максимум.

vrabosh: просто он в таком случае может 10ку отложить на самый последний ход. ему то пофиг когда брать сразу или потом

Hamibar: вражеских то паков не симулируешь

Xanrum: кто сказал что не симулирую..

Hamibar: через 30 ходов все может поменяться

vrabosh: каждый ход перебор меняет решенее

gybson_samara: Uljahn можно рекурсию в псевдопотоках запускать

Xanrum: Uljahn идет перебор 3 уровня рекурсии, 4, 5 - каждый шаг в разы затратнее предыдущего. Если за 6 не успело - используются данные полученные за 5

Xanrum: заранее не известно на какую глубину успеешь

Uljahn: о, iterative deepening

Hamibar: ну даже если симулируешь. Чем дальше от начальной точки, тем больше расхождений с тем как будет на самом деле. По крайней мере мне так кажется.

gybson_samara: Xanrum а зачем рекурсия, если можно по ГА взять просчитанные на 10 ходов пути каждого бота и прогнать?

Xanrum: там еще я так сделал что если клетка пустая (точно знаю. видел) и вокруг есть стены - то клутка считается за стену. Так целые изученные проходы отключаются

gybson_samara: Xanrum БАРАТН!

gybson_samara: это было слово Братан

gybson_samara: гениально

Xanrum: gybson_samara не проще, боты не используют тогда данные друг друга

vrabosh: можно еще делать стены куда вообще не стоит ходить... для будущих обработок..

gybson_samara: хотя у меня в эту клетку и так никто не пойдет

Xanrum: вот есть ткой длинный проход на 100 клеток. в начале 5 пустых а потом 95 заполненых - в них бот пойдет?

Xanrum: в первые 5

Xanrum: пока не зайдешь на глубину 6 не узнаешь что там есть или нет дальше

gybson_samara: я сейчас буду для каждого узла прописывать количество клеток, которые он види

gybson_samara: а там посмотрим

Uljahn: можно ещё построить области, куда максимум может дойти противник на каждом ходу, и для клеток вне этой области награду считать гарантированной, но это слишком очевидно

Xanrum: а еще увидев что враг появился из какого то прохода - понимать что в проходе пусто

Xanrum: это все нереально без багов реализовать

gybson_samara: как я и думал, та

gybson_samara: надо курить нампи, чтобы он посчитал колчиество клеток от точки x пока не встретил значение y

vrabosh: мне интересно ГА сделать просто ходьбы по лабиринту без боевки.. типа как в воод 1 было

vrabosh: кто быстрее соберет

vrabosh: тока не могу придумать.. как сделать обучение..

Uljahn: в ГА нет обучения, только перебор вариантов, мутация, скрещивание и оценка

gybson_samara: "подавлен, но не сломлен!" https://www.codingame.com/share-replay/465800386

vrabosh: это понятно.. какие данные давать.. что скрещивать?

vrabosh: точнее данные все давать.. где клетки находятся, сам лабиринт.. и видимый противник..

vrabosh: что с этими данными делать?

Uljahn: :upside_down:

gybson_samara: тут про эйлера была речь, вот моя игра с боссом серебра

gybson_samara: https://www.codingame.com/replay/465634663

Uljahn: vrabosh: без симуляции ГА не будет рабоать

vrabosh: да симуляция ходьбы за часик деалется

vrabosh: сами лабиринты отсюдого взял и накидал их штук 20.. хватит сголовой

Uljahn: ну вот, потом для каждого пака генеришь последовательность команд на 10 ходов вперёд, например, запускаешь на исполнение в симуляции, получаешь количество собранных пеллет

vrabosh: вот 10 раз он сходил.. я узнал кто лучше сходил.. что дальше

Uljahn: таких последовательностей генерируешь по нескольку тысяч, выбираешь лучшие, вносишь изменения, берёшь от лучших последовательностей кусочки и обмениваешься ими с другими лучшими

Uljahn: ты же смотрел видосы

vrabosh: поэтой теме не видел норм.

vrabosh: про змейку тоолько

Uljahn: https://www.codingame.com/blog/genetic-algorithm-mars-lander/

vrabosh: как он должен понять куда ему ходить из этих последовательностей? пускай ему хоть миллион их дам

Uljahn: понять не должен, у тебя же количество очков есть

Uljahn: ты выбираешь лучшую связку траекторий по сбору

vrabosh: я понял походу, что вы под симуляцией имеете веду.

vrabosh: не саму игру, а логику юнита

Uljahn: саму игру как раз, чтобы коллизии разруливать, юзать спид и т.д.

vrabosh: ну вот допустим взять гонки. там все просто.. я хочу понять на когда мне сбрасывать скорость а когда нет.. я просто беребираю и выбираю лучшие варианты

vrabosh: а тут какие коифициенты двигать?

Uljahn: :upside_down:

vrabosh: или допустим в картах там понятно.. ты картам даешь коифициенты какая учше какая хуже

Uljahn: ГА - это эволюционный алгоритм на основе отбора

Uljahn: запрягаешь рандом на службу человечеству и вперёд - к субоптимальному решению

Uljahn: посмотри картинки по ссылке, что я выше кинул

vrabosh: пойду читать.

vrabosh: всетаки в будущем хочется делать акцент на ИИ и ГА

Uljahn: Automaton2000: когда там техносингулярность у нас намечается?

Automaton2000: у меня не получилось объективную оценку на этом запилить

Default avatar.png ArturKuanov: ff

Default avatar.png ArturKuanov: est kto

Default avatar.png S0L0: словил таймаут, решил измерить в какой функции , самая долгая вот эта строчка (1 строка на входе) (self.state.my_score, self.state.enemy_score) = (int(i) for i in input().split()) чего тут можно ускорить ? весь расчет быстрее чем эта строчка.

tomatoes: бот лочится на этой строчке и ждет ответа соперника

tomatoes: в общем игнорируй и смотри что там следующее потребляет время

ashelkov: ищи ошибку или бесконечный цикл

WhiteCrow: Так, NightLuna разогналась?

NightLuna: нет, в топ100 отбирают мои вкусняхи, ну и еще бот ходит туда сюда

WhiteCrow: Надо будет заценить

WhiteCrow: https://www.codingame.com/replay/465867367

WhiteCrow: Доктор, а вы уверены в диагнозе?

WhiteCrow: https://www.codingame.com/replay/465869693

gybson_samara: WhiteCrow у тебя скорость по КД?

WhiteCrow: Ват?

gybson_samara: ты ускоряешься как только спадет время ожидания?

WhiteCrow: Да, если не вижу рядом ублюдков

Xanrum: а как еще можно?

WhiteCrow: Нууу...

WhiteCrow: А, ой

WhiteCrow: Нет у меня больше кода, который запрещает ускоряться рядом с противником

WhiteCrow: Так что да, по кулдауну

WhiteCrow: https://www.codingame.com/replay/465927863 Превозмогая собственную тупость

WhiteCrow: https://www.codingame.com/replay/465928521

WhiteCrow: Как они это делают?

ashelkov: это ты в легенду стучишся уже?

gybson_samara: тоже не спите ...

Xanrum: как же спать хочется, а легенда не дается

AntonT: все сидят)

WhiteCrow: https://www.codingame.com/replay/465929746

WhiteCrow: Это локально тестируюсь

gybson_samara: WhiteCrow первый реплей, 37 ход, ты тычешь в спину противнику без толка

WhiteCrow: Поправил один параметр, называется

WhiteCrow: Я вообще не замечаю противника :)

WhiteCrow: Сейчас поправлю ещё один и гляну...

gybson_samara: может пришло время щаметить

Xanrum: не знаю что делать когда в одну точку с врагом лезешь.. Если лезут - значит там вкусно, пропустить - сливает : (

gybson_samara: ####################################### ENEMY_FACTOR = 200#300#400 WAYS_COST = 25#20

ashelkov: я продолжаю стучаться

ashelkov: ничего не делай

Xanrum: я поджентельменски пропускаю

AntonT: как бы получше трекать соперника, чтобы не ходить по полю, и не искать съеденные им пеллеты, вот вопрос...

ashelkov: исходи из предположения что ты тормозишь очень прожорливого пака

ashelkov: я пропускал раньше

ashelkov: щас не

ashelkov: стукаюсь до последнего/

ashelkov: лучшее что ты можешь сделать - помочь другим паком елси будет поблизости контровой

Xanrum: вот если подиагонали в невидимое стучаться - там обычно стоит пропустить - там уже съедено и пак не знал об этом

Xanrum: а вот если лоб в лоб..

ashelkov: я про диагональ

WhiteCrow: Моя новая доктрина -- сожрать достаточно много пеллетов до того, как сожрут меня

WhiteCrow: И до того, как я начну шариться по пустым углам

Xanrum: когда я детектирую дмиагональ что долбит - пропуск дал буст по рейтингу

WhiteCrow: https://www.codingame.com/replay/465932450 DOMINATING

Xanrum: интересно - а если я пойду спать будучи на 34 месте - я проснусь в леге?)

gybson_samara: Xanrum не хочу никого огорчать, но если вы ляжете спать, вы можете вообще больше никогда не проснуться

gybson_samara: С добрым утром

Xanrum: а могу стать драконом - это ж так прекрасно будет

WhiteCrow: Что интересно, у меня стратегия сохраняет выбранные на прошлом шаге ходы и пытается улучшить

tomatoes: https://media.discordapp.net/attachments/700318015421546526/711312165621071922/cg.png

WhiteCrow: Только вот большую часть ходов она не делает улучшений вообще

WhiteCrow: Типа, стратегия фиксируется на несколько ходов

WhiteCrow: По идее это означает большое пространство для роста...

Xanrum: решил на контесте попробовать GO - у меня руки болят столько кода писать, циклов написал за неделю больше чем за весь прошлый год

tomatoes: в сравнении с чем?

Xanrum: C# и котлин

WhiteCrow: ГО для макак

WhiteCrow: джсоны перекладывать

gybson_samara: я тут сижу на питоне и стараюсь избегать циклов

WhiteCrow: Чё за жесть

WhiteCrow: Босса нагибаю

WhiteCrow: 1 победа из 10 при сабмите

WhiteCrow: (КЛУБНИЧКА) https://avatars.mds.yandex.net/get-pdb/1524429/f6595939-00ec-44bd-b907-841250fa6b29/s800

ashelkov: добавил себе в соперники топ 1 - и с 1го раза выиграл )) https://www.codingame.com/replay/465936794

ashelkov: случайно получлось

ashelkov: и второй выиграл

ashelkov: да что за жесть

ashelkov: посмотрим что сабмит покажет

WhiteCrow: Мне вот он что-то печальное показал

Xanrum: не знаю для каких мака GO - но вакансии явно интереснего среднего по шарпам. Хотя я не нашел ничего что на GO можно сделать быстрее, лучше или производительнее чем я на C# смогу

Xanrum: некоторое даже производительнее можно сделать через unsafe

WhiteCrow: C# мне тоже не нравится, но тут скорее субъективное, если уж честно

WhiteCrow: Go хорош своей тупостью и простотой

WhiteCrow: А потому внезапно становится востребован

Xanrum: у GO низкий порог вхождения если хочешь чтото высоконагруженное асихронное написать

gybson_samara: а где у нас проблемы с асинхронностью?

gybson_samara: ну кроме го

Xanrum: у го как раз нет проблем с асихронностью, меньше чем у любого другого языка что я видел

Xanrum: как не пиши - само получится асихронным в большинстве случаев

gybson_samara: само напишет коллбэк?

gybson_samara: даст ему имя, параметры?

Xanrum: да там даже колбека не будет

WhiteCrow: https://www.codingame.com/replay/465940438 Какое ничтожество

gybson_samara: Xanrum что там тогда за асинхронность? типа написал call async и все что за этой мстрокой вызовется по сигналу?

gybson_samara: и контекст весь сохранится?

Xanrum: и async и await не пишешь. Там этот пул потоков и управление контекстами при блокирующих вызовах сделано на уровне языка, глубоко глубоко - а не как в других сверху прикручено

WhiteCrow: https://www.codingame.com/replay/465942620

WhiteCrow: Ору

WhiteCrow: Есть мнение, что не пройти мне в легу, пока я не научусь бегать от злобный ублюдков

gybson_samara: Xanrum асинхронно это когда я тут вызвал, а там получил и это касается не всех вызовов.

Xanrum: поток ушел спать и работать дальше и вернется когда придет ответ, несмотря что код выглядит последовательно и без колбаков

Xanrum: *не ушел спать

gybson_samara: а пррограммист как?

Xanrum: а что программист?

gybson_samara: ну как он пишет, он же не знает когда там чего вернется

Xanrum: там есть абстрактный поток выполнения "горутина" который шедулится на реальных потоках

Xanrum: в общем садишь макаку, она пишет все поочереди, строчка за строчкой - а оно как то магически и ресурсы не потребляет

gybson_samara: как хром =)

Xanrum: в C# так же можно, у меня приложение на сотню запросов в секунду параллельно обрабатывает, но это все делает всего одним потоком. Там тоже нет колбаков, но есть Task Task Task

gybson_samara: http://chat.codingame.com/pastebin/f9f9d01d-dcc4-4666-bef3-4846b9d0938e