• Почему вылезает ошибка при компиляции?

    wataru
    @wataru
    Andrei1penguin1, Давайте полный вывод команды (лучше на какой-нибудь pastebin, наверно). Обязательно допишите к команде "-Wl,--verbose" что бы все ошибки видеть. Еще результат dir c:/Python39/libs приведите.
    Заодно, откройте либы блокнотом и поищите в них "imp__Py_Initialize"
  • Почему вылезает ошибка при компиляции?

    wataru
    @wataru
    Andrei1penguin1, Найдите там все lib и все их подключите. Путь к ним в -L имена их в куче -l ключей.
  • Почему вылезает ошибка при компиляции?

    wataru
    @wataru
    Andrei1penguin1, Посмотрите на директорию python39\lib(s). Что там есть вообще? Какая-то библиотека оттуда должна пойти в -l параметр
  • Как реализовать алгоритм преследования игрока с учётом препятствий-полигонов?

    wataru
    @wataru Куратор тега Алгоритмы
    Magneto903, Ребра просто между вершинам не нужны. Это красное ребро ни в одном оптимальном пути содержаться не будет никогда. Это легко доказать (подумайте, что будет с длиной всего пути, если один из концов отрезка чуть-чуть подвинуть в одну или другую сторону). Нужны только стороны полигонов и взаимные касательные. Ну, и отрезки между двумя внешними точками и касательные с внешних точек. Этих ребер хватит.
  • Как реализовать алгоритм преследования игрока с учётом препятствий-полигонов?

    wataru
    @wataru Куратор тега Алгоритмы
    Magneto903, По поводу касательных - верхняя левая зеленая, рядом с красной, тоже должна быть красной. ведь она верхним концом не касается полигона.

    Все касательные с одного угла правильные. Видимо, проверка, что они вторым концом касаются полигона неправильная.

    В моих алгоритмах последняя точка не дублирует первую. Но допускается оборачивание вершин, и следующая за последней берется опять первая. Можно и дублировать, но тогда надо аккуратно циклы гонять что бы эта копия первой в конце не рассматривалась сама. Заодно можно и последнюю перед первой продублировать, тогда в циклах не надо будет брать индексы по модулю. Но так легко запутаться, поэтому я так не делал.
  • Как реализовать алгоритм преследования игрока с учётом препятствий-полигонов?

    wataru
    @wataru Куратор тега Алгоритмы
    Magneto903, Кстати, исправленная и дополненная версия лежит на гитхабе.
  • Как реализовать алгоритм преследования игрока с учётом препятствий-полигонов?

    wataru
    @wataru Куратор тега Алгоритмы
    Magneto903, К сожалению, у меня нет времени досканально копаться в вашем коде. Могу лишь дать советы.

    Сделайте интерактивный тестер. Создайте полигон, и стройте касательные с курсора и рисуйте их по какому-нибудь таймеру или событию перерисовки/перемещения курсора. Еще меняйте цвет полигона в зависимости от IsInside для курсора. Водите курсором по экрану, смотрите, чтоб было все правильно. Так можно проверить GetTangentsIds и IsInside. Эти функции основные и надо проверить, что они всегда работают правильно. Если будет ошибка, то захардкодьте координаты того, что на экране и пройдитесь дебаггером.

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

    Ваша картинка указывает, что скорее всего ошибка в IsTangent и в Intersects.

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

    Это вряд ли влияет на ваши тесты, но ваш IsInside с ошибкой. Вы считаете количество пересечений луча из точки вправо. Это хороший алгоритм, но тут крайний случай, если луч проходит через вершину полигона.

    Можно исправить это, изменив вашу проверку (yi > y) != (yj > y) на y > min(yi, yj) && y <= max(yi,yj). Тут важно брать один из концов (верхний или нижний) включительно, а второй пропускать. Тогда все случаи разберутся правильно.
  • Почему не происходит перемещение в нужную папку?

    wataru
    @wataru
    Andrei1penguin1, Вот где у вас cpython стоит? найдите cpython/initconfig.h и добавьте путь к папке в -I параметр.
  • Поиск целых корней кубического уравнения по заданным коэффициентам?

    wataru
    @wataru Куратор тега Математика
    artur_agishev, Совет на будущее, если в коде возникает такая мешанина из условий на десятки выражений, до стоит остановиться и подумать, как это упростить.
  • Можно ли на ЕГЭ по информатике в задании 6 и 16 просто переписать код в редактор и запустить и сразу получить готовый правильный ответ?

    wataru
    @wataru
    sam23q, Задание проверяет ваше понимание, а не умение нажимать ctrl-c, ctrl-v. Если вы проходите экзамен на каком-то специальном компьютере, то там почти наверняка отслеживается, что и когда вы запускаете. Там будут экзаменаторы, которые, если заметят, дадут вам по рукам или вообще выгонят с экзамена. Возможно, вы не сможете скопировать код из условия.

    Я бы не надеялся, что удастся запустить код из задания. Кроме того, почти наверняка просто внимательно прочитав код и прогнав его в голове по строкам, вы решите задачу быстрее.
  • Можно ли на ЕГЭ по информатике в задании 6 и 16 просто переписать код в редактор и запустить и сразу получить готовый правильный ответ?

    wataru
    @wataru
    sam23q, В других вопросах можно строить графики/вычислять формулы в wolframalpha, гуглить теоретические вопросы. Была бы возможность не спалиться, технические способы считерить есть почти для любого вопроса.
  • Что не так в использовании длинной арифметики?

    wataru
    @wataru Куратор тега Алгоритмы
    xmoonlight, Для очень больших n, но маленьких k можно применить трюк с возведением матрицы в степень. Это будет O(k^3 log n) вместо O(kn), Но умножений BigInt-ов, а не сложений. В приведенных в задаче ограничениях это не имеет смысла.
  • Что не так в использовании длинной арифметики?

    wataru
    @wataru Куратор тега Алгоритмы
    xmoonlight, Нет, тут нет простой комбинаторной формулы. Если бы не было ограничения на размер слагаемых, то ответ был бы 2^n, Если k=2, то ответ - n-ое число фиббоначи. Для произвольного k тут некое обобщение чисел фиббоначи. Простой и замкнутой формулы тут нет. Можно, конечно, иррациональные корни характеристического многочлена возводить в степень, как золотое сечение для чисел фиббоначи, но это применимо только для маленьких k, да и это решение будет гораздо сложнее при реализации, ведь тут нужна точность в сотни знаков. Это значит, надо вместо сложения BigInt-ов реализовывать произведения, деления, корни для чисел с фиксированной точкой.
  • Как исправить данный алгоритм?

    wataru
    @wataru Куратор тега Алгоритмы
    Дима Щеглов, Я об этом и написал в самом конце моего ответа. Но надо еще присвоение в начале исправить. Иначе алгоритм может упасть с выходом за границу массива.
  • Где найти стандартные библиотеки Си?

    wataru
    @wataru
    С gcc все должно идти в комплекте. Откуда gcc взяли, как настраивали?
  • Как решить эту задачу динамическое программирование?

    wataru
    @wataru Куратор тега Алгоритмы
    Sand, Это же самая стандартная задача на ДП.
  • Как составить формулу?

    wataru
    @wataru Куратор тега Алгоритмы
    Adamos, Вообще говоря, если N отрицательно, то и M может быть отрицательно.

    Тогда нужна такая формула: N+(N%p ? p-(-N)%p : 0)
  • Почти любой алгоритм, можно немного изменить, радикально уменьшив время его работы в лучшем случае. Как?

    wataru
    @wataru Куратор тега Алгоритмы
    xmoonlight,
    Если ты не умеешь в ассемблер и тебе непонятно что операция A всегда будет быстрее операций A,B,C, то, хорошо, вот тест:
    ----------------------------------------------------------------------------------------
    Benchmark                              Time             CPU   Iterations UserCounters...
    ----------------------------------------------------------------------------------------
    Sum1_bn/iterations:1000000000       3.30 ns         3.27 ns   1000000000 sum=5
    Sum2_bn/iterations:1000000000       3.38 ns         3.38 ns   1000000000 sum=5


    Вот код (используется gbenchmark, компилить без оптимизаций, иначе компилятор предподсчитывает все суммы сам):
    void Sum1_bn(benchmark::State& state) {
        unsigned char a = 3, b = 2;
        unsigned char sum;
        for (auto _ : state) {
            sum = a + b;
        }
        state.counters["sum"] = sum;
    }
    
    char precompute[256][256];
    void Sum2_bn(benchmark::State& state) {
        unsigned char a = 3, b = 2;
        precompute[a][b] = a + b;
        unsigned char sum;
        for (auto _ : state) {
            sum = precompute[a][b];
        }
        state.counters["sum"] = sum;
    }
    BENCHMARK(Sum1_bn)->Iterations(1000000000);
    BENCHMARK(Sum2_bn)->Iterations(1000000000);


    Вот ссылка на дизассемблер.

    > Это поиск значений по смещениям, начиная с адреса переменной имени массива. Это НЕ прямая адресация!

    Ты, видимо, не представляешь, как работают многомерные массивы в C++. Посмотри на дизассемблер. Особенно на операцию "movzx eax, BYTE PTR [rax]".

    > На будущее: в похожих случаях советую приводить факты с тестов (и код для запуска теста) перед необоснованными репликами в адрес своих оппонентов про глупость, чтобы выглядеть более достойно при ведении конструктивного диалога.

    На будущее, прежде чем писать умные слова, остановись и подумай, применимы ли они тут.
  • Почти любой алгоритм, можно немного изменить, радикально уменьшив время его работы в лучшем случае. Как?

    wataru
    @wataru Куратор тега Алгоритмы
    xmoonlight, Ну смиритесь уже, что глупость сморозили!

    прирост будет пусть лишь после 20,50,100 цифр


    Уже для 32 бит в "ключе" вам надо несколько гигабайт только что бы сохранить все предподсчитаные ответы. Для 20 цифр вы физически не сможете ничего сделать. Да и обращение к этому монстру будет медленнее тупо сложения частей ключа, потому что оно всегда будет не в кэше.

    список формируется однократно в начале, а прямая адресация к памяти быстрее, чем запрос через массив


    А куда делась ваша навороченная база данных с асинхронными запросами и шинглами? Во-первых, обращение к многомерному плоскому массиву - это и есть прямая адресация. Смотрите мою ссылку выше - компилятор тупо вычисляет адрес, умножая и складывая индексы.
    Далее, прямая адресация, как я уже говорил - самый быстрый способ использовать предподсчет. Но, даже если предположить что у нас бесконечная память и забить на кэш, то тупо сложение будет быстрее прямой адресации! Потому что сложение - это n операций add, а адресация - это n операций add и умножений/сдвигов. Плюс обращение по этому адресу. Даже если сложения заменить на or, то это быстрее адресацию не сделает, ибо в современных процессорах уже давно сложение и битовые операции занимают одно и то же время.
  • Как получить верное значение?

    wataru
    @wataru
    условие задачи напишите. А то неясно, как оно вообще должно считаться.