Chat:Ru/2021-02-10
Uljahn: tutubalin: я вижу стиль гольферского программирования :)
Uljahn: дальше не читал
magaiti: я для задачи недели стек не использовал, ну то есть использовал стек процесса, т.к скобки образатывал рекурсией
magaiti: https://www.codingame.com/replay/525302441
magaiti: на 320 прикольный финт
Uljahn: зачётный, при этом блокеры иногда себя странно ведут - уезжают за края
Uljahn: https://hsto.org/webt/5a/uv/0t/5auv0thr3tuz1kxvtt0nup7izj8.png
Uljahn: Automaton2000: eval(brainf*ck)
Automaton2000: хоть гугл говорит, что существует полиномиальный алгоритм для выяснения изоморфизма двух графов степеней не выше d, но там жесть какая-то ...
magaiti: за такой код в продакшене можно получить по сопатке
magaiti: так что мне пофиг какое там значение
tutubalin: Uljahn ну если гольферство убрать, идентификаторы обратно по-человечьи назвать, то получится чистая функциональщина: итераторы и генераторы
Uljahn: зачем нужно гольферство тогда?
Uljahn: читать же труднее на порядок, а профита нет
magaiti: спортивная дисциплина
magaiti: я помню на спектруме гольферство процветало из необходимости впихнуть в 48 кб побольше кода на бейсике
magaiti: типа 0 занимает 6 байт, а NOT PI - 2 байта
magaiti: единица NOT NOT PI - 3 байта
Uljahn: я про решение пазлов, там же нет учёта количества символов
magaiti: лайки получать за короткое решение
Uljahn: так можно же вообще в utf16 пожать, будет ещё короче :)
magaiti: не все осознают, что краткость, цикломатическая сложность, и удобочитаемость - это три разных величины
magaiti: и еще Maintainability Index
magaiti: хотя мантейнить пазлы
Uljahn: ну, сложность никуда не денешь, вопрос в том, насколько удачно получается её размазать по коду
magaiti: https://www.codingame.com/training/easy/temperatures/solution?id=3469678
magaiti: я ради такого пишу всякие приколы
Uljahn: нойс
Uljahn: "*min_element (" - тут пробел лишний или так норм?
Uljahn: или это у меня после перехода с py2 на py3 посттравматический синдром :upside_down:
magaiti: у меня такой был кодинг стайл 5 лет назад
magaiti: скобка за пробел плохо канает, хотелось либо перед, либо после ставить пробел
depthzer0: "так можно же вообще в utf16 пожать, будет ещё короче" а как пожать?
tutubalin: Uljahn вручную посчитал - 162 получилось
tutubalin: гольфинг просто - "потому что могу". на JS и TS сделал всё красивенько и ещё более функциональненько
Uljahn: depthzer0: str.encode('utf-16') или типа того, там нюансы есть с некодируемыми значениями
Uljahn: или наоборот, decode юзать
Uljahn: вот, что мне jacek скидывал, когда я спросил, как он веса нейронки в utf ужимает
Uljahn: >> to_encode = b"happy Caturday" >> encoded = to_encode.decode('utf-16') >> encoded '慨灰⁹慃畴摲祡'
Uljahn: http://chat.codingame.com/pastebin/4f23bc0e-7546-4068-8e66-210f1fdd01a0
depthzer0: :thumbsup:
tutubalin: magaiti последнее время пошла мода на функциональное программирование. мне, как олдфагу, это не очень нравится: читать и отлаживать это далеко не всегда просто. в качестве протеста я пишу в стиле FP, но так, что оно было ещё более нечитабельным и неотлаживаемым.
magaiti: фп отлаживать несложно, юнит тесты нужны
magaiti: отсутствие побочных эффектов должно упростить написание юнит тестов, по идее
magaiti: другое дело что я хз как этот ваш фп применять в реальной жизни
magaiti: и что вы под ним вообще понимаете
magaiti: нечитабельный и неотлаживаемый код можно писать в любой парадигме программирования, но зачем?
magaiti: никто не заплатит и на работу не возьмет с такими навыками
amurushkin: Uljahn: странновато как то для кодирования decode вызывать
Uljahn: amurushkin: декодируем байтстринг в стринг в нужной кодировке, насколько я понимаю
amurushkin: код выглядит просто странно
tutubalin: так вот у итераторов есть побочные эффекты. и прочитать состояние итератора не изменив его - ой как не просто.
tutubalin: да, нечитабельный и неотлаживаемый код можно написать в любой парадигме. а читабельный и отлаживаемый - не в любой. и вот я наблюдаю, как одна из таких парадигм бодро шагает по планете, захватывая всё новые рубежи
tutubalin: не, есть ситуации, когда FP как раз таки подходит лучше чем классическое императивное, например обработка асинхронных потоков
amurushkin: а в чем вообще суть этого ФП? везде писать map, fitler и тому подобные вещи? без лямбд чтобы не обойтись было?
tutubalin: основная суть - функцию можно (и нужно) передавать в качестве параметра в другую функцию
tutubalin: map, filter, reduce - это уже частные случаи
tutubalin: а, и ещё функцию можно возвращать из другой функции
Uljahn: мне понравилось с генераторами работать, когда комбинаторику использовал (перестановки, сочетания и т.д.), чтобы не хранить промежуточные результаты в списках, а на лету фильтровать, что нужно, клонировать генераторы, мапить, зипить и т.п., но думать конечно приходится несколько иначе
mabu: Функция без параметров — это константа.
magaiti: как правило передаются не функции, а закрытия. у них есть внутреннее состояние
magaiti: мутабельное
magaiti: https://en.cppreference.com/w/cpp/algorithm/generate
magaiti: вот например STL алгоритм, принимающий в качестве параметров ф-й объект без параметров
magaiti: естественно, от константы толку не будет
magaiti: т.к. есть std::fill
magaiti: фп полезно для распараллеливания обработки данных
magaiti: чем меньше внутренних состояний и глобальных переменных, тем проще раскидать
magaiti: а многоядерность это сейчас единственный способ не обломать закон Мура
magaiti: ждем машины с пятизначным кол-вом процов
magaiti: ядер*
magaiti: квантовым вычислениям улыбаемся и машем
amurushkin: это как на avx кодить. нужно думать по-другому
magaiti: ну в STL уже есть параллельные алгоритмы, другое дело что чтобы польза от них была, надо задачу разбивать правильно
magaiti: ну и в цг тебе в любом случае дают 1 ядро, вроде
amurushkin: magaiti: ну на avx там же регистры другие и все равно приросто есть
tutubalin: Uljahn массив можно вывести в stderr, а с генератором придётся повозиться
tutubalin: ну и иммутабельность - палка о двух концах. представьте себе иммутабельное дерево для MCTS, например
magaiti: генератор можно скопировать и вывести
magaiti: avx свои в каждом ядре, насколько я понимаю
magaiti: у тебя есть выбор использовать их или нет
magaiti: иммутабельное дерево для MCTS - почему бы и нет, если ты придумаешь эффективный алгоритм копирования
magaiti: гораздо интереснее для MCTS придумать асинхронный апдейт дерева
Uljahn: на arxiv попадаются попытки копать в этом направлении
magaiti: да, печально что в гоночках нет бонусов за топ 10 например
magaiti: как я слышал
amurushkin: да во всех играх бонус за топ 10 можно было бы
amurushkin: magaiti: насколько я понимаю то любые регистры свои на каждом ядре. а avx именно за счет своей разрядности позволяет производить параллельные вычисления
YurkovAS: а в гонках наверняка много интересного еще есть
amurushkin: самое интересно там у даропана или как его там. когда он обходил всех не понятно на каком алгоритме. жалко что он перестал учавствовать и сейчас его бот сломаный
YurkovAS: magaiti пробовал 50% времени симулировать своего блокера против раннера противника, и потом своего раннер против блокера противника + ходы тех?
YurkovAS: или пен? дапо вроде в последнем контесте для франции участвовал
YurkovAS: можно у него спросить
YurkovAS: это не дапоран, у него в гонках рабочий бот, играет плохо на 800 месте
amurushkin: YurkovAS: точно pen
YurkovAS: кстати, у дапорана в списке боем, есть бои с пеном и у того бот работает и проигрывает
YurkovAS: может старая версия
YurkovAS: значит можно найти у кого-нибудь старые удачные реплии пэна. может чего заметим
YurkovAS: и первые 4 реплея у пэна работают, против нейронок
YurkovAS: вот например. и там в параметрах есть такое pod_timeout=100 - может в иде можно так же против него позапускать https://www.codingame.com/replay/385812090
magaiti: у меня смитсимакс на одном дереве, 4 бота туда ходят по очереди
magaiti: если я уже не забыл
YurkovAS: да, а тут 2 раза запускаем смитсимакс. у меня такая схема показывает прирост примерно 10-15%
magaiti: 10-15% чего?
YurkovAS: относительно, когда все 4 пода одновременно обсчитываем
magaiti: прирост 10-15% чего?
YurkovAS: побед
magaiti: хмм
magaiti: сейчас времени особо нет химичить
magaiti: да и стремно ресабмитить, смитс тоже на 10% улучшил и до топ 10 не дошел
YurkovAS: у меня доходит
YurkovAS: там сейчас еще проще стало
YurkovAS: раньше на 5-м месте было 51.8, на 10 было 48.13, на 11 - 44.09
YurkovAS: https://imgur.com/a/Zplpi2t лучший сабмит 20201009
YurkovAS: главное, что не забыл похвастаться своим успехом в гонках :)
YurkovAS: надо найти новую простую мульти ...
YurkovAS: tomatoes ты тут?
tutubalin: Oware Abapa простая довольно
tutubalin: но там очков много не заработать
YurkovAS: oware сделал
YurkovAS: выбрал уже code-a-la-mode
YurkovAS: рефери на котлине :astonished:
tomatoes: не особо тут, но вкладка открыта
YurkovAS: tomatoes подскажи, плиз, по othello: ты используешь mcts? и получается не с рандомными доигрываниями, а с оценочной функцией?
tomatoes: ага, но там оценка примитивная очень
tomatoes: я сначала пытался EPT или вроде того, но в итоге сразу оценку вываливать стало лучшим вариантом
YurkovAS: EPT это же вроде оно и есть. и получается, чем меньше глубина рандомных игр, тем круче у тебя оценочная. т.е. при крутой оценочной, рандомных игр нет совсем, сразу оцениваем
YurkovAS: а оценочная прям реально простая? сколько не пытался, лучше всего заиграло со штрафами по сетке + мобильности как тут http://play-othello.appspot.com/files/Othello.pdf
YurkovAS: а ты ее нагуглил или сам придумал, оценочную?
YurkovAS: мне просто чтобы примерно понять, сколько еще на нее потом времени на эксперименты выделить...
tomatoes: углы, мобильность и помоему еще что-то не особо важное
tomatoes: ну там просто сумма с коэффициентами, немного поигрался только
tomatoes: там вроде как надо "шаблоны" на поле выискивать
YurkovAS: а мобильность это сделал не в оценочной, а в нодах в виде бонусов?
tomatoes: "n-tuples network" умное название
YurkovAS: это же для нейронок?
tomatoes: не, без бонусов. саму оценку загнал в -1 1 и дальше само вроде играет
YurkovAS: т.е. ты когда оцениваешь, делать разность кол-ва ходов твоих и противника?
tomatoes: да. оно что-то вроде нейронки, но я сам не дошел. это только в чате обсуждения были
tomatoes: да, ходы и углы, потом разница и нормализация
YurkovAS: нормализация? т.е. у тебя не только -1, 0, 1 на выходе будет
tomatoes: да, флоат там на выходе
YurkovAS: ого, круто! спасибо. ни где такое не юзал
YurkovAS: а этот флоат он привязан к юзеру, или общий?
YurkovAS: а, ну получается что общий
tomatoes: еще вроде как от стадии игры начало/середина/конец надо разным параметрам разные веса раздавать
tomatoes: я правда как обычно наугад, но наверное можно как-то осмысленнее
YurkovAS: ох, стадии, это будет сложно для меня
YurkovAS: можешь подсказать про нормализацию?
YurkovAS: т.е. переводишь float по нормализации к -1 1 и дальше если > 0 - то победил левый, иначе правый и очки различаются знаком?
tomatoes: n-tuples кстати именно в связке с отелло гуглятся различные пдф
YurkovAS: да я там ни чего не пойму, я же нуб
tomatoes: ага, вроде бы так получается
YurkovAS: ясно, спасибо!
tomatoes: я тож не осилил, но оно вроде толково должно получиться :sweat_smile:
YurkovAS: а где-то еще юзал такой подход с нормализацией?
tomatoes: а сходу и не вспомню, в покерчип вроде что-то подобное
tomatoes: но я там то ли за счет общей массы нормализовал, то ли чем-то похожим
YurkovAS: точно, в покере и в гонках - но там у каждого юнита свои макс-мин для нормализации хранятся
YurkovAS: круто, буду экспериментировать еще. спасибо!
YurkovAS: глянул покер, у меня там без нормализации, просто оценка сама маленькой получается т.к. массу делю на общую массу
mihei: в coding escape кто-то играл?
mihei: я конечно не лучшее время суток для ру чатика выбрал :)
lopidav: я играл
lopidav: спидранил туториал в основном
lopidav: быьил 12с
lopidav: *выбил