• Кто хочет поломать немного мозг?

    tsarevfs
    @tsarevfs
    C++ developer
    Первым делом выделяем связанные фигуры.
    Изначально каждый отдельный квадрат и каждую фигуру помечаем "свободным".
    В цикле, пока есть свободные квадраты:
    пробегаемся по всем квадратам, если под квадратом пол или "замороженный" квадрат, морозим его;
    пробегаемся по свободным фигурам, если в фигуре появились замороженные квадраты, морозим фигуру и остальные квадраты в фигуре;
    пробегаемся по свободным фигурам, каждый квадрат из нее опускаем на 1 клетку вниз;
    идем в начало цикла.

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

    tsarevfs
    @tsarevfs
    C++ developer
    def check_possibility(figures, signs = [], is_100 = False):
        for sign in ('', '+', '-', '*', '//'):
            new_signs = signs[:]
            new_signs.append(sign)
            if len(signs) == 5:
                numeric_expression = ''
                numeric_expression += figures[0]
                for i in range(5):
                    numeric_expression += signs[i]
                    numeric_expression += figures[i + 1]
                result = eval(numeric_expression)
                if result == 100:
                    return numeric_expression
                else:
                    return False
            elif is_100 == False:
                is_100 = check_possibility(figures, new_signs, is_100)
        return is_100
    
    print check_possibility([str(n) for n in range(2, 8)])


    ps. ** опасная операция будет очень долго считать если попадутся большие аргументы. python считает в длинной арифметике для целых.
    Ответ написан
    4 комментария
  • Как построить цикл при множественном переборе элементов?

    tsarevfs
    @tsarevfs
    C++ developer
    word_list = input_string.split(' ') 
    while <в word_list есть слово начинающееся с нужной буквы>:
       добавить это слово в конец результата
       убрать добавленное слово из word_list
    
    отсортировать оставшиеся в word_list слова
    добавить их в ответ


    Возможно проще для поиска слов использовать dict такого вида {'x' : 'xxx', 'y' : 'yyy'}. Тогда искать нужное слово будет просто ( if last_letter in first_letter2word: ). Из него так же можно удалять уже добавленные слова.
    Ответ написан
    Комментировать
  • Чем и как подгрузить набор матриц?

    tsarevfs
    @tsarevfs
    C++ developer
    1 вариант -- отдельные файлы для матриц.
    2 вариант:

    2 //количество матриц
    2 2 //строк, столбцов в 1 матрице
    1 2
    3 4
    3 4
    3 3 //строк, столбцов в 1 матрице
    1 2 3
    4 5 6
    7 8 9

    3 вариант -- json
    Ответ написан
    Комментировать
  • Где ошибка в счетчике?

    tsarevfs
    @tsarevfs
    C++ developer
    Посмотрите конец статьи.
    var byTag =  document.getElementsByTagName('p');
    var counter = 0
    
    for (var c = 0; c < byTag.length; c++) {
       byTag[c].onclick = (function (num) {
          return function() {
             byTag[num].innerHTML = ++counter;
          }
       })(c)


    Суть в том, что переменная "c" глобальная и захватывается как ссылка. То есть когда вызывается onclic ее значение == byTag.length а не то, какое было в момент добавления колбека.
    Ответ написан
  • Как на QML написать игру жизнь?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    QML штука хорошая, но ее не обязательно для gui использовать. Возможно, чтобы не закапываться в qt проще будет использовать qpainter и нарисовать ячейки как прямоугольники.
    Ответ написан
    3 комментария
  • На чем сделать данное клиент-серверное приложение?

    tsarevfs
    @tsarevfs
    C++ developer
    Может устроит расшареная виндовая папка с настроеными правами? Если нужно именно приложение, то подойдет любой язык, который знаете. Причем приложение может точно так же пользоваться расшареной папкой (см. samba). Либо можно пилить веб сервер. Правда если в качестве файлов могут быть например word документы или еще что-то, что не открыть прямо в браузере, то стоит подумать есть ли в этом смысл.
    Ответ написан
    1 комментарий
  • Генерация кода для условных выражений?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Подход с польской записью возможен, если нужны только выражения. По поводу "А как вернуться назад?":
    1. Если вы храните строку с токенами в польской записи в каком-то массиве, и обрабатываете их в цикле, то после push $0/ push $1 можно сделать безусловный jump на начало цикла обработки.
    2. Использовать call, адрес возврата будет положен на стек и вы вернетесь к месту вызова по ret. Но в этом случае не получится использовать аппаратный (push, pop) стек без дополнительных извращений. Заведите массив под еще один стек для ваших данных. Гуглите "стек на массиве", если не понятно о чем я. Это кажется усложнением, но с большой вероятностью вы захотите использовать стек для чего-то еще потом. Не стоит сразу его резервировать для одной цели.
    3. Вместо условных переходов можно попытаться загрузить результат сравнений из регистра флагов напрямую.
    pushf			; Скопировать регистр флагов...
    pop ax			; ...в регистр AX

    остается сделать and с маской для нужного флага и сдвинуть (shr) чтобы получить 0 или 1.
    Ответ написан
  • Несколько вопросов по клиент-серверному соединению?

    tsarevfs
    @tsarevfs
    C++ developer
    1. Есть несколько вариантов, но все из них сводятся к тому, что текст, данные форм и прочее нужно представить в виде набора байт. Это называется сериализацией. Это можно делать по разному. Например использовать бинарный формат близкий к тому как эти данные хранятся в памяти. Это достаточно сложно особенно если программы написаны на разных языках. Вам подойдет более высокоуровневый подход на основе JSON (ndjson) или msgpack. Или даже более высокоуровневые решения типа json/msgpack rpc.
    2. Прием работает в обратном порядке. Мы принимаем данные в некотором формате и десериализуем их в те структуры данных, которые используются в программе.
    3. Уточните вопрос, но ответ скорее всего нет =)
    4. Он может участвовать а может и нет. Он работает поверх сокетов. Вероятно для ваших целей он избыточен. Однако смотреть можно в сторону rpc over http или rest api.
    5. Основная проблема в том, что операция -"ждать сообщения от клиента / сервера" блокирующая. И если ничего не предпринять, то клиент не сможет реагировать на клавиатуру / мышь, а сервер не сможет работать с несколькими клиентами. Поэтому сетевое общение можно вынести в отдельный поток или использовать какие-то асинхронные механизмы (в паскале с этим не очень похоже).
    6. Паскаль возможно не лучший язык для клиента. На той же Java это было бы проще.
    Ответ написан
    1 комментарий
  • Есть ли смысл определять новые ключевые слова в c++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Плохая идея. Может привести к очень неприятным ошибкам, если где-то использовать случайно. Ну, и все знают как нужно писать на C++, а к этому придется привыкать.
    Ответ написан
    Комментировать
  • Выделение пятен из полученных данных об изображении?

    tsarevfs
    @tsarevfs
    C++ developer
    Гуглите "кластеризация". scikit-learn.org/stable/modules/clustering.html Примеры алгоритмов на python c описанием их особенностей. Реализации на js наверняка есть, многие достаточно легко реализовать самому.
    Ответ написан
    1 комментарий
  • Какую выбрать среду для написания кода на С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Под windows студия это оптимальный вариант. Как только задачи станут немного сложнее, время на создание проекта будет незначительно по отношению к времени на написание кода. В качестве бонуса студия дает вам вменяемый отладчик, который очень полезен, если научиться им пользоваться.
    Ответ написан
    Комментировать
  • Как конкретного наследника связать с конкретным родителем?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Отношение наследования в реальном мире лучше всего описывается словом "является". Каждый ComPort является девайсом, а обратное не верно (вероятно девайсы бывают разные, иначе не понятно зачем такой класс вовсе). Значит Device должен быть базовым классом.
    Далее, что касается связи двух экземпляров. Каждый экземпляр класса ComPort и так является Device благодаря наследованию. Функция write у девайса может быть виртуальной и абстрактной (=0 не имеющей своей реализации). В ComPort она будет оверрайдиться уже с конкретной реализацией для порта.
    Таким образом вы можете иметь:
    Device * d = new ComPort(setting1, setting2);
    d.write(data);

    в этом случае write будет вызван с нужными настройками (setting1, setting2).

    Более того, такой подход позволит использовать разные девайсы единообразно:
    std::vector<Device *> ds;
    ds.push_back(new ComPort(setting1, setting2));
    ds.push_back(new UsbPort(setting3, setting4));
    
    for (auto d : ds)
       d->write(data);
    </code
    Ответ написан
    Комментировать
  • Пример нейронной сети на Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Для начала полезно смотреть на 2 графика -- количество ошибок в тестовой и обучающей выборке по эпохам.
    learn_rates это коэффициент который соответствует скорости обучения. Если ошибка уменьшается плавно, но медленно -- увеличиваем. так же влияет на вероятность попасть в локальный минимум.
    learn_rate_decays -- затухание learn_rates со временем. Суть в том, что точное решение ищем с меньшей скоростью когда уже нашли хорошее приближение.
    epochs -- собственно прогоны обучающей выборки. Когда графики некоторое время остаются на месте, продолжать обучение смысла нет.
    verbose -- не относится к обучению. Если True печатает какую-то дополнительную информацию в процессе.
    Еще графики помогут определиться со сложностью сети(количество слоев, нейронов в них). Если точность на обучающей выборке намного выше чем на тестовой -- переобучение. Это значит что модель слишком хорошо адаптировалась к обучающей выборке, "запомнила" ее, но плохо работает на незнакомых данных. Уменьшаем сложность модели. Если графики не сильно отличаюстя, но результат плохой -- нужно увеличивать сложность модели.
    Ответ написан
    Комментировать
  • Какой алгоритм приблизительного поиска выбрать?

    tsarevfs
    @tsarevfs
    C++ developer
    Исправить ошибки в строке -> привести все слова в начальную форму (бегала->бегать) -> найти нужное. Есть библиотеки которые это умеют. Начать поиск можно отсюда.
    Ответ написан
    Комментировать
  • Зачем надо использовать трудные способы?

    tsarevfs
    @tsarevfs
    C++ developer
    Преобразование в СКНФ по таблице это достаточно бесполезное занятие. Маловероятно что вам это когда-нибудь понадобится. А вот преобразовывать булевы выражения иногда приходится. Простой пример -- когда надо поменять
    if (a && b || c)
       do_first()
    else
       do_second()

    на
    if (???)
       do_second()
    else
       do_first()
    Ответ написан
    3 комментария
  • Как сохранить список типов классов, которые потом (в runtime) должны быть вызваны в параметре шаблона?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    www.boost.org/doc/libs/1_59_0/libs/mpl/doc/refmanu... возможно что-то из boost mpl вам поможет. Но очень не рекомендуется это делать в pruduction коде. Такой код обычно очень дорого поддерживать.
    Ответ написан
  • Linux Mint или Linux Elementary?

    tsarevfs
    @tsarevfs
    C++ developer
    Mint. Elementary показался сыроватым пол года назад.
    Ответ написан
    Комментировать
  • При перемножении столбцов в NumPy по индексу столбца наблюдается большое время перемножения (профайлинг времени приложен). Как можно исправить?

    tsarevfs
    @tsarevfs
    C++ developer
    Скорее всего матрицы хранятся в виде массива строк. Поэтому при работе со столбцами приходится активно прыгать по памяти и эффективность кэша процессора падает. Можно попробовать транспонировать матрицу перед активной работой со столбцами, и перемножать строчки.
    Ответ написан
    Комментировать