Chat:Ru/2021-03-13

From CG community
Jump to navigation Jump to search

Uljahn: 100k символов

wlesavo: ну на питоне полностью правильное отсечение невозможно сделать, ну по крайней мере там сам алгоритм надо оптимизировать а не реализацию

wlesavo: сам все хочу на плюсах сделать, но руки не доходят как-то

wlesavo: 376 на питоне это прямо очень достойно конечно, там человек явно что-то знает

wlesavo: у меня там сейчас что-то типа жадной эволюции для 7+

Uljahn: https://baguzin.ru/wp/razrabotka-optimalnoj-strategii-ig/

Uljahn: вот тут более-менее научный подход

vrabosh: а что такое жадная эволюция? я код сейчас оптимизировал, что 7 выполняется за 14 ходов, а 8 за 26 и тесты все прохожу..

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

vrabosh: while (time.time() - st) < 0.05 and isg:

                   guess, isg, i = find_guess(allGuess, cntAG, found)
                   cntAG += i

vrabosh: с длины 9 придется другой алгоритм писать. Хотелось одинм все сделать. Пойду статью прочту, может там идеи дадут

Uljahn: там идея в том, как оценивать информационную ёмкость вариантов отсечения

tutubalin: для 10 цифр количество коров вообще не имеет значения

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

MadKnight: vrabosh я не понял условия

tutubalin: через битовые маски легко комбинации записывать

tutubalin: и самое главное - очень быстро сравнивать

MadKnight: tutubalin так что ему нужно-то?

vrabosh: def find_guess(allGuess, cntAG, found): http://chat.codingame.com/pastebin/f9a643ce-2c5a-4fd0-952c-7fec3ccede72

vrabosh: MadKnight я хочу чтобы этот скрипт пока дойде то return мог млн раз пройтись

vrabosh: allGuess - дофига записей, в found до 20 допустим, и длина previous_guess десять

vrabosh: в 50мс уложиться)

tutubalin: нельзя объять необъятное

Default avatar.png uralbek: vsem privet

MadKnight: vrabosh суть задания-то в чём?

Default avatar.png alopikon: https://www.codingame.com/ide/puzzle/bulls-and-cows-2

MadKnight: vrabosh почему бы просто не сохранить все результаты за все ходы и разобрать их сразу объединёнными?

vrabosh: не понял тебя, что имеешь введу

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

tutubalin: для N=10 там более 3 миллионов вариантов в начале

tutubalin: на питоне просто так все не проверить

MadKnight: нене

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

MadKnight: а стартовые ходы можно каким-нить алгоритмом задать общие

tutubalin: стартовые то да. но вот потом надо найти список валидных комбинаций

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

tutubalin: либо использовать монтекарлу, и искать не все комбинации, а только некоторые

MadKnight: или скрестить как-то с qsort

MadKnight: причём не параллельным

MadKnight: можно в начале 10 ходов потратить на варианты типа 00000000 111111111 и тд

MadKnight: чтобы узнать общую статистику по цифрам

MadKnight: узнаешь сколько каждой цифры в числе

MadKnight: потом просто перебирай каждую цифру по очерди

MadKnight: из этого числа

MadKnight: сначала узнаёшь все расположения единичек

Default avatar.png alopikon: не, не если можно было одинаковые цифры можно было решить очень просто за 6 * лог(n/2) операций

MadKnight: а точно

MadKnight: -забыл что разные

MadKnight: ну так сделай обычный QSort с заменой 2 цифр и тестом на изменение в положительную или отрицательную сторону

MadKnight: можешь прям qsort и вызвать

MadKnight: а в лямбду передать вывод и затем чтение результата

MadKnight: из каких цифр состоит это число?

MadKnight: от 0 до n ?

MadKnight: хотя не, тут bubble sort

MadKnight: alopikon или чё там?

Default avatar.png alopikon: как понимаю основная трудность это убедиться то что ты не ломаешь счёт с прошлого state

tutubalin: если проверять 11111, 22222, 33333

tutubalin: то ты потратишь 10 ходов на выяснения малополезной информации

MadKnight: не, эт я думал что цифры могут повторяться

MadKnight: alopikon типа стараться по частям подбирать

MadKnight: tutubalin так а в чём сложность-то?

MadKnight: можно же по одной цифре вообще проверять

MadKnight: можно же просто подобрать все места для всех 10 цифр

MadKnight: перебором отдельных цифр

MadKnight: а, или у вас сумма за все 10 тестов?

Default avatar.png alopikon: ну там чем меньше ходов тем лучше тем более как ты будешь по одной цифре проверять в начале? и чтобы попасть на первое место тебе нужно где-то 30 ходов для каждого n

MadKnight: тогда ок

tutubalin: сложность в том, что это задача на оптимизацию. чем меньше попыток, тем круче

MadKnight: да я чёт думал что только за n=10 очки

MadKnight: мы заливать-то можем варианты с повторяющимися цифрами?

MadKnight: всмысле на вывод подавать

Default avatar.png alopikon: нет

Default avatar.png alopikon: в этом-то и сложность

MadKnight: да не так всё плохо

Uljahn: первая цифра - точно не ноль

MadKnight: Automaton2000 мы должны придумать ответный троллинг

Automaton2000: там как раз на этот угол и отклоняет

Uljahn: единственный подход - менять местами группы цифр, только вот как их выбирать...

MadKnight: сначала каждую пару

MadKnight: потом каждые 0123

MadKnight: строишь таблицу

MadKnight: зависимостей результата от поданного примера

Uljahn: я ещё пробовал сдвиги внутри подгрупп

MadKnight: там вроде возможно вот так:

MadKnight: 10 попыток на числа начинающиеся с i, где каждая цифра на 1 больше предыдущей либо 0

MadKnight: 1234567890 2345678901 ....

MadKnight: дальше ещё 10 попыток на то же самое, но каждые 2 цифры меняешь местами

MadKnight: дальше у тебя будет достаточно информации чтобы вычислить точные позиции цифр, но там будет 5 цифр на 5 мест

MadKnight: хотя стоп, я всё ещё думаю о варианте что у нас цифры могут повторяться

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

MadKnight: в общем я криво сформулировал итог этих 20 тестов, там на самом деле лучше

MadKnight: и не переставлять местами

MadKnight: а

MadKnight: 325476....

MadKnight: хотя стоп, без разницы

MadKnight: крч 20 ходов, и мы сделали разделение на лево и право, как в qsort

MadKnight: дальше делаем то же для 5ти х2 раза

MadKnight: +20 шагов

MadKnight: а дальше - для 2 и для 3

MadKnight: по 2 раза

MadKnight: 1 + 5(?) раз х2

MadKnight: погнали, изи 56 ходов на 10

MadKnight: tutubalin ты ещё тут?

tutubalin: ага

MadKnight: чё думаешь об этом методе?

tutubalin: 20 ходов - это прям очень дофига

tutubalin: там неопределённость примерно 22 бита

tutubalin: но за каждый ход получаешь больше двух бит

tutubalin: (если решать оптимально)

MadKnight: это как так неопределённость посчитали?

MadKnight: и что это означает?

MadKnight: типа число всех перестановок7

tutubalin: перестановок 3 миллиона. все равновероятные

tutubalin: log2(3e6) ~= 22

MadKnight: понял, 22 значит что можно 22 раза делить общее число возможных решений на 2 до тех пор, пока не дойдём до верного решения

MadKnight: и что по хорошему бы за каждый ход делить их на 4

tutubalin: но можно делить не на 2

MadKnight: ну вот на сколько оно делится если залить сначала 123...890 а потом 3254769810 ?

MadKnight: а, у нас же число правильных ответов

MadKnight: я почоему-то юзал только разницу с предыдущим результатом

MadKnight: хорошо, мы идём вверх с 0123 пока не найдём true>0

MadKnight: тогда делимся пополам, кидая половину цифр в области, где они выдавали 0, и узнаём, какие из 5 цифр правильны

MadKnight: дальше так же тестим 2 и 3

MadKnight: хммм не, слишком долго опять

MadKnight: не будем их отделять

tutubalin: тут выше ссылку на годную статью давали

tutubalin: там хорошо объясняется, как правильно делить

tutubalin: суть в том, на наш запрос вариантов ответов может быть очень много от 0:0 до 4:4

tutubalin: каждому из ответов соответствует множество возможных вариантов

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

MadKnight: так с этим-то и понятно

MadKnight: именно этим я щас и занимаюсь

MadKnight: в точности в таком понимании

MadKnight: тыж программист-олимпиадник

MadKnight: разбиение задач на математику - это норма

MadKnight: ну в начале нам полобому надо собрать какую-то информацию

MadKnight: в начале полюбому идём с 0123 вверх

MadKnight: хорошо, в начале мы проходим до 10 итераций с 0132 вверх, строя таблицу

MadKnight: потом берём любую диагональ где не 0, и поднимаем все нечётные числа на 2

MadKnight: итог - у нас есть ответ для этих же 5 чисел, у нас есть ответ для этих же других чисел, и у нас есть общий ответ

MadKnight: отсюда мы узнаём range числа правильных цифр в каждой из 4 диагоналей по 5

MadKnight: и что эти range'ы взаимосвязаны

MadKnight: дальше делаем так же но с разделением на 2 3 2 3

MadKnight: (всм что у каждой нечётной мы все цифры на 1 повышаем)

MadKnight: так стоп, это же до сих пор не включает остальных цифр

MadKnight: нет, я хотел дальше не так

MadKnight: дальше мы берём другую диагональ с >0, которую мы можем разделить на 2 3 2 3 так, чтобы эта статистика синхронилась с нашей статистикой по 5 5

MadKnight: и когда мы дойдём до 1 1 1 1....

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

MadKnight: и всё <20 итераций

MadKnight: tutubalin чёнить понял?

MadKnight: vrabosh а ты ещё тут?