• Как сделать в строке замену нескольких конкретных одинаковых символов на один такой?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это еще ничего, а как вы хотите, чтобы парсилась строка "1111,2222,3333"? Как 11112222.3333? Или 111.22223333? Или что?

    Правильный ответ: если строка не является корректно записанным числом, то надо выдавать ошибку, а не пытаться незаметно для пользователя исправить за него ошибки.

    Например, можно просто читать сразу число. Если вам надо, чтобы число было корректным и при использовании '.' и ',', то можно просто все запятые поменять на точку.
    Ответ написан
    2 комментария
  • Что нужно изучить для создания программы управлением оборудованием?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    Итак, вопрос в том, чему нужно научиться, чтобы создать приложение для Windows, которое может управлять всеми тремя частями?

    1. Декомпозировать задачи
    2 Формулировать вопросы
    3. Гуглить решения/ответы
    Ответ написан
    Комментировать
  • Как компилировать общие файлы двух бинарников один раз?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Из компилируешь a.cpp и b.cpp, а затем просто используешь их объектные файлы

    пример на Makefile

    a.o: a.cpp
         gcc -c a.cpp -o a.o
    
    b.o: b.cpp
         gcc -c b.cpp -o b.o
    
    tests.exe: a.o b.o
         gcc a.o b.o test_main.cpp -o tests.exe
    
    app.exe: a.o b.o
         gcc a.o b.o app_main.cpp -o app_main.exe


    как-то так

    UPD: если про CMake, то используй OBJECT библиотеку

    add_library(common OBJECT a.cpp b.cpp)
    add_executable(tests PRIVATE tests_main.cpp $<TARGET_OBJECTS:common>)
    add_executable(app PRIVATE app_main.cpp $<TARGET_OBJECTS:common>)
    Ответ написан
    Комментировать
  • Ошибка в коде C++.?

    GavriKos
    @GavriKos
    Ну в целом ошибка сама за себя говорит. Нельзя в указатель записать символ.
    Ответ написан
    Комментировать
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно попробовать сделать микрооптимизации: функция F реализуется одним циклом (делите, пока делится на 10, потом берите последнюю цифру). S тоже можно считать циклом, а не рекурсией.

    Но скорее всего, этого не хватит. Это решение за O(q*log(q)). Ограничения на числа в условии не видно, но если там что-то порядка 2000000000, то ваша программа будет считать несколько секунд.

    Надо хорошенько подумать и применить математическую хитрость. Надо как-то считать числа в интервале p...q пачками, а не каждое отдельно.

    Что такое функция F? Это последняя ненулевая цифра в числе. Давайте вместо суммы значений F счиатать, сколько чисел из интервала дадут вот такое вот значение? Ну просто по последней цифре сложно сказать, сколько там чисел, а вот если еще зафиксировать количество пропущенных в конце нулей, то уже становится понятно, как подсчитать это. Вот допустим, вы считаете последнюю цифру d и там должно быть 3 нуля. Тогда вы ищети числа вида "xxxd000". Или их можно представить в виде d*1000+x*10000 для произвольного неотрицательного x. И вот вам надо подсчитать сколько таких чисел в интервале [p,q]. Ну решите 2 уравнения: d*1000+x*10000 >= p и d*1000+x*10000 <= q

    Таким образом вы за несколько арифметических действий и одну проверку можете подсчитать, сколько чисел вида "xxxd000" будут в интервале. Осталось циклом перебрать d от 1 до 9 и количество нулей от 0 до длины q. И вот у вас решение за O(log(q)).

    Edit:
    Вот код быстрого решения:
    int S(int p, int q) {
      int sum = 0;
      for (int d = 1; d < 10; ++d) {
        for (int tens = 1; tens <= q; tens *= 10) {
          int left = p - d*tens;
          if (left < 0) left = 0;
          else left = (left + 10*tens-1)/(10*tens);
          int right = q - d*tens;
          if (right < 0) right = -1;
          else right /= 10*tens;
          sum += d*(right - left + 1);      
         }
      }
      return sum;
    }
    Ответ написан
  • Как переобразовать string в const unsigned char* в C++?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    // str - строка типа std::string
    const unsigned char* str_ptr = (const unsigned char*) str.c_str();
    Ответ написан
    2 комментария
  • Как сохранить файл, который скачивается автоматически при переходе по ссылке?

    Vindicar
    @Vindicar
    RTFM!
    через requests сохраняется html код страницы, где нет и намека на файл

    Вариант 1: не убедил сайт, что твой бот - это не бот. Добавляй заголовки - реферер, куки, юзер-агент и т.д. Можешь их прямо скопировать с браузера.
    Вариант 2: сайт редиректит на нужную ссылку через JS. Разбери код страницы, найди как формируется ссылка и научись её извлекать, а потом уже эту ссылку качай через requests.
    Ответ написан
    Комментировать
  • Почему решение задачи на leetcode работает неправильно?

    IvanU7n
    @IvanU7n
    nothing interesting here
    -        for (short i = 0; i < n; ++i) 
    +        for (short i = 1; i <= n; ++i)


    да и зачем там 2 цикла вообще непонятно
    Ответ написан
    Комментировать
  • GCC Добавляет лишние пробелы при компиляции?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Скорее всего проблема в кодировке файла. Попробуй сконвертировать формат файла в utf-8, если другой, и дополнительно смени тип новой строки с \r\n на \n (не уверен, что важно)
    Ответ написан
    Комментировать
  • Почему программа ломается при вводе числа с 11 и более знаками и как это можно исправить?

    Потому что int имеет ограниченный размер.
    Для твоей программы не обязательно парсить число - можно его разбирать как строку.
    Ответ написан
    Комментировать
  • Windows 10 кавычки вводятся только парами?

    @wmy
    Впечатление, что США международная ставится "невидимо". Переключение на русский срабатывает только со второго раза. Мне помогло установить эту раскладку явным образом, а потом удалить.
    Точнее так:
    установил США международная
    удалил США
    установил США
    удалил США международная
    Не знаю, важны ли дополнительные пункты :)
    Ответ написан
    2 комментария
  • Windows 10 кавычки вводятся только парами?

    phactor
    @phactor
    Это раскладка клавиатуры. Наверняка стоит США - Международная. Нужна просто США.
    Ответ написан
    5 комментариев
  • Как создать многомерный массив в одной области памяти?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Одномерный массив размером X * Y - единственное решение, если нужен непрерывный участок памяти.
    Для получения первого индекса - index / X, для второго - index % X.
    Но надо позаботиться - чтобы места было достаточно, иначе однажды получишь OOM либо когда место закончится, либо при сильной фрагментации памяти.

    Вариант с "зубчатым" массивом, тоже норм - отложенное выделение можно реализовать. Но по скорости будет проигрывать из-за локальности данных. Хотя, если нужен непрерывный участок - уже не подходит
    Ответ написан
    2 комментария
  • Сокращение функций в си++?

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

    На фрилансе с любого уровня можно работать, лишь бы ты закрывал потребности заказчиков за приемлимую цену и время.

    Умение анализировать рынок и управлять на фрилансе часто важнее, чем умение кодить.
    Были бы навыки - можно вообще без умения кодить
    Ответ написан
  • Можно ли в c++ помечать код метками?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Если это нативный C++ - нет. В нем нет такого синтаксиса.
    Если это CLI/C++ (яп для .net), то да
    Ответ написан
    7 комментариев
  • Не фиксируемое количество аргументов 1 типа в c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    На выбор: std::initializer_list, variadic arguments, variadic templates.

    Примеры по ссылкам есть. Последнее - вообще оверкилл, и в вашем случае вообще не нужно. Советую использовать initializer_list.
    Ответ написан
    1 комментарий
  • Как сделать скрин на C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    На винде? Кроме gdi+ можно ещё через directx (гуглите dxgi duplicator) или через windows graphics capture api. Но последние 2 не работают в старых системах.

    Если же вам только посмотреть на несколько пикселей, то можно и в gdi+ делать скриншот лишь маленькой части, или вообще ничего не копировать и смотреть на цвет пикселей в экранном DC.
    Ответ написан
    1 комментарий
  • Как ускорить поиск элементов из статичного string[] по подстроке?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала объедините все ваши строки в одну через какой-то раздилитель, которого не может быть в искомой строке (можно и без него, но с ним код чуть проще будет). В конце поставьте этот же разделитель 2 раза. Вроде "строка1$строка2$строка3$...$строкаN$$".

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

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

    Другой вариант - через преобразование Барроуза — Уилера. Вот есть лекция. Этот алгоритм часто упоминается в курсах по биоинформатике. Реализацию может даже найдете где-то. Потом можно найти номера исходных строк из индексов вхождений через тот же бинпоиск по сортированному массиву индексов начал всех строк в тексте.

    Да, проблема тут будет, если у вас шаблон короткий, то вы найдете все вхождения, включая повторы в каждой из исходных строк. Тогда эти алгоритмы могут работать не сильно лучше наивного.

    Учтите, что построение структуры данных тут будет в несколько раз медленнее простого for+Contains. Выигрыш вы получите, если у вас текст действительно статичный и вы в нем много раз что-то ищите.
    Ответ написан
    7 комментариев
  • В каких случаях использовать С++, а в каких Blueprints?

    Логику пишет геймдизайнер, который не очень то программист - напрашиваются BP.

    Сетевой код, работа с голым UDP - напрашивается C++.

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

    Какое-то очень узкое место, где надо обрабатывать кучу чисел и объектов.
    Что-то типа конвейеров в factorio например.
    Напрашивается C++ из-за своей эффективности и плотности логики, ибо то же самое на BP будет очень развесистой лапшой.
    Ответ написан
    Комментировать