• Как генерировать случайные числа в вычислительной системе?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, задача — сгенерировать случайные числа по закону Гаусса.
    Если есть Си++11, копай модуль <random>.
    Если нет, простейший способ сгенерировать — F⁻¹(ξ), для этого есть бэ-мэ качественные приближения обратного распределения Гаусса.
    Есть также более «лёгкий» способ генерировать такие числа по два сразу, гугли.
    Ответ написан
    Комментировать
  • Как вшить .mp4 файл в .exe С++?

    @Mercury13
    Программист на «си с крестами» и не только
    На данный момент вы вызываете внешний плеер, причём не важно, какой — системный ассоциированный с расширением MP4. Не забудьте, что в такой ситуации внешнего плеера уже не будет, придётся налаживать свой.

    1. ОС-зависимые ресурсы (например, ресурсы Windows). Поскольку тут у вас и так WinAPI, этот способ вполне катит.
    2. Обёртка Qt или чего-то другого над этими ресурсами: где они есть, ресурсы, а где нет, простые массивы. Использовать, если и без того используете Qt.
    3. Склеить EXE-файл с MP4. Главное — придумать способ разделить их обратно (например, добавить четыре байта длины в конце).
    4. Преобразовать MP4 в байтовый массив, вставить в какой-то CPP.
    5. Вариант 4, но более быстрый в компиляции: Использовать ожидаемую функцию Си #embed.
    Ответ написан
    Комментировать
  • Как доказать, что если множество (G \ H) ∪ {1} — подгруппа G, то либо H = {1}, либо H = G?

    @Mercury13
    Программист на «си с крестами» и не только
    Обозначим обратный через x*, так писать проще.

    Берём элемент h∈H, ≠1 и другой g∉H, ≠1. Заметим, что:
    • h*∈H, ≠1, а g*∉H, ≠1
    • gh, hg, g*h и т.д. в любых сочетаниях ≠1.

    Вариант первый. x=gh∈H. Множим справа на h*, и получаем xh* = ghh* = g. Слева штуки из H, справа нет — H не замкнута.

    Вариант второй. x=gh∉H. Множим слева на g*, и получаем g*x = g*gh = h. Слева штуки из нашей подгруппы (G \ H) ∪ {1}, справа нет. Так что подгруппа явно не замкнута.

    Для полугрупп с единицей, о которых ты пытался говорить, это НЕ ТАК. Как известно, у любой конечной полугруппы есть идемпотент — тем лучше. Пусть G = B², H={00, 10}, операция — побитовое ИЛИ, E=00. Тогда множество (G\H)∪E={00,01,11} явно замкнуто относительно ИЛИ. (Я пытался вводить ажурные B и единицу, а система стирает.)
    Ответ написан
    Комментировать
  • Преобразование шрифта?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот разбор строки.
    6638d576265ed231173995.png

    Совместимая декомпозиция NFKD (а лучше совместимая композиция NFKC) конкретно тут не поможет (не меняет ни одного символа), но в других случаях может улучшить жизнь.

    Затем тебе придётся работать с визуально сходными символами, и начинать надо отсюда.
    https://util.unicode.org/UnicodeJsps/confusables.jsp

    6638d67702c6c545558246.png

    Этого тоже мало, но вот с этого начинать надо.
    Ответ написан
    Комментировать
  • Как переделать код согласно современным стандартам?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы с неинициализированной памятью работаете почти правильно, но…

    Первое. Надо указать выравнивание класса.
    MyClass* arr = (MyClass*) operator new (sizeof(MyClass) * 10,
                                            std::align_val_t(alignof(MyClass)));
    . . .
    operator delete(arr, std::align_val_t(alignof(MyClass)));


    Второе. А нельзя инкапсулировать подобную работу с памятью в класс, чтобы конструктор выделял память и деструктор отдавал? Я сделал вот такое.
    #include <iostream>
    
    class MyClass {
    private:
        const int a;
    public:
        MyClass() = delete;
        MyClass(MyClass&&) = delete;
        MyClass(const MyClass&) = delete;
        MyClass(int a) : a(a) {};
        ~MyClass() = default;
        MyClass& operator=(MyClass&&) = delete;
        MyClass& operator=(const MyClass&) = delete;
        operator int() const { return a; }
    };
    
    template <class T>
    class DynArray {
    public:
        static constexpr std::align_val_t ALIGNMENT { alignof(T) };
        DynArray (size_t n)
            : maxSize(n),
              d((T*) operator new (sizeof(T) * n, ALIGNMENT )) {}
        ~DynArray() {
            std::destroy_n(d, currSize);
            operator delete(d, ALIGNMENT);
        }
        template <class... Args>
            T& add(Args&&... args);
        T& operator [] (size_t i) { return d[i]; }
        const T& operator [] (size_t i) const { return d[i]; }
    private:
        size_t currSize = 0, maxSize = 0;
        T* d;
    };
    
    template <class T> template <class... Args>
    T& DynArray<T>::add(Args&&... args)
    {
        if (currSize >= maxSize)
            throw std::logic_error("[DynArray::add] Overflow");
        auto& where = d[currSize++];
        new (&where) MyClass(std::forward<Args>(args)...);
        return where;
    }
    
    int main() {
        DynArray<MyClass> da(10);
    
        for (int i = 0; i < 10; ++i) {
            da.add(i);
        }
    
        // Что-то сделали с массивом
        for (int i = 0; i < 10; ++i) {
            std::cout << da[i] << '\n';
        }
    
        return 0;
    }


    Ну и третье — в коде есть, но забыл указать — разбирайте API неинициализированной памяти Си++17.

    ЧЕТВЁРТОЕ. Есть один класс, который не перемещает. Поскольку начиная с Си++17 весь STL внутри работает с неинициализированной памятью, получается довольно мило — но хранится ли оно непрерывно, мы никак не узнаем.
    std::deque<MyClass> dq;
        for (int i = 0; i < 10; ++i) {
            dq.emplace_back(i + 42);
        }
        // Что-то сделали с массивом
        for (int i = 0; i < 10; ++i) {
            std::cout << dq[i] << '\n';
        }
    Ответ написан
    2 комментария
  • Как установить цвет пикселю, если ранее у него не был установлен цвет?

    @Mercury13
    Программист на «си с крестами» и не только
    Я бы не советовал работать прямо через TPngImage. Но если уж решили — надо смотреть канал прозрачности. Что-то вроде:
    case picture.TransparencyMode of
    ptmNone: ; // порядок, ничего не делаем
    ptmBit: // если есть такие PNG — ну, придумайте сами, чё делать
                // Всё через тот же AlphaScanLine
      raise Exception.Create('1-bit transparency unsupported');  // вроде так? — давно не паскалил
    ptmPartial: AlphaScanline[y]^[x] := 255;
    end;


    Надо признаться, «амбаркадебра» известна яростной скупкой открытых компонентов, и я даже нарывался на известные ошибки известных открытых компонентов прямо в оболочке Delphi.
    Ответ написан
  • Почему переменная становится равна 1, если после инициализации класса она была равна 3?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы используете одноимённую локальную переменную в MainProgram().
    MainProgram::m_command_file_len должно равняться нулю ЧЕМУ ПОПАЛО, потому что его никто не трогал.

    UPD. Вы ещё и неправильно используете венгерскую нотацию: префикс f, m или _, оставленный для внутренних переменных, почему-то забрался в локальную.
    Ответ написан
    1 комментарий
  • Как изменить часть файла в zip архиве?

    @Mercury13
    Программист на «си с крестами» и не только
    Возможно, но для этого надо вмешиваться как в процесс доступа к архиву, так и в процесс сжатия. Вот примерно так.
    ZEXTERN int ZEXPORT deflateParams(z_streamp strm,
                                      int level,
                                      int strategy);

    Штука в том, что ключевые байты надо держать несжатыми.

    UPD. Если хотите, чтобы не нарушать NDA, я возьму что-то общедоступное вроде Zippy и попробую написать прототип. Но только если хотите.

    UPD2. Блин, забыл про CRC! Его тоже придётся как-то пересчитывать.
    Ответ написан
    6 комментариев
  • Как определить сложность алгоритма?

    @Mercury13
    Программист на «си с крестами» и не только
    У нас два вложенных цикла, каждый порядка n.
    Значит, O(n)·O(n) = O(n²), если не докажем меньше.
    Не докажем, там обычная арифметическая прогрессия, которая что-то вроде n(n—1)/2.
    Ответ написан
    Комментировать
  • Что это за файл и синтаксис?

    @Mercury13
    Программист на «си с крестами» и не только
    Это файл местной консоли. Файл устроен на манер командного: каждая строчка — это отдельная команда для игрового интерпретатора.

    Первая часть — это общая конфигурация игры, которую, скорее всего, больше менять нельзя. Очень удобно при разработке: я сейчас на W10, разрабатывая программу, воссоздаю её каталог символьными ссылками, но тогда символьных ссылок не было, даже под NT. Приходилось брать файлы откуда-то из другого места, а не из каталога с EXE.

    Вторая — самые настоящие команды консоли. Quake очень популяризовал внутреннюю консоль игры.
    Ответ написан
  • Соблюдается ли лицензионная чистота при работе с QT?

    @Mercury13
    Программист на «си с крестами» и не только
    Само понятие «открытое ПО» как раз выступает против таких ограничивалок.
    Я полагаю, какие-нибудь крючкотворцы найдут в десяти заповедях двенадцать лазеек, но в целом все открытые лицензии выступают против того, чтобы кому-то ограничивать свободу. Не бывает лицензии LGPL для правильных людей.
    Ответ написан
    Комментировать
  • Почему не существует не итерационных/точных методов для вычисления корня из числа?

    @Mercury13
    Программист на «си с крестами» и не только
    Всё крайне просто.
    Потому что, начиная с рационального числа и проводя четыре арифметических действия, +−×: , мы будем оставаться в поле рациональных чисел. А корень в большинстве случаев иррациональный.
    Мы можем получить лишь рациональное число, достаточно близкое к нашему корню.
    И все «нормальные» методы вычисления корня работают так: если ещё немного повычислять, можно получить более точный корень. То есть итерационные.

    Пример НЕитерационного метода предложили Ын, Уолш и Таролли, но более он известен по игре Quake III: придумать приближение логарифма, разделить на 2 и обратить это самое приближение. Но этот метод не масштабируем: если точности не хватает, придётся брать в руки какой-нибудь метод Ньютона и дотягивать точность. Ну или придумывать более точное приближение логарифма — исходное было всего лишь прочтением компьютерного дробного как целого числа. То есть придётся рубить его на мантиссу и порядок, порядок брать как есть, а мантиссу преобразовывать каким-то многочленом (если читать дробное как целое, то наш многочлен — банальная линейная функция, log₂(1+x)≈x).

    А лучше порядок превратить в несмещённый, поделить надвое, вернуть опять к смещённому, и остаётся только найти приближение — многочленом или таблицей — для x∈[1,4).

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

    @Mercury13
    Программист на «си с крестами» и не только
    По идее, должно. Но чем вы мерили? — там, полагаю, будут несколько вольт (скорее всего, 5), полученные подтяжкой штыря к +5SB.
    Ответ написан
    1 комментарий
  • Как именно гарантируется выделения n байт памяти библиотекой stdint.h?

    @Mercury13
    Программист на «си с крестами» и не только
    В моей версии MinGW это сделано так.
    На уровне компилятора определяется макрос __INT64_TYPE__, который на данных настройках значит long long. Затем через жёсткую препроцессорную магию определяются и остальные типы и константы, связанные с int64.

    # include_next <stdint.h>  // то есть самого себя!
    
    . . .
    
    #ifdef __INT64_TYPE__
    # ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
    typedef __INT64_TYPE__ int64_t;
    # endif /* __int8_t_defined */
    typedef __UINT64_TYPE__ uint64_t;
    # undef __int_least64_t
    # define __int_least64_t int64_t
    # undef __uint_least64_t
    # define __uint_least64_t uint64_t
    # undef __int_least32_t
    # define __int_least32_t int64_t
    # undef __uint_least32_t
    # define __uint_least32_t uint64_t
    # undef __int_least16_t
    # define __int_least16_t int64_t
    # undef __uint_least16_t
    # define __uint_least16_t uint64_t
    # undef __int_least8_t
    # define __int_least8_t int64_t
    # undef __uint_least8_t
    # define __uint_least8_t uint64_t
    #endif /* __INT64_TYPE__ */


    Полагаю, это связано с тем, что компилятор и библиотека сильно кроссплатформенны и написаны в большом отрыве друг от друга. Решай мы более простую задачу — то есть связку «компилятор-библиотека» для конкретной ОС — можно было просто
    typedef long long int64_t;
    Ответ написан
    Комментировать
  • Если создам сайт с рингтонами а сами рингтоны не будут это нарушение авторских прав?

    @Mercury13
    Программист на «си с крестами» и не только
    Если ссылка будет вести к рингтону — нарушение.
    Если рингтона не будет от слова «совсем» — ну, я не очень знаю, как вы, мошенники, на этом зарабатываете. Перехват поисковых запросов? Могут и прижать, но о том, что «не верблюд», придётся оправдываться в суде. Маловероятно, потому что таким спамом вы ПОМОГАЕТЕ законным распространителям. Но наши правоторговцы тупы настолько, что от них можно ожидать чего угодно.
    Ответ написан
    1 комментарий
  • Как получить цепочку кластеров занимаемых файлом?

    @Mercury13
    Программист на «си с крестами» и не только
    На то она и файловая система, что скрывает от пользователя, как устроен диск и есть ли вообще диск: может быть сетевая файловая система, могут быть устройства как файлы, а может быть RAID какой-нибудь, когда одни данные на двух дисках.

    Насколько мне известно, ни один файловый API не позволяет перейти от высокоуровневого дескриптора до низкоуровневых штучек — во-первых, неуниверсально. Во-вторых, опасно для пользовательских данных, если программа уверена, что знает, а она не знает (например, на диске MyCoolFS 3.15, а программа работает с 3.14). Все программы, работающие с файловой системой как таковой, начинают с разделов диска.

    Такая конструкция хотя бы ставит надёжные стены между пользовательскими программами (которые портят данные в крайне редких случаях — скажем, когда выключили комп во время записи) и сервисными утилитами (которые по определению опасны, используйте на свой риск).
    Ответ написан
    Комментировать
  • Какой 3D движок использует ИИ Sora?

    @Mercury13
    Программист на «си с крестами» и не только
    Подозреваю, конструкция тут другая. Смысл 3D-движка — 1) показывать сложное 3D в реальном времени, и главное в этом — отсекать невидимое и посылать видимое на видяху так, чтобы она всё это быстрее обработала; 2) иметь некие утилиты для распространённых частей игр: столкновения, камеры, риги (системы ограничений, позволяющие анимировать не кучу вершин, а, например, руку).

    Сложная картинка — опыт показал, что нейросеть со сложным освещением справляется лучше, чем 3D-движок, но чертовски неуправляема.

    Утилиты — в большинстве случаев генератору видео они мало на что нужны.

    Тут же система, возможно, и придумывает какие-то трёхмерные очертания объектов, но сильно упрощённо, на уровне второй кваки (не так-то и нужно отсечение), а затем обрабатывает результат этого 3D обычной двухмерной нейродумалкой. Пример: та самая женщина, идущая по Токио — от кадра к кадру меняется покрой её куртки.

    UPD. У них действительно есть сильно упрощённая модель трёхмерного мира, именуемая «patches». Но окончательное оформление всё равно делается обычной двухмерной нейродумалкой.
    Ответ написан
    7 комментариев
  • Как создают текстуры для игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы, конечно, говорите о 3D. Там создают текстуры для ожидаемого разрешения экрана (2к или 4к, например), а остальное — MIP-текстурирование. Уменьшенные в 2, 4, 8 и т.д. раз версии создаются автоматически.
    Отдельный вопрос — как в текстуру втиснуть псевдо-векторную вещь, для этого используется хитрый формат текстуры и хитрые шейдеры.

    Вы можете запустить и какой-нибудь Need for Speed Porsche в 4к. Скорее всего, в каком-то месте уровня зависнет, но некоторое время работать будет. Края объектов будут резкие, за это отвечает 3D-движок. Но треугольники будет видны, а текстуры мыльные по современным меркам. Вот вам огромное превышение системных требований.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Двоичный файл собственного формата, дополнительно закодированный в Base64. Кто такой «pony(», это ты?
    Собственного формата — это значит, его придётся декодировать из Base64, а потом ломать своими силами.
    Формат целых подозреваю Intel, но нет гарантии.
    Ответ написан
    Комментировать
  • Как сделать чтоб перснаж не мог проходить через стены?

    @Mercury13
    Программист на «си с крестами» и не только
    Если отбросить в сторону общую упоротость кода (облом делать ревизию), проблема вот в чём.
    Работая с коллайдером (фигурой, которая участвует в проверке столкновений, она же хитбокс), вы выбрали диапазон клеток
    [y / 16; (y + h) / 16).

    Например, y = 1, h = 16, (y+h)/16 = 1, диапозон [0,1), и проверяется только клетка 0. А надо 0 и 1.

    Так что надо [y / 16; (y + h - 1) / 16]. ВКЛЮЧАЯ СПРАВА.
    Ответ написан
    Комментировать