Skip to content

vityaman-edu/algocont

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Проект для решения контестов по алгоритмам

Запуск проекта

Необходимо установить официальный пакет IDE VSCode от Microsoft. Также вам понадобится установленный Docker.

Установите плагин VSCode: ms-vscode-remote.remote-containers.

Нажать сочетание клавиш CLTR + SHIFT + P, в строке поиска ввести Dev Containers: Reopen in Container и нажать клавишу Enter.

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

Запустить "отладку файла" можно, открыв его и нажав F5.

О тестирующей системе

Мы используем платформу Яндекс.Контест. При отправке файла с исходным кодом в несколько этапов происходит сборка исполняемого файла.

Форматирование

Сперва будет проверено соответствие вашего кода принятому форматированию с помощью утилиты clang-format. При выявлении проблемы, решение упадет со статусом CE.

Код должен соответствовать файлу конфигурации .clang-format.

Стиль кода

На данный момент у нас не получилось наладить запуск clang-tidy в Яндекс.Контесте, поэтому стиль кода не будет проверяться.

Однако, мы добавили конфигурационный файл .clang-tidy. Языковой сервер Clangd подхватит его и будет выдавать вам полезные замечания не только по стилю наименования переменных, но и по использованию некоторых лучших практик.

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

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

Параметры компиляции

Ваше решение будет собрано со флагами компиляции CXXFLAGS_RELEASE, определение которых вы найдете в файле ci/build.sh.

Так как будет включен максимальный уровень оптимизаций, вы можете не бояться использовать zero-cost абстракции языка. Благодаря -DNDEBUG вы свободно можете размещать код для отладочной печати или проверки инвариантов между директивами #ifdef and #ifndef, а также использовать макрос assert.

На малых тестах будет запускаться решение собранное под санитайзерами.

CXXFLAGS_ASAN="$CXXFLAGS_RELEASE -fsanitize=address,undefined,leak"

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

Рабочее окружение

Для решения задач мы рекомендуем использовать официальный пакет IDE VSCode cо следующими плагинами:

Собирать решение рекомендуется с заданными флагами при помощи компилятора clang.

Clangd предоставит вам возможности форматирования кода, предоставит подсказки, навигацию, рефакторинги и другое. Однако вам следует отключить C_Cpp.intelliSenseEngine от Microsoft, чтобы он не конфликтовал с clangd - скорее всего, VSCode предложит вам это сделать.

Для комфортной работы можете описать простую систему сборки с использованием утилиты Make или Shell скриптов. Можно автоматизировать не тольку сборку исполняемого файла, но и запуск тестов, что позволит вам сэкономить время и нервы.

И обязательно настройте компиляцию файла и запуск отладчика по кнопке в VSCode - оно того стоит.

Полезные советы

Если ваше решение не проходит по времени, попробуйте сгенерировать большой тест, запустить решение под профилировщиком и построить Flame Graph - он может помочь диагностировать проблему. Собирая решение со включенными оптимизациями, добавьте флаг -fno-omit-frame-pointer. Большой тест может быть удобно генерировать скриптом на Python.

Если ваше решение выдает неверный ответ или падает на одном из тестов, можете попробовать применить технику тестирования программы случайными данными. Для этого можете редактировать код функции main так, чтобы при поданом аргументе --testing запускать тестирование, а иначе код, читающий данные из стандартного ввода.

Удачи!