• Можно ли бесконечное число планет выпрямить в бесконечную плоскость?

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

    Количество планет - счетное (Можно по спирали их все занумеровать).
    Каждая планета в форме блина - континуум ("количество" точек в плоскости или в круге, или на отрезке).

    Счетное количество континуумов - тоже котнинуум по мощности.
    Плоскость - тоже континуум.

    С точки зрения теории множеств - плоскость и поверхности всех планет равномощны.
    Ответ написан
    5 комментариев
  • Почему T * может работать ощутимо быстрее (~ на 25-30%) в качестве хранилища данных, чем std::byte *?

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

    Создайте 2 функции, которые отличаются только вот в этих вот местах.
    Вставьте код в https://godbolt.org/

    Смотрите ассемблерный код для двух функций.

    Может, срабатывает strict aliasing. Видя тип T сомпилятор понимает, что эта переменная не может быть изменена какими-то другими std::byte в соседнем коде и может, например, пропустить загрузку-выгрузку данных в регистр из памяти.

    Может вообще что-то другое.

    Единственный вариант разобраться - это смотреть на ассемблерный код функций, которые вы и сравниваете. Не каких-то кусков, оттуда надерганных, а функций целиком.
    Ответ написан
    Комментировать
  • Ошибка Unhandled exception at 0x0099B514 in ConsoleApplication15.exe: 0xC0000094: Integer division by zero. Как исправить это?

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

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

    Очевидно, что size/3 оказывается 0, потому что size меньше 3.

    Надо менять логику. Или отдельно обрабатывать случай size = 0,1,2 или не делить на 3. Вообще, неясно, откуда в этом коде 3 вылезло и что оно означает.
    Ответ написан
    Комментировать
  • Почему может быть ошибка во время компиляции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема вот тут:
    parent.resize(++n);
    glub.resize(n);
    for (int i = 1; i <= n; i++) {


    Выход за границу массива. Неопределенное поведение.
    Вы выделяете массивы длины n (увеличенного на 1) и потом проходитесь от 1 до n (увеличенного на 1). Но ведь индексы в массиве только до n-1.

    Правильно так:
    parent.resize(n+1);
    glub.resize(n+1);
    for (int i = 1; i <= n; i++) {
    Ответ написан
    5 комментариев
  • Как реализовать идентификацию объектов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    unordered_map<ID, Material>
    Ответ написан
    Комментировать
  • Как превратить подстроку вида "min ( a, b )" в "a min b"?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Решение попроще, за квадрат:
    Пропустили ведущие и trailing пробелы, проверили, что строка начианется с "min" (иначе ничего делать не надо, возвращаем все).
    Потом заведите счетчик открытых скобок, пройдитесь до первой запятой внутри одной пары скобок. Рекурсивно преобразуйте левую часть, добавьте к этому min и результат рекурсивного преобразования правой части (от зяпятой до закрывающей скобки в конце).

    Решение поумнее, за линию:

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

    Итак, функция, опять же, проверяет, что есть min. Если нет - возвращает всю строку до первой "," или непарной ")" - нужен счетчик открытых скобок.
    В противном случае, пропускает "min", "(". Рекурсивно преобразовывает от этой позиции. Потом смотрит, что после позиции, которую вернула рекурсивная функция, лежит ",". Иначе - ошибка. Добавляет min к ответу, Рекурсивно преобразовывает оставшееся и добавляет к ответу. Проверяет, что дальше после позиции где закончила обработку рекурсивная функция лежит ")". Возвращает следующую за этим позицию.

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Знаете 2 точки дуги - знаете длину хорды. Дальше надо на листке нарисовать окружность, хорду и серидинный перпендикуляр. Нарисовать несколько прямоугольных треугольников и найти длину куска от центра хорды до искомой середины. Пусть центр O, исходные точки A,B а искомая точка - M. Середина хорды С. OM = R. OС^2+CB^2=R^2, CM = OM-OC.

    Итого - длина искомого куска CM = R - sqrt(R^2-|AB|^2/4)

    Для нахождения координат M надо взять середину отрезка AB и отложить от нее перпендикулярный AB вектор длины по формуле выше.
    Ответ написан
    Комментировать
  • Ошибка ссылка на резрешенный внешний символ, как исправить в c++?

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

    Почитайте документацию библиотеки, надо в свойствах проекта добавить библиотеку curl линкеру.
    Ответ написан
    Комментировать
  • C++ как использовать функции winAPI?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вот это GetModuleHandle, например: Вводите в гугле "GetModuleHandle win32". Получаете ссылку вот сюда.

    Там прямо в заголовке написано libloaderapi.h
    Значит, вам надо делать #include "libloaderapi.h"

    Вот так по каждой интересующей вас функции надо найти документацию от microsoft. Там обычно написано, в какой библиотеке оно лежит и в каком заголовочном файле.

    Этот заголовочный файл является частью windows sdk.

    Как вызвать - смотрите в той же документации, какие параметры функция принимает. Или гуглите "GetModuleHandle example".
    Ответ написан
  • Где ошибка в задачке с возможными ходами ферзя?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    int(A[i][j]) == 70). Блин. А A[i][j] == 'F' написать религия не позволяет?

    А ошибка в том, что у вас в циклах, которые по диагонали знаки ставят, условие выхода некорректное.
    У вас там <= 8, когда как индексы в матрице от 0 до 7. И при координате равной 8 вы пишите в какую-то левую память. Иногда совпадает, что это начало следующей строки. Иногда вы можете перезаписывать какую-то другую переменную. Вообще, программа может и упасть с ошибкой.
    Ответ написан
    2 комментария
  • Как вычислить количество шагов для вычисления чисел Фибоначчи?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Составьте рекурентное соотношение. Пусть S(k) - сколько шагов надо для вычисления k-ого числа.
    Это будет 1 шаг (сумма в конце), плюс сколько надо шагов, чтобы подсчитать слагаемые. Т.е.:
    S(k) = S(k-1) + S(k-2) + 1
    И известно, что S(1) = S(2) = 0

    Уже можно это все подсчитать, как если бы вы числа фиббоначи считали. Хоть рекурсивно, хоть циклом (что, конечно, быстрее).

    Но можно добавить в обе стороны урванения +1 и сгрупировать слагаемые аккуратно:
    S(k)+1 = S(k-1)+1 + S(k-2)+1

    Тогда, если обозначить G(k) = S(k)+1, то получится:
    G(k) = G(k-1) + G(k-2) и G(1) = G(2) = 1

    Т.е. ответом будет предыдущее число фиббоначи минус один (нам же S(k) = G(k)-1 надо. Плюс, у вас числа с 1,2 начинаются, а тут с 1,1).
    Принципиально от вычислений выше не отличается, но наблюдение интересное.
    Ответ написан
    Комментировать
  • Как быть когда сущность из одного модуля требуется в другом модуле?

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

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

    Надо отдельно обработать случай y == y1
    Ответ написан
    Комментировать
  • Как сделать факториал деление?

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

    Вычислили 1/2. Это просто. Потом 1/(1+1/2). Это тоже просто, ведь 1/2 у вас уже есть. Потом вычислите 1/(2+(1/(1+1/2)). Последняя часть уже вычислена. Если ее обозначить за X, то вам надо подсчтитать 1/(2+X).

    Фактически у вас будет цикл на n итераций, и внутри вы будете пересчитывать этот самый X по формуле вроде X = 1/(n-i + X). Аккуратно посмотрите, может надо там +-1 куда-то вставить рядом с i.
    Ответ написан
    3 комментария
  • Как в php сравнить два огромных txt файла до 100гб, удалив дубликаты?

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

    Сортировка очень больших файлов - тоже стандартная тема. Лучше всего, наверно, подойдет radix sort. Правда, нужно будет свободного места на диске чтобы копии файлов тоже помещались, да лучше с запасом. Тут надо будет 3 раза (или какая там у вас длина строки) прочитать файл. Прочитанные строки надо распихивать по 256 (или сколько там символов различных может быть) файлам. Потом все эти файлы надо собрать воедино в нужном порядке.

    Надо только хорошо порыться в документации - нужны функции php которые читают файл построчно и не грузят его весь целиком в память. Если, конечно, у вас не ~128гб оперативки. Тогда лучше каждый файл загрузить в память целиком и сортировать quick sort'ом.
    Ответ написан
    Комментировать
  • В чём отличие хэш-таблицы от словаря и ассоциативного массива в C#?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Словарь и ассоциативный массив - это синонимы. Хеш-таблица - это вариант реализации словарей.
    Ответ написан
    2 комментария
  • Существует такое понятие, как "Ассоциативный список"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Я бы это назвал списком режимов. Ассоциативный список - это что-то самопротиворечивое. У вас же просто список пар значений.
    Ответ написан
    Комментировать
  • Почему VS22 указывает что функция якобы не определена?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Кем подчеркивается? Оно компилируется нормально: https://godbolt.org/z/oMc89TE13

    Возможно ваше IDE не умеет в последние стандарты С++.
    Ответ написан
    6 комментариев
  • Как записать условие?

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

    есть_столбец_с_нулями = ложь
    Для каждого столбца j
      количество_нулей = ПодсчитатьКоличествоНулейВСтолбце(j)
      если количество_нулей >= 2 то
        есть_столбец_с_нулями = истина
    
    Если есть_столбец_с_нулями
      НайтиСуммуЭлементовНадДиаганалью();


    Функция для подсчета нулей в столбце простая - пройдитесь циклом по всем элементам столбца (по строкам). Если текущий элемент ноль - то увеличивайте счетчик.

    Можно не писать отдельную функцию а просто воткнуть вложенный цикл.
    Ответ написан
    1 комментарий
  • Как циклом Python for пройти несколько (сотен) range?

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