• Как записать это выражение?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Да, нижние индексы - это обозначение системы счисления. Так, 110 в двочиной - это 6 в десятичной, или вот то разложение по степеням двойки.
    Ответ написан
  • Отличие int32_t от std::int32_t?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это один и тот же тип. Просто для обратной совместимости, при запихивании его в стандарт, в std::int32_t протащили сишные типы. Вот код.

    Edit: я сначала перепутал, что куда протащили.
    Ответ написан
    Комментировать
  • Что не так в решении задачи?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проверка числа на простоту не так.
    Во-первых, начинайте c n=2, ибо 1 у вас иначе простым числом будет.

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Можно и по частям. Какой там алгоритм сравнения, если все сразу известно? Два указателя, по одному в каждом массиве. Выкидываем меньшее число из двух - оно уникальное в своем массиве. Если два числа равны - вы нашли совпадение и двигайте оба.

    Можно алгоритм поставить "на паузу". Вам надо будет хранить указатель в первом массиве между порциями второго.
    Когда у вас приходят данные от второго массива, двигайте указатель в первом, пока число там меньше текущего во втором массиве. Если они равны, двигайте оба. Если число в первом больше - дивгайте указатель во втором массиве. И так пока один из массивов не кончится.

    Если сложно сохранять указатель в первом массиве между порциями второго, то можно первый элемент второго массива искать в первом через бин поиск - так вы получите индекс без его сохранения.
    Ответ написан
    Комментировать
  • Отдельное окно, отдельный скрипт. Как?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Завист от того, как реализованы "действия" в каждом окне-игре.
    Если дело на windows, то есть шанс, что окно воспримет за клик получение сообщение WM_MOUSEDOWN/WM_MOUSEUP. Тогда можно просто посылать сообщения в каждое окно параллельно отдельной программой.
    Но для некоторых игр важно, чтобы окно было активно, а некоторые еще и детектируют кучу всего с мышью и надо именно что эмулировать движение мышью через mouse_event, например. Но, в этом случае мышь одна на оба окна, поэтому надо, чтобы оба "скрипта" посылали клики централизовано, через какой-то компонент с мьютексом, который бы вы полнял ровно одно действие в единицу времени.

    Нажатия на клавиатуру обычно срабатывают просто через посылание сообщений окну, т.ч. тут все легко параллелизуется.

    Нужные функции посылания сообщения и клика мышью - это winapi, но у него, по-моему, есть и обертка даже на питоне в модуле win32 и pyautogui.
    Ответ написан
    Комментировать
  • Что отвечает за предотвращение нежелательной записи в text секцию?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Память помечена, как read-only.
    Ответ написан
    Комментировать
  • Как найти решение для задачи?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Rsa97 правильно написал про геометрический смысл. Но есть более быстрое решение за O(n log n), использующее метод заметающей прямой.

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

    Если числа в задаче большие или нецелые, то сначала через бинпоиск или хешмап замените все координаты по X и по Y на их порядковый номер в отсортированном массиве (отдельно по каждой оси). Эта операция называется "сжатие координат". Теперь у вас все координаты целые числа от 0 до 2*n.

    Потом примените алгоритм "заметающей прямой". Представьте, что вертикальная линия двигается слева-направо и "заметает" картинку. Вам надо отслеживать, какие прямоугольники ее пересекают в каждый момент времени и проверить, что вся прямая покрыта в каждый момент.

    Для этого каждый прямоугольник (X1, Y1, X2, Y2) создаст 2 события "открылся отрезок с Y1 до Y2 во время X1" и "закрылся отрезок с Y1 до Y2 во время X2". Эти все события вы сортируете по X и в таком порядке обрабатываете.

    Для отслеживания состояния прямой используйте дерево отрезков на минимум с отложенной суммой. Эта структура данных потребует массив на примерно 4n элементов для дерева с 2n листами. Каждая вершина будет хранить минимум на соответсвующем ей отрезке. При открытии прямоугольника вы должны добавить +1 на его отрезок. При закрытии - вычесть 1. Сначала открывайте прямоугольники, если время у событий одинаковое. Учитывайте это при сортировке. Так касающиеся по вертикали прямоугольники не создадут пустых мест.
    Если после обработки какого-либо события вы получили минимум в дереве отрезков 0 и следующее событие имеет большую координату по X - то какая-то часть оказалась не покрыта. Еще есть случай, если первое событие не X1=левая граница покрываемого прямоугольника, или последнее событие - не X2=правая граница всего прямоугольника. Тут тоже покрытия нет.

    Еще, аккуратно с целыми числами, чтобы если у вас 2 прямоугольника касаются горизонтальными сторонами - там пустое место не подсчиталось. Например, каждый лист дерева отвечает за единичный отрезок координат. Тогда изменяйте в дереве всегда отрезок от Y1 до Y2-1 для события с координатам Y1..Y2.
    Ответ написан
    7 комментариев
  • Какая будет единая формула для ячейки?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Разница по горизонтали всегда +2. Значит число из строки 2 будет входить с коэффициентом 2.
    По вертикали разница на -1. Значит число из столбца B будет с коэффициентом -1.

    Итак, формула -1*$B3+2*C$2 - 1 . -1 в конце подбираем так, чтобы в самой первой ячейке оказался 0.
    Ответ написан
    Комментировать
  • Каким алгоритмом воспользоваться для поиска вхождений диапазона чисел в другой диапазон?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Самое быстрое решение - с использованием двумерных структур данных, вроде двумерного дерева отрезков.

    Вы каждый отрезок представляете в виде точки на плоскости. Когда приходит новая точка, вам надо в квадрантах относительно нее (левый верхний и правый нижний) найти минимальный номер точки. При нахождени , она удаляется из мтруктуры данных и вы нашли ей пару. Иначе добаляйте новую точку в структуру данных.
    Ответ написан
  • Можно ли так доказывать правильность алгоритмов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Если их нельзя переворачивать и при равенстве высот все-равно можно вложить (а не только строго меньшее), ио алгоритм правильный. Но доказательство не полное. Надо доказать, что любая неубывающая последовательность в этом массиве даст веладывающиеся прямоугольники.
    Ответ написан
    7 комментариев
  • Как "склеить" два файла?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Большой и сложный бинарник вы так не встроите. Максимум, отдельные функции.

    Для винды можно ваш второй файл сделать в виде dll и выпоннять код во время ее загрузки. Чуть подправить исполняемый файл или вообще просто положить dll-ку рядом с exe-шником - и библиотека загрузится.

    Или можно найти пустое место в целевом файле в секции кода. Воткнуть туда вашу функцию и поменять точку входа на нее (а сама функция потом прыгает на изначальную точку входа). Если места нет, то придется увеличивать секцию кода.

    В этом случае, надо изучить устройство PE файла, понимать немного ассемблера.
    Ответ написан
    Комментировать
  • Как компилировать общие файлы двух бинарников один раз?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Да. Любая система сборки будет компилировать только один раз. Будь то cmake, ninja или visual studio.
    Ответ написан
    Комментировать
  • Насколько полезен аппаратный генератор случайных чисел для вероятностного моделирования и экспериментов?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    1) Хорошие современные ГПСЧ стат тесты все проходят без проблем.
    2) Нет, ибо любое распределение можно получить из равномерного на 0..1, стоит только воткнуть его в обратную функцию к функции распределения.
    3) Не совсем правда. Если только вы не генерируете гигабайты случайных числел, их производительность достаточно хороша, чтобы не быть бутылочным горлышком.
    4) Не особо уверен.
    5) Вряд ли.
    Ответ написан
  • Как решать задачи на разбиение фигуры на сектора по цветам?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Лемма бернсайда. Гуглите. Но суть в том, что надо подсчитать количество раскрасок, которые не меняются при повороте на какой-то угол. Для всех углов сложить и поделить на количество поворотов.

    Поворот на 1<=i<=42 секторов создает gcd(i,42) циклов, каждый из которых должен быть окрашен целиком в один из 6 цветов. Т.е. получается 6^gcd(i,42) раскрасок, инвариантных для поаорота на i секторов.

    Отсюда ответ к задаче: sum i=1..42 6^gcd(i,42)/42.
    Ответ написан
    2 комментария
  • Почему отказались от оператора GoTo в высокоуровневых языках?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Поскольку goto позволяет писать очень запутанный и непонятный код. Слишком легко написать плохой код.
    Ну не могут люди в голове удерживать спагетти из кучи возможных путей исполнения. if/else, да циклы - это людям понятно. Появилась инструкция goto изначально, потому что в машинных кодах, а значит и в асемблере эта инструкция есть. Оттуда она перекочевала в языки более высокого уровня. Процессоры, наоборот, if/else вообще не умеют. Вместо это там всякие условные goto.
    В новых языках программирования goto вообще нет, а в старых его обычно запрещают использовать в правилах кодовой базы. Если кто злоупотребляет - ему дают по рукам.
    Ответ написан
  • Ошибка unterminated string literal?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Кавычек закрывающих нет.
    Ответ написан
    Комментировать
  • Как решить ошибку argument of type ‘float’ is not iterable в Python?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Чтобы проверить, что число a делиться на b, надо проверить, что остаток от деления равен 0: a % b == 0

    У вас же там происходит деление на 4 и 6, которое возвращает дробные числа, они же float.
    Ответ написан
    Комментировать
  • Как в коде метода Лагранджа и Ньютона выводился правильный ответ а не inf?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Так у вас у точек x одинаковые значения. Так вообще-то делать нельзя. Ваше условие x[k] != x[i] - костыль, который ничего и не решат. Вот интерполяция же, она же строит функцию, которая через заданные точки проходит. И вот в этом одинаково x у вас разные значения y - через какую из двух точек должна проходить функция?

    Исправляйте входные данные и все заработает.
    Ответ написан
    Комментировать
  • Как вывести минимальный элемент из динамической библиотеки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    jidomasson, Вот и проблема (код из комментариев к вопросу):

    second_element = ctypes.c_int(A[1])
    begin = ctypes.pointer(second_element)
    
    last_element = ctypes.c_int(A[size - 1])
    end = ctypes.pointer(last_element)


    Тут вы, похоже, созадете новые объекты типа c_int и присваиваете им значения второго и последнего элементов массива. А потом указатели на них передаете в функцию. Функция ожидает указатели на элементы массива, а получает указатели на какие-то 2 никак не связанные между собой переменные. Поэтому она блуждает по левой памяти и просиходит что угодно. Хоть падение, хоть зависание.

    Вам надо брать указатели от A[0] и A[size-1] нарпямую.
    Ответ написан
  • Как правильно сдвинуть биты?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Идея правильная, но битовые маски - нет. Чтобы взять a7 надо действительно сделать & 0x80. Но для a6 надо брать & 0x40. Потом идут 0x20, 0x10, 0x08, 0x04, 0x02, 0x01.

    Ваше 0x70 - это 0b01110000 - три бита вместо одного. Повторите 16-ричную систему счисления.
    Ответ написан
    1 комментарий