Проверка xml по xsd на Python через lxml

В библиотеке lxml содержаться функции для проверки xml по xsd. Пример кода:

Метод validate возвращает False если xml не проходит проверку по схеме. Свойство error_log содержит список несоответствий xml схеме из xsd.

Notepad++ XML Tools, проверка xml по xsd

Описание работы с плагином для Notepad++ XML Tools:

  • Установка
  • Автоматическая првоерка XML
  • Форматирование XML
  • Проверка XML по XSD

Установка XML Tools

Заходим в Управление плагинами:

Управление плагинами Notepad++

Выбираем XML Tools и нажимаем установить:

Установка XML Tools в Notepad++

Читать далее Notepad++ XML Tools, проверка xml по xsd

Задача Bitwise AND

В задаче Bitwise AND дано множество чисел \(S = \{1, 2, 3, ..., N\}\), нужно найти два числа \(A\) и \(B\) такие что значение \(A \& B\) (побитовый оператор И) наибольшее, но меньше заданного \(K\). Вывести наибольшее возможное \(A \& B\).

Ограничения:

  • \(2 \leq N \leq 10^3\)
  • \(2 \leq K \leq N\)

Решение

Решение с перебором рабочее, но не проходит по скорости: всего пар \(N * (N - 1)\), сложность получается \(O(n^2)\).

У этой задачи есть решение за константное время. Предположим число \(K\) нечётное. Это значит что в побитовой записи справа у него находится единица:

\(11_{10} = 1011_2\)

Рассмотрим \(K-1\), в двоичной записи все его цифры совпадают с \(K\) кроме последней в которой находится 0:

\(10_{10} = 1010_2\)

Читать далее Задача Bitwise AND

Использование Saved messages в Telegram

Saved messages Telegram

Saved messages — особый контакт Telegram. Некоторые варианты его использования:

  • Перенос файлов между устройствами
  • TODO-списки, задачи
  • Хранение ссылок, контактов

Первый пункт неинтересен, а второй и третий разберём в соответствии с Джедайскими техниками (Лабиринт).

Задачи

Полностью вести список задач в Saved messages неудобно, Telegram для этого не предназначен. Следовательно, если задачи скапливаются в Telegram то это уже второй (энный) список.

Главный принцип списка задач — список задач должен быть один. Накапливать задачи в Telegram нельзя. Остаётся рассматривать Saved messages как один из источников входящих, так же как почту.

Когда нет возможности записать задачу в основной список задач, удобно быстро отправить сообщение в Telegram. Чужие сообщения можно даже просто пересылать в Saved messages. Но отношение к ним должно быть как к входящим, а не как к задачам. Сообщения разбираются по обычным принципам и переносятся либо в список задач либо в информацию.

Информация

Ссылки и контакты относятся к кускам информации. Главный принцип её хранения — простой и быстрой поиск информации когда она нужна. Обычно, для этого информация хранится в структурированном виде. По проектам, областям, файлам или любым другим способом.

Как и для задач, Telegram не предоставляет возможностей для эффективного хранения информации. Поэтому работа с такими сообщениями такая же как с задачами: при разборе входящих куски информации из Saved messages сортируются и помещаются в наиболее подходящие места, в идеальном случае, в одну или несколько баз знаний.

Дневник 29

Книга: Дневник 29 (Лабиринт).
Автор: Дмитрис Чассапакис.
Издательство: МИФ, 2019.

Книга с головоломками. Каждый разворот книги содержит одну загадку. Решение — это код, введя его на специальном сайте, появляется подсказка для следующих загадок.

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

В книге 63 головоломки, решаются за несколько часов. Время сильно зависит от количества разгадывающих и использования подсказок.

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

Последние страницы содержат QR-коды со ссылками на англоязычный форум подсказок оригинальной книги и ссылка на обсуждение в VK про русифицированную версию. Также в группе МИФ есть альбом с подсказками.

В описание на сайтах книгу сравнивают с квест-румами. Они действительно сравнимы по времени и получаемым ощущениям. А стоимость книги к несколько раз ниже.

Наибольший общий делитель двух чисел Фибоначчи

Задача

Найти последнюю цифру наибольшего общего делителя двух чисел Фибоначчи.

Решение

Сразу отклоняем вычисление чисел Фибоначчи и нахождение их НОД, так как числа могу быть очень большие.

Воспользуемся свойством чисел Фибоначчи:

Наибольший общий делитель двух чисел Фибоначчи равен числу Фибоначчи с индексом, равным наибольшему общему делителю индексов.

\(НОД(F_n, F_m) = F_{НОД(n, m)}\)

Учитвая это вычисляем индекс числа Фибоначчи который одновременно является и нужным НОД, а затем находим его последнее число при помощи периода Пизано.

Сложность

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

Код

На вход подаются два индекса чисел Фибоначчи.

Exercism.io

На сайте exercism.io организовано обучение языкам программирования. Лучше всего сайт подойдёт тем кто уже знает один ЯП и хочет изучить новый. Для обучения доступно 52 языка, наибольшее количество задач по C#, Python и JavaScript.

Exercism бесплатный, работает благодаря сообществу. Пользователи делятся на учеников и наставников. Ученики выполняют задачи, а наставники проводят code review и дают советы. Комментарии от наставников полезные и продуманные, примеры я приложил ниже.

Выполнение задач

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

Выполняем задание, проверяем что решение проходит тесты. Выполнять задачи и проходить тесты можно в любой IDE, система на неё не завязана.

Выполняем ещё одну консольную команду и задача отправляется на проверку. Длительность проверки зависит от загруженности проверяющих на выбранном языковом треке. На треке Python я ждал проверки от дня до 3х недель. Первый комментарий от наставника:

Наставники уделяют особое внимание стилю и адекватности применяемых конструкций:

Бывают и более сложные замечания:

После исправления замечаний, решение снова отправляется на проверку. И так пока наставник не одобрит решение. Затем открывается следующая задача.

Такой принцип применяется к задачам из основного трека по языку. Кроме них есть ещё дополнительные задачи. Code review от наставника в них не обязателен, зато можно посмотреть решения других участников. В треке Python 18 основных задач и около 100 дополнительных.

Python. Сортировка

Python содержит несколько различных способов сортировки данных. Встроенный метод списков list.sort() изменяет вызвавший его список. Встроенная функция sorted() создаёт новый сортированный список из итерируемого объекта.

Простая сортировка

Чтобы отсортировать список по возрастанию вызовите функцию sorted(). Функция вернёт новый сортированный список:

Метод list.sort() сортирует список у которого вызван и возвращает None. Если исходный список больше не нужен это может быть немного эффективнее:

Метод list.sort() определён только для списков. В отличи от него, функция sorted() работает с любыми перечисляемыми объектами:

Читать далее Python. Сортировка

Встроенные функции Python для ввода и вывода (print, input)

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

Печатает объекты в текстовый поток.

Именованный параметр sep задаёт разделитель между элементами. Если параметр не установлен или равен None используется пробел.

Именованный параметр end задаёт текст печатаемый к конце. Если параметр не установлен или равен None используется перевод строки.

Все не именованные аргументы преобразуются в строки функцией str():

print() без аргументов печатает end — перевод строки.

Аргумент file должен быть объектом с методом write(string). Если аргумент не задан или равен None то используется sys.stdout.

Обычно выходной поток, указанный в file, буферизуется. Если аргумент flush установлен в True, то после каждой записи данные записываются принудительно.

input([prompt])

Если задан аргумент prompt, он будет выведен в стандартный поток вывода без перевода на новую строку. Затем функция читает строку из входного потока, преобразовывает её в строку, удаляет завершающий перевод строки и возвращает результат. Если достигнут конц потока (EOF) выбрасывается исключение EOFError.

Ссылки

Встроенные функции Python для работы с коллекциями (sorted, filter, zip, reversed, len)

sorted()

Возвращает новый сортированный список (list) из элементов iterable.

Порядок элементов изменяется аргументом key. Переданная в key функция применяется к каждому элементу. Результат функции используется для определения порядка элементов:

Логический аргумент reverse задаёт обратную сортировку:

Описание других способов сортировки.

Читать далее Встроенные функции Python для работы с коллекциями (sorted, filter, zip, reversed, len)