Chat:Ru/2021-02-10

From CG community
Jump to navigation Jump to search

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: *выбил