Задать вопрос
  • Как узнать лежит ли точка в заданом полигоне?

    Алгоритм заливки области требует указания границы области, например цветом. Как вы предлагаете делать заливку не указав контуров? Особенно это касается стыков областей, т.е. внутренних рёбер, которые как бы принадлежат нескольким областям.
  • Как узнать лежит ли точка в заданом полигоне?

    Тут есть небольшая вероятность попасть в границу области, а все границы одного цвета. Для этого случая алгоритм работать не будет.
  • Как сделать график квадратичной функции?

    Можете нарисовать картинку, как вы себе представляет результат?
    По идее после ввода коэффициентов уравнения и нажатия кнопки "Посчитать", вы на Canvas рисуете график функции, которая есть ваше квадратное уравнение и рисуете оси координат.
    Точки где ось координат "Х" пересечет график и будут корнями уравнения.
  • Что происходит в момент объявления функции?

    Файл читается построчно и тут же интерпретируется.
    До объявления функции у вас a = 1 - тут создается глобальная переменная.
    Далее в процессе чтения файла создается функция test и в конце этой функции в пространстве имен этой функии создается локальная переменная "a".

    Если из вашего примера убрать вызов функции test() все отработает без ошибок.
    Ошибка возникает в тот момент, когда интерпретатор выполняя функцию находит локальную переменную "a", это при вызове функции print(a), и ошибка от того, что значение локальной переменной "a" еще не присвоено.
    Оно появиться после выполнения строки a = 2, т.е. схема такая:

    загрузка модуля:
    a = 1 #глобальная переменная "a" со значением 1
    def test():
    print(a) #глобальная переменная "a" со значением 1
    a = 2 #создается локальная переменная "a", значение она получит только в момент выполнения функции

    test()

    #выполнение функции
    def test():
    print(a) #локальная переменная "a"без присвоенного значения - ошибка!
    a = 2 #если бы сюда дошли была бы локальная переменная "a" со значением 2

    Именно об этом по ссылке и говорится, смотрите первый пункт: "Почему я получаю исключение UnboundLocalError, хотя переменная имеет значение?"

    Если бы вы в функции test() закомментировали код a = 2, создающий локальную переменную такой ошибки бы не было.

    Т.е. вот так работает правильно:
    a = 1
    def test():
    print a

    test()

    Все портит попытка присвоить имени "a" какое-либо значения в теле функции.
    В этот момент создается локальная переменная с именем "a", которая закрывает для функции значение глобальной переменной "a".

    Порядок разрешения имен в общем случае такой:
    local - локальные переменные
    nonlocal - "нелокальные" переменные, это те, что объявляются в теле функции и д.б. доступны во вложенных
    функциях объявленных в теле той же функции. (шаблон декоратор как пример)
    global - глобальные переменные
    built-in - встроенная область
  • Что происходит в момент объявления функции?

    https://pythonworld.ru/osnovy/faq.html
    Судя по тому что там написано, как только мы присваиваем какое-то значение глобальной переменной внутри функции, создается новая локальная переменная с таким же именем. И получается что в момент загрузки модуля
    все "ОК", т.к. функция видит глобальную переменную, но в момент выполнения функции все крашится, т.к. уже действует локальная, но без присвоенного ей значения.
  • Что происходит в момент объявления функции?

    Python интерпретатор и обрабатывает код построчно. В момент выполнения print a интерпретатор останавливает выполнени программы, т.к. значение переменной “a” должно быть определено до использования, если это не так, то ошибка и что там дальше интерпретатор не знает.
  • Как сделать перестановки с заменой в python?

    выравнивание слетает, но тут его не сложно восстановить
  • Какой алгоритм должен быть для построения треугольников?

    Каждый элемент списка, это точка, с координатами заданными двумя строками.
    На выходе для каждого треугольника должны быть три разные точки, для которых нужно проверить, что они не лежат на одной линии (хотя в задаче этого явно не сказано)
    И да тут задача переборная и для получения всех треугольников нужно пройтись по всем вариантам, но сложность меньше чем O(N^3).
    Если все точки разные и никакие три из них не лежат на одной прямой, то для массива из 5 точек, будет
    1,2,3
    1,2,4
    1,2,5
    1,3,4
    1,3,5
    1,4,5
    2,3,4
    2,3,5
    2,4,5
    3,4,5

    Количество треугольников - это количество сочетаний по 3 точки из 5 имеющихся, т.е.
    C(5, 3) = 5!/(3!*2!) = 120/(2*6) = 10
    В общем случае будет C(N,3) = N!/((N-3)!*3!), т.е. например для n = 1000 получим 166167000 треугольников

    Т.е. перебор индексов элементов массива такой 1>=i>j>k<=N и тут точно не будут возникать дубли треугольников.
    Единственный момент, реальные индексы нужно начинать с нуля и заканчивать на N-1
    N - количество элементов массива.

    Поэтому комментарий Rsa97 не плохое решение, тем более что более быстрого нет, перебор нужно выполнить полностью.
  • Оправдано ли увеличение и дублирование кода для разбиения логических процессов?

    Чтобы открыть транзакцию нужно вызвать метод begin_transaction() у объекта db
    Чтобы зафиксировать транзакцию нужно вызвать метод commit()
    Т.е. Для вашего кода д.б.что-то вроде такого:

    public function updateShipment($parcels) {

    $this->db->begin_transaction()

    $this->db->query("UPDATE " . DB_PREFIX . "shipment_parcel SET date_delivery = NOW() WHERE point_id = '" . (int)$this->session->data['point_id'] . "' AND parcel_id IN (" . implode(',', $parcels) . ")");

    $this->db->query("UPDATE " . DB_PREFIX . "parcel SET date_return = '" . $this->db->escape(date('Y-m-d', strtotime('+' . $this->config->get('config_parcel_deadline') .' days'))) . "', date_modified = NOW() WHERE point_id = '" . (int)$this->session->data['point_id'] . "' AND parcel_id IN (" . implode(',', $parcels) . ")");

    foreach($parcels as $parcel_id) {
    $this->db->query("INSERT INTO " . DB_PREFIX . "parcel_history SET parcel_id = '" . (int)$parcel_id . "', parcel_status_id = '" . (int)$this->config->get('config_recieved_status') . "', user = '" . $this->db->escape($this->operator->getFullname()) . "', date_added = NOW(), date_modified = NOW()");

    $this->db->commit()
    }
    }

    Подробнее про это можно почитать вот тут например:
    php.net/manual/ru/mysqli.begin-transaction.php
    www.weblibrary.biz/mysql/sintaksis-oper/uprav-tran...
    https://habrahabr.ru/post/238513/

    И да, использование транзакций может приводить к блокировкам, в течении того времени пока транзакция не зафиксирована или не отменена. Это значит, что изменные или добавленные в одном коннекте в транзакции записи будут не доступны в запросах из другого коннекта и запросы будут висет в ожидании того, что завершится наложившая блокировку транзакция. Но такое поведение можно скорректировать если указать уровень изоляции. Про это тоже можно почитать в указанных ссылках.
  • Как оптимизировать запрос с ORDER BY и FULLTEXT search?

    Да, все верно. Для поля ind не нужно указывать алиас t1, т.к. такого поля нет в таблице.
    Нужно вместо t1.ind написать ind
  • Оправдано ли увеличение и дублирование кода для разбиения логических процессов?

    В приведённом вами коде в первой функции есть четыре запроса. Если не выполнять их в транзакции, то возможно что например первый insert отработал, а затем случился разрыв коннекта с базой и в итоге посылка зависла в непонятном состоянии. Если весь пакет из этих запросов обернуть в транзакцию, то в случае любого сбоя в любой момент выполнения пакета все, что было выполнено до момента сбоя будет возвращено в исходное состояние, т.е. в состояние до начала выполнения первого запроса пакета. Если же все ОК, то транзакция фиксируется, т.е. все изменения вступают в силу.
    То что все состояния выделены в отдельные процедуры это хорошо, пусть есть дублирование, но зато код не зависим и доработав один процесс можно не опасаться регресса в других(но тесты для каждого процесса нужно написать). То что вы заложили таблицу истории в проект это тоже хорошо, аудит очень нужен, для разбора конфликтных ситуаций. Я бы заложил в проект механизм чистки или архивации для тех посылок, которые уже доставлены, например завести рядом таблицы с аналогичной структурой и постфиксом arch и переливать туда данные по посылкам, которые доставлены например месяц назад или ранее(можно сделать настраиваемым). Таким образом, оперативные таблицы не будут сильно распухать.
  • Сохранение данных БД и восстановление/синронизация с сервером при обрыве связи, как лучше реализовать?

    Могут ли одни и те же данные менять разные пользователи? Если ответ да, то синхронизацию сделать не просто. Вот на есть статья про варианты решения этой задачи.
    https://habrahabr.ru/company/ncloudtech/blog/264923/

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

    Третий вариант, ответ нет на оба вопроса. Тогда для синхронизации данных на локале и в удаленном хранилище нужно иметь уникальный ключ для данных. По этому ключу можно находить новые-удалённые записи, т.к. в этом случае ключ будет только или в удалённом или в локальном хранилище. А для поиска изменений нужно будет сравнивать по всем полям все строки таблиц у которых ключ есть и в локальном и в удалённом хранилище.
  • Как победить ошибку "OverflowError: signed integer is greater than maximum"?

    Можно попробовать использовать распаковку аргументов:
    def view_todos(page=1, **kwargs):
    try:
    return Todo.objects(**kwargs).paginate(page=page, per_page=10)
    except:
    abort(404)

    В таком виде декоратор будет более универсальным, вариант запуска с вашим кейсом:
    view_todos(1, category_id=Cat.id )
  • Как найти наибольшую поседовательность за O(n)?

    Длинна текущей последовательности. В этом hash map каждый ключ это отдельная последовательность а значение это ее длинна. Если брать ваш пример то как тот будет:
    Шаг 1
    Ключ = 1 значение = 1
    Шаг 2
    Ключ = 2 значение = 2 потому что мы продолжаем последовательность начатую на шаге 1
    Шаг 3
    Уже имеем две последовательности
    Ключ = 2 значение 2
    Ключ = 433 значение = 1
    Шаг 4
    Ключ = 2 значение = 2
    Ключ = 433 значение = 1
    Ключ = 500 значение = 1
    Шаг 5
    Ключ = 3 значение = 3
    Ключ = 433 значение = 1
    Ключ = 500 значение = 1
    Шаг 6
    Ключ = 3 значение = 3
    Ключ = 433 значение = 1
    Ключ = 500 значение = 1
    Ключ = 900 значение = 1
    Шаг 7
    Ключ = 4 значение = 4
    Ключ = 433 значение = 1
    Ключ = 500 значение = 1
    Ключ = 900 значение = 1
    Т.е. на каждом шаге мы берём один элемент из массива и либо удлиняем имеющуюся цепочку, либо начинаем новую.