Задать вопрос
  • Насколько полезен аппаратный генератор случайных чисел для вероятностного моделирования и экспериментов?

    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 комментарий
  • Что такое пул в программировании?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    pool - переводится не только как "бассейн", но и как "общий фонд". Пул в пограммировании - это набор однотипных ресурсов, которые переиспользуются по мере надобности. А при осовбождении - возвращаются в общую кучу. Так экономятся расходы на создание и уничтожение этих ресурсов. Бывают пулы почти чего угодно: потоков, буферов, каких-то объектов.

    Например, вместо того, чтобы запускать поток под каждое новое подключение в сервере, у вас есть 20 потоков, которые просто ничего не делают, а когда появляетсся подключение, какой-то из свободных потоков его обрабатывает. Если свободных потоков нет, возвращается ошибка, или соединение ждет в очереди. Когда оно обработано, поток возвращается в пул, вместо уничтожения. Это работает хорошо, потому что создание потоков - сложная и дорогая операция. Гораздо дешевле поток усыпить и засунуть какой-то дискриптор в какую-то структуру данных.
    Ответ написан
    Комментировать
  • Как избавить от заданных размеров количества строк и столбцов при считывании из файла?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Читайте построчно до конца файла. У вас уже эта проверка есть там, где вы fscanf делаете - вы же проверяете, что оно вернуло? А столбцов у вас всегда 3.

    Если проблема с тем, что у вас массив, куда вы читаете, ограниченного размера, то можно, например, завести его достаточно большой длины, с запасом. Как у вас там 101 символ выделен под кажую строку. А еще лучше, если у вас C++, использовать std::vector - ему можно длину динамически менять. Если же это C - то пишите свою собственную логику увеличения массива, через malloc и realloc по мере заполнения.
    Ответ написан
    Комментировать
  • Что подразумевается под поиском двух линий при создании контейнера?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    У вас есть куча вертикальных столбиков с заданными высотами. Вам надо взять 2 столбика так, чтобы между ними было больше всего воды. Они образуют загогулину вроде |____| - это и есть контейнер, в котором может быть вода (если мир двумерный). Например если в примере взять самый левый (1) и самый правый (7) столбики, то высота воды будет 1 (иначе она слева выльется), а ширина будет 8 - итого получается 1*8=8 единиц воды.

    Формально, вам надо найти такие i<j, что min(h[i],h[j])*(j-i) максимально.
    Ответ написан
    2 комментария
  • Как исправить ошибку undefined reference to при коспиляции кода с++ в VS?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Как собираете проект? Ошибка в том, что линкер не может найти определение метода, потому что оно в другом cpp файле, а он не включен в сборку.
    Ответ написан
  • Преобразование шрифта?

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

    Например, "б" в слове "большое" - это символ 0x0431

    Проблема в том, что там символы не из одного алфавита, а полная солянка. На этом сайте можно получить коды всех символов: https://www.rapidtables.com/convert/number/ascii-t...
    Получите:
    1D04 1D00 28D 43E 1D07 20 431 43E 1D27 44C 26F 43E 1D07 20 28D 43E 1D29 1D07


    Как видите, они все разбросаны довольно сильно. 1D** - Phonetic Extensions . 04** - Cyrillic, 02** - IPA Extensions

    Символы из разных алфавитов подобраны по внешней похожести на нужные буквы (как Ш - это перевернутая m вообще). Наверно, какой-то онлайнг конвертер вроде этого где-то имеет набор из 33 кодов и подставляет их вместо русских букв. Не знаю, есть ли такой обратный.

    Можно написать обратный конвертер на том же питоне, только надо руками сопоставить каждому символу из текста нужный символ из обычного ascii. Например, заведите солварь (вам надо руками все встречающиеся символы в исходной строке туда добавить):
    convert = {'ᴀ': 'а', ... 'ʍ':'м', ...}

    Потом примените его ко всем символам в вашей строке каким-нибудь map().
    Ответ написан
    Комментировать
  • Адрес сайта с нормальными гайдами по алгоритмам?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Есть русский сайт e-maxx.ru/algo
    Есть сборник кучи алгоритмов, но там мало объяснений: https://rosettacode.org/wiki/Rosetta_Code
    Ответ написан
    2 комментария
  • Как переделать код согласно современным стандартам?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам точно надо, чтобы значение класса нельзя было перемещать? Если вы только разрешите конструктор и оператор перемещения, то можно будет засунуть ваши элементы в обычный std::vector.
    Ответ написан
  • Как соединить рандомные точки на координатной плоскости в многоугольник?

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

    Надо точки как-то отсортировать. Например, берете самую нижнюю, из всех таких самую левую. Сортируете все оставшиеся точки по углу, относительно этой (по значению atan2(yi-y0, xi-x0)), при равенсве угла по расстоянию (не важно по возрастанию или убыванию). Потом в таком порядке их соединяйте, пересечений не будет.

    В примере из вопроса оно как раз отсортирует их как на картинке.

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

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

    Вообще, у вас там разыменование нулевого указатяля, что есть UB и делать это категорически нельзя.

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

    Вам лучше подойдут указатели.
    Ответ написан
    2 комментария
  • Как доказать, что группы неизоморфны?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Надо найти какое-то противоречие в структурах групп.
    Например, в C есть элементы {1, i, -1, -i}. Это 4 различных элемента которые при умножении сами на себя дают 1. Если группы изоморфны, то должны быть 4 соответствующих им элемента в R, все - квадратные корни из 1. Но в R таких только 2: {1, -1}.

    Во втором примере можно привязаться к 0. в Q есть 0, умножив на который всегда получится 0. Но нет элемента, прибавив которой всегда получится одно и то же число.

    Опять же, 0 в {Q, *} не имеет аналога в {R, +}
    Ответ написан
    Комментировать
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    2. Этот код не для Windows;


    Там нет ничего платформо-зависимого. Если установите какой-нибудь mingw на windows, то оно makefile съест.

    В крайнем случае, установите любой C компилятор и введите команду вручную (последняя строчка тут)

    3. Если я в формуле a³+b³+c³=3 поменяю 3, на 0 будет ли программа правильно считать?

    Там в описании написано "cubefree k = +/- 3 mod 9 at most 1000", т.е. для k=0 не сработает.

    Поможете сделать код лучше?


    Выкиньте цикл по c. Вам не надо его перебирать, а вам надо решить уравнение c³=3-a³+b³.
    Для чего просто вычислите значение справа, потом возьмите кубический корень: int((3-a**3-b**3)**(1/3.0)). Не забудьте только проверить, что это значение c подходит, ибо тут корень округляется до целого. И не факт, что уравнение выполняется.
    Ответ написан
  • Насколько хорошая практика использовать обертки над операторами?

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

    Но вы этот оператор передаете всего в нескольких местах на всю кодовую базу и все. Писать так функции, которые вы используете кучу раз - очень плохая идея.

    И вообще, довольно редко есть смысл так заморачиваться. Код становиться хуже поддерживаемый. Экономите вы совсем чуть чуть повторяемого кода. А потом придется всякие заморочки делать, вроде, в делении надо проверять на 0, а в умножении проверять на переполнение и т.д. Этот общий код становиться уже чуть ли не длиннее если все по отдельности делать. И уж точно хуже читаемый.
    Ответ написан
    Комментировать